ልጥፍ

የKaggle 'Pandas' የስልጠና ኮርስ ይዘት ማጠቃለያ (1) - ትምህርት 1-3

ዳታን ለማጽዳትና ለማቀናበር የPandas ላይብረሪን እንዴት መጠቀም እንደሚቻል እንደምን እንዘርዝራለን። የKaggle 'Pandas' ነፃ ኮርስ ይዘትን እናጠቃልላለን፣ አስፈላጊ በሆኑ ቦታዎችም ተጨማሪ ማብራሪያ እንጨምራለን። ይህ ፖስት የኮርሱን ኋለኛ ክፍል(Lesson 1-3) ይሸፍናል።

የKaggle 'Pandas' የስልጠና ኮርስ ይዘት ማጠቃለያ (1) - ትምህርት 1-3

በካግል(Kaggle) የPandas ኮርስ ላይ ሲማር የተማርኩትን ይዘት እዚህ እያጠቃለልኩ እቀርባለሁ።
መጠኑ እጅግ ብዙ ስለሆነ በ2 ክፍሎች ከፍሌዋለሁ።

የማጠናቀቂያ ማረጋገጫ

ትምህርት 1. መፍጠር፣ ማንበብ እና መጻፍ

ፓንዳስ(Pandas) ማስመጣት

1
import pandas as pd

በፓንዳስ(Pandas) ውስጥ ዳታፍሬም(DataFrame) እና ሲሪዝ(Series) የተባሉ 2 አስፈላጊ ኦብጀክቶች(objects) አሉ።

ዳታፍሬም

ዳታፍሬም(DataFrame) እንደ ሰንጠረዥ ወይም ማትሪክስ(matrix) ሊታሰብ ይችላል። እሱ ከነፃ የሆኑ ኤንትሪዎች(entries) የተሰራ ማትሪክስ ሲሆን፣ እያንዳንዱ ኤንትሪ የተወሰነ እሴት(value) ይይዛል እና አንድ ረድፍ(row) ወይም ሬኮርድ(record) እንዲሁም አንድ አምድ(column) ጋር ይዛመዳል።

1
pd.DataFrame({'Yes': [50, 21], 'No': [131, 2]})
 YesNo
050131
1212

የዳታፍሬም ኤንትሪዎች የግድ ቁጥሮች መሆን አያስፈልጋቸውም፤ የሚቀጥለው የጽሑፍ እሴቶችን(ተጠቃሚዎች የተዉትን ግምገማ) ያለው የዳታፍሬም ምሳሌ ነው።

1
pd.DataFrame({'Bob': ['I liked it.', 'It was awful.'], 'Sue': ['Pretty good.', 'Bland.']})
 BobSue
0I liked it.Pretty good.
1It was awful.Bland.

የዳታፍሬም ኦብጀክትን ሲፈጥሩ pd.DataFrame() ኮንስትራክተር(constructor) ይጠቀማሉ፣ እና በፓይተን(Python) የዲክሽነሪ(dictionary) ሰነድ አጻጻፍ ይገልጹታል። በቁልፍ(key) ቦታ የአምድ ስሞችን፣ በእሴት(value) ቦታ ደግሞ ለመመዝገብ የሚፈለጉ ንጥሎች የያዙ ዝርዝሮች(list) ይገባሉ። ይህ አዲስ ዳታፍሬም ለማወጅ መደበኛው መንገድ ነው።

ዳታፍሬም ሲወጅ ለአምድ መለያዎች የአምዱን ስም ይሰጣሉ፤ ነገር ግን ለረድፍ መለያዎች በተለይ ካልገለጹ 0, 1, 2, … የሚሉ ኢንቲጀር(integer) እሴቶችን ይመድባል። ካስፈለገ የረድፍ መለያዎችን በእጅ መግለጽ ይቻላል። በዳታፍሬም ውስጥ የረድፍ መለያዎች ዝርዝርን ኢንዴክስ(Index) ብለው ይጠራሉ፣ እና በኮንስትራክተሩ ውስጥ ያለውን index ፓራሜተር(parameter) በመጠቀም እሴቱን ማዘጋጀት ይቻላል።

1
2
3
pd.DataFrame({'Bob': ['I liked it.', 'It was awful.'], 
              'Sue': ['Pretty good.', 'Bland.']},
             index=['Product A', 'Product B'])
 BobSue
Product AI liked it.Pretty good.
Product BIt was awful.Bland.

ሲሪዝ

ሲሪዝ(Series) ከዳታ እሴቶች የተሠራ ተከታታይ(sequence) ወይም ቬክተር(vector) ነው።

1
pd.Series([1, 2, 3, 4, 5])

ሲሪዝ በመሠረቱ እንደ ዳታፍሬም አንድ ነጠላ አምድ ነው። ስለዚህ በተመሳሳይ ኢንዴክስ መያዝ ይችላል፣ ልዩነቱ ግን ‘የአምድ ስም’ ፋንታ በቀላሉ ‘ስም’(name) ያለው መሆኑ ነው።

1
pd.Series([30, 35, 40], index=['12015 Sales', '12016 Sales', '12017 Sales'], name='Product A')
1
2
3
4
12015 Sales    30
12016 Sales    35
12017 Sales    40
Name: Product A, dtype: int64

ሲሪዝ እና ዳታፍሬም እርስ በርሳቸው በጣም ቅርብ ግንኙነት አላቸው። ዳታፍሬምን በቀላሉ እንደ ሲሪዞች ስብስብ ብለው ማሰብ ለመረዳት ይረዳል።

የዳታ ፋይል ማንበብ

ብዙ ጊዜ ዳታን በቀጥታ ከመጻፍ ይልቅ ቀድሞ ያለን ዳታ አምጥተን እንጠቀማለን። ዳታ በተለያዩ ቅርጸቶች(format) ሊቀመጥ ይችላል፣ ከሁሉ መሠረታዊው ግን CSV ፋይል ነው። የCSV ፋይል ይዘት ብዙውን ጊዜ ከታች እንዳለው ይመስላል።

Product A,Product B,Product C,
30,21,9,
35,34,1,
41,11,11

ይህም ማለት CSV ፋይል እያንዳንዱን እሴት በኮማ(comma) የሚለይ ሰንጠረዥ ነው። ስለዚህም ስሙ “Comma-Separated Values”, CSV ሆኗል።

የCSV ፋይል ቅርጸት ያለውን ዳታ ወደ ዳታፍሬም ለማስገባት pd.read_csv() ፋንክሽን(function) ይጠቀማሉ።

1
product_reviews = pd.read_csv("../input/product-reviews/example-data.csv")

የዳታፍሬሙን ቅርፅ shape ፕሮፐርቲ(property) በመጠቀም ማረጋገጥ ይችላሉ።

1
product_reviews.shape
1
(129971, 14)

ከላይ ያለው የምሳሌ ውጤት ያ ዳታፍሬም 129971 ሬኮርዶችን እና 14 አምዶችን እንደሚይዝ ያሳያል።

head() ሜተድ(method) በመጠቀም የዳታፍሬሙን የመጀመሪያ አምስት ረድፎች ማየት ይችላሉ።

1
product_reviews.head()

pd.read_csv() ፋንክሽኑ ከ30 በላይ ፓራሜተሮች አሉት። ለምሳሌ ሊጫን የሚፈለገው CSV ፋይል በራሱ ኢንዴክስን ካካተተ፣ በፓንዳስ በራሱ ኢንዴክስ እንዲያደርግ ከመተው ይልቅ index_col ፓራሜተሩን በመግለጽ ያ አምድ ኢንዴክስ እንዲሆን ማድረግ ይችላሉ።

1
product_reviews = pd.read_csv("../input/product-reviews/example-data.csv", index_col=0)

የዳታ ፋይል መጻፍ

to_csv() ሜተድ(method) በመጠቀም ዳታፍሬምን ወደ CSV ፋይል ማውጣት ይችላሉ። እንደሚከተለው ይጠቀሙበታል።

1
product_reviews.to_csv("../output/product-reviews/example-data.csv")

ትምህርት 2. ኢንዴክሲንግ፣ መምረጥ እና መመደብ

በፓንዳስ ዳታፍሬም ወይም ሲሪዝ ውስጥ የተወሰኑ እሴቶችን መምረጥ ማለት በማንኛውም የዳታ ሂደት ውስጥ እስካልተለፈ የማይቀር እርምጃ ስለሆነ፣ አስፈላጊ የዳታ ነጥቦችን በፍጥነትና በብቃት እንዴት መምረጥ እንደሚቻል በቅድሚያ መማር ያስፈልጋል።

የፓይተን መደበኛ መዳረሻዎች

መደበኛ የፓይተን ኦብጀክቶች በጣም ጥሩ የዳታ ኢንዴክሲንግ ዘዴዎችን ይሰጣሉ፣ እና ፓንዳስም እነዚህን ዘዴዎች በተመሳሳይ ሁኔታ ይሰጣል።

የኦብጀክት ባህሪ

በፓይተን ውስጥ የኦብጀክት ባህሪ እሴት(property) ወደዚያ ባህሪ ስም(attribute) በመጠቀም መድረስ ይቻላል። ለምሳሌ example_obj ኦብጀክት title የተባለ ባህሪ ካለው example_obj.title በማለት ሊጠራ ይችላል። በፓንዳስ ዳታፍሬም አምዶችም ላይ በተመሳሳይ ሁኔታ መድረስ ይቻላል።

1
reviews.country
1
2
3
4
5
6
0            Italy
1         Portugal
            ...   
129969      France
129970      France
Name: country, Length: 129971, dtype: object

የዲክሽነሪ ኢንዴክሲንግ

እንዲሁም በፓይተን የዲክሽነሪ ዳታ አይነት ላይ የኢንዴክሲንግ ኦፕሬተር([]) በመጠቀም በዲክሽነሪው ውስጥ ያሉ እሴቶችን ማግኘት ይቻላል። በፓንዳስ ዳታፍሬም አምዶችም ላይ በተመሳሳይ መንገድ መድረስ ይቻላል።

1
reviews['country']
1
2
3
4
5
6
0            Italy
1         Portugal
            ...   
129969      France
129970      France
Name: country, Length: 129971, dtype: object

በኦብጀክት ባህሪ መዳረሻ እና በዲክሽነሪ ኢንዴክሲንግ መዳረሻ ሁለቱም ትክክለኛ ናቸው፣ ግን የዲክሽነሪ ኢንዴክሲንግ ዘዴ እንደ ክፍት ቦታ(space) ያሉ ልዩ ቁምፊዎችን የያዙ የአምድ ስሞችንም ማስተናገድ መቻሉ ጥሩ ጥቅም አለው(e.g. reviews['country providence'] ይቻላል፣ ነገር ግን reviews.country providence እንደሚል መድረስ አይቻልም)።

እንዲሁ በተመረጠው የፓንዳስ ሲሪዝ ውስጥ ደግሞ እንደገና የኢንዴክሲንግ ኦፕሬተሩን በመጠቀም የግለሰብ እሴቶችን ማንበብ ይቻላል።

1
reviews['country'][0]
1
'Italy'

የፓንዳስ ልዩ መዳረሻዎች

ከላይ የተጠቀሱት የኢንዴክሲንግ ኦፕሬተር ወይም የኦብጀክት ባህሪ በመጠቀም የሚደረሰው መንገድ ከሌሎች የፓይተን ኢኮሲስተም ጋር በተፈጥሮ የሚስማማ ስለሆነ ጥሩ ነው፣ ነገር ግን ፓንዳስ ከዚህ በተጨማሪ የራሱ ልዩ መዳረሻዎች የሆኑ loc እና iloc ይሰጣል።

በኢንዴክስ ላይ የተመሰረተ ምርጫ

iloc በመጠቀም በኢንዴክስ ላይ የተመሰረተ ምርጫ(index-based selection) ማድረግ ይቻላል። በዳታው ውስጥ ያለውን ቦታ በኢንቲጀር ቁጥር በመግለጽ ይመርጣል።

ለምሳሌ፣ እንደሚከተለው የዳታፍሬሙን የመጀመሪያ ረድፍ መምረጥ ይችላሉ።

1
reviews.iloc[0]
1
2
3
4
5
6
country                                                    Italy
description    Aromas include tropical fruit, broom, brimston...
                                     ...                        
variety                                              White Blend
winery                                                   Nicosia
Name: 0, Length: 13, dtype: object

በአምድ ላይ አስቀድመው ከዚያ በኋላ ረድፍ የሚመርጡት መደበኛ የፓይተን መንገድ በተለየ፣ iloc በቅድሚያ ረድፍን ከዚያ በኋላ አምድን ይመርጣል። የዳታፍሬሙን የመጀመሪያ አምድ እንደሚከተለው መምረጥ ይቻላል።

1
reviews.iloc[:, 0]
1
2
3
4
5
6
0            Italy
1         Portugal
            ...   
129969      France
129970      France
Name: country, Length: 129971, dtype: object

ከላይ ባለው ምሳሌ : ኦፕሬተሩን በመጠቀም ሁሉንም ረድፎች መርጠን፣ ከዚያ በውስጡ የመጀመሪያውን አምድ መርጠናል። ከዚህ በፊት የመጀመሪያው አምድ ውስጥ ሁለተኛውን(1) እና ሶስተኛውን(2) ረድፎች መምረጥ ከፈለጉ እንዲህ ያድርጉ።

1
reviews.iloc[1:3, 0]
1
2
3
1    Portugal
2          US
Name: country, dtype: object

ወይም ዝርዝር(list) ማስተላለፍ ይችላሉ።

1
reviews.iloc[[1, 2], 0]
1
2
3
1    Portugal
2          US
Name: country, dtype: object

አሉታዊ ቁጥሮችን በመጠቀም ከመጨረሻ ጀምሮ ያለውን ዳታ ማምረጥም ይቻላል። የሚከተለው ምሳሌ የመጨረሻዎቹን 5 ረድፎች ይመርጣል።

1
reviews.iloc[-5:]

በመለያ ላይ የተመሰረተ ምርጫ

ሌላ መንገድ loc በመጠቀም በመለያ ላይ የተመሰረተ ምርጫ(label-based selection) ማድረግ ነው። በዚህ ጊዜ በዳታው ውስጥ ያለውን ቦታ ሳይሆን የኢንዴክሱን እሴት በመጠቀም ይመርጣል።

ለምሳሌ፣ ኢንዴክሱ 0 የሆነው ረድፍ ውስጥ ለ ‘country’ አምድ የሚዛመደውን ኤንትሪ እንደሚከተለው ማግኘት ይቻላል።

1
reviews.loc[0, 'country']
1
'Italy'

iloc የዳታሴቱን ኢንዴክስ እሴቶች ችላ ብሎ አንድ ትልቅ ማትሪክስ እንዳለ አድርጎ በቦታ ላይ ተመስርቶ የግለሰብ ኤንትሪዎችን ይደርሳል። በሌላ በኩል loc ደግሞ የኢንዴክስ መረጃን በመጠቀም ይሠራል። ብዙ ጊዜ በኢንዴክስ ውስጥም ትርጉም ያለው መረጃ ስለሚኖር፣ በብዙ ሁኔታዎች lociloc የበለጠ ቀላልና ቀጥተኛ ነው።

iloc እና loc በክልል መግለጫ የሚከተሉት ልዩነት

iloc የፓይተን መደበኛ ላይብረሪ ኢንዴክሲንግ ስርዓትን በትክክል ይከተላል፣ ስለዚህ 0:10 ማለት 0 እስከ 10 ሳይጨምር ያለውን ግማሽ ክፍት ክልል፣ ማለትም 0,...,9 ነው።

በሌላ በኩል loc ክልሉን እንደ ዝግ ክልል ስለሚያየው፣ 0:10 ማለት 0 እስከ 10 ጨምሮ፣ ማለትም 0,...,10 ነው።

ይህ ልዩነት የተደረገው ምክንያት loc ከኢንቲጀር በተጨማሪ ማንኛውንም መደበኛ የዳታ አይነት እንደ ኢንዴክስ መጠቀም ስለሚችል ነው። ለምሳሌ Apples, ..., Potatoes, ... የሚሉ የኢንዴክስ እሴቶች ያሉት ዳታፍሬም አለን እና ከዚህ ውስጥ በፊደል ቅደም ተከተል ‘Apples’ እስከ ‘Potatoes’ ያሉትን ምርቶች መምረጥ እንፈልጋለን እንበል። በፊደል ቅደም ተከተል s በኋላ t ስለሚመጣ፣ ማለትም ‘Potatoes’ በቀጥታ ቀጥሎ ሊመጣ የሚችለው የፊደል ጥምረት ‘Potatoet’ ስለሆነ፣ “‘Apples’ እስከ ‘Potatoet’ በፊት”(df.loc['Apples':'Potatoet']) ብለው ከመግለጽ ይልቅ በቀላሉ “‘Apples’ እስከ ‘Potatoes’”(df.loc['Apples':'Potatoes']) ብለው መግለጽ እጅግ የበለጠ ቀጥተኛ ነው። እንደዚህ ባሉ ከኢንቲጀር ውጭ የሆኑ ኢንዴክሶች ላይ ይህ ኋለኛው መንገድ ብዙ ጊዜ የበለጠ ተፈጥሯዊ ስለሆነ loc ይህንን አቀራረብ ይከተላል።

ከዚህ ውጭ ሌሎቹ የአሠራር መንገዶች በመሠረቱ አንድ ናቸው።

በግል እኔ በከፍ ቅደም የተደረደሩ ኢንቲጀር ኢንዴክሶች ባሉት ዳታሴቶች ውስጥ : ኦፕሬተሩን በመጠቀም ክልል ማስገለጽ ሲያስፈልግ ከዚህ ልዩነት የሚመጣ ግራ መጋባት ለመከላከል iloc እመርጣለሁ፤ ከዚያ ውጭ ግን በቀላሉ የሚገባ በመሆኑ loc እመርጣለሁ።

ኢንዴክስን ማስተካከል

ኢንዴክስን እንደ ፍላጎት ማስተካከልም ይቻላል። set_index() ሜተድ(method) በመጠቀም ከሚከተለው ምሳሌ እንደሚታየው በዳታሴቱ ውስጥ ያለ የተወሰነ አምድን አዲሱ ኢንዴክስ እንዲሆን መወሰን ይቻላል።

1
reviews.set_index("title")

በሁኔታ የተወሰነ ምርጫ

ከላይ የተገለጹት ዘዴዎች ዳታፍሬሙ ራሱ ያለውን መዋቅራዊ ባህሪ በመጠቀም ዳታን እንዴት ማቀናበርና መምረጥ እንደሚቻል ያሳያሉ። ነገር ግን ከዚያ በላይ በመሄድ የበለጠ ውስብስብ የሆኑ ሁኔታዎችን የሚያሟሉ ዳታዎችንም መምረጥ ይቻላል።

ለምሳሌ ስለ የወይን ምርቶች መረጃ የሚይዝ ዳታፍሬም አለን እና ከዚህ ውስጥ 90 ወይም ከዚያ በላይ ነጥብ ያገኙ የጣሊያን ወይኖችን ብቻ መምረጥ አለብን እንበል።

1
reviews.country == 'Italy'

ይህ የሁኔታ ገለጻ True/False ቡሊያን(boolean) እሴቶችን የያዘ ሲሪዝ ይመልሳል።

1
2
3
4
5
6
0          True
1         False
          ...  
129969    False
129970    False
Name: country, Length: 129971, dtype: bool

loc በመሠረቱ በመለያ ላይ የተመሰረተ ቢሆንም፣ ቡሊያን አሬይ(array) ወይም ማዛመድ የሚችል ቡሊያን ሲሪዝ እንደ ግቤት መቀበል ይችላል። ስለዚህ እንደሚከተለው የጣሊያን ወይን ዳታዎችን ብቻ መምረጥ ይቻላል።

1
reviews.loc[reviews.country == 'Italy']

ብዙ ሁኔታዎችን & ወይም | ኦፕሬተሮች በመጠቀም ማጣመር ይችላሉ። የጣሊያን እና 90 ወይም ከዚያ በላይ ነጥብ ያለው የወይን ዳታ ለመምረጥ እንዲህ ያድርጉ።

1
reviews.loc[(reviews.country == 'Italy') & (reviews.points >= 90)]

የጣሊያን ወይም 90 ወይም ከዚያ በላይ ነጥብ ያለው የወይን ዳታ ደግሞ እንደሚከተለው መምረጥ ይቻላል።

1
reviews.loc[(reviews.country == 'Italy') | (reviews.points >= 90)]

በተጨማሪም ፓንዳስ ጥቂት አብሮ የተሰጡ የሁኔታ መምረጫዎችን ያለው ሲሆን፣ ከእነሱ ውስጥ በተለይ isin እና isnull/notnull ናቸው።

isin ዝርዝር ውስጥ ካሉ እሴቶች አንዱን ይይዛልን ወይስ አይይዝምን በሚል ቡሊያን(True ወይም False) ማስክ(mask) ሲሪዝ ይመልሳል፣ ይህን ተጠቅመውም ዳታ መምረጥ ይችላሉ። ለምሳሌ እንደሚከተለው የጣሊያን ወይም የፈረንሳይ ወይን ዳታዎችን መምረጥ ይችላሉ።

1
reviews.loc[reviews.country.isin(['Italy', 'France'])]

isna/notna የጎደለ እሴት(NaN) ያላቸውን ወይም የሌላቸውን ዳታዎች ለመምረጥ ይጠቅማሉ። ለምሳሌ እንደሚከተለው የዋጋ ዳታ ያልጎደለባቸውን የወይን ዳታዎች ብቻ መምረጥ ይችላሉ።

1
reviews.loc[reviews.price.notna()]

ለማስታወሻ፣ በመጀመሪያው የKaggle ኮርስ ውስጥ ያልተጠቀሰ ነገር ቢሆንም ilocም ቡሊያን አሬይ(array) መቀበል ይችላል። ግን loc እንደሚያደርገው ሲሪዝ ሳይሆን አሬይ ብቻ ስለሚደግፍ፣ ከላይ እንዳለው ዓይነት መተግበሪያ ማድረግ አስቸጋሪ ነው።

የዳታ መመደብ

ለዳታፍሬም አዲስ ዳታ መመደብ ወይም ያለውን መተካትም ይቻላል።

1
2
reviews['critic'] = 'everyone'
reviews['critic']
1
2
3
4
5
6
0         everyone
1         everyone
            ...   
129969    everyone
129970    everyone
Name: critic, Length: 129971, dtype: object
1
2
reviews['index_backwards'] = range(len(reviews), 0, -1)
reviews['index_backwards']
1
2
3
4
5
6
0         129971
1         129970
           ...  
129969         2
129970         1
Name: index_backwards, Length: 129971, dtype: int64

ትምህርት 3. የማጠቃለያ ፋንክሽኖች እና ማፕ(Maps)

የዳታ አጠቃላይ ሁኔታን ማየት

describe() ሜተድ(method) ለተሰጠው አምድ ከፍተኛ ደረጃ አጠቃላይ ማጠቃለያ ይሰጣል።

1
reviews.points.describe()
1
2
3
4
5
6
count    129971.000000
mean         88.447138
             ...      
75%          91.000000
max         100.000000
Name: points, Length: 8, dtype: float64

describe() ሜተድ ውጤት እንደ ግቤቱ የዳታ አይነት ይለያያል። ቁጥራዊ ዳታ ሳይሆን የጽሑፍ ዳታ ሲሆን እንደሚከተለው ውጤት ይመልሳል።

1
reviews.taster_name.describe()
1
2
3
4
5
count         103727
unique            19
top       Roger Voss
freq           25514
Name: taster_name, dtype: object

ወይም የሚፈልጉትን የተወሰነ ስታቲስቲክስ(statistics) ብቻ ማግኘት ይችላሉ።

1
reviews.points.mean()
1
88.44713820775404
1
reviews.taster_name.unique()
1
2
3
4
5
6
7
array(['Kerin O’Keefe', 'Roger Voss', 'Paul Gregutt',
       'Alexander Peartree', 'Michael Schachner', 'Anna Lee C. Iijima',
       'Virginie Boone', 'Matt Kettmann', nan, 'Sean P. Sullivan',
       'Jim Gordon', 'Joe Czerwinski', 'Anne Krebiehl\xa0MW',
       'Lauren Buzzeo', 'Mike DeSimone', 'Jeff Jenssen',
       'Susan Kostrzewa', 'Carrie Dykes', 'Fiona Adams',
       'Christina Pickard'], dtype=object)

በዳታፍሬም ውስጥ እያንዳንዱ ልዩ እሴት ስንት ጊዜ እንደታየ ማወቅ ከፈለጉ value_counts() ሜተድ(method) መጠቀም ይችላሉ።

1
reviews.taster_name.value_counts()
1
2
3
4
5
6
Roger Voss           25514
Michael Schachner    15134
                     ...  
Fiona Adams             27
Christina Pickard        6
Name: taster_name, Length: 19, dtype: int64

ማፕ(Maps)

ማፕ(map) የሚለው ቃል ከሒሳብ የተወሰደ ሲሆን፣ አንድ ስብስብን ከሌላ ስብስብ ጋር የሚያዛምድ ፋንክሽን ማለት ነው። በዳታ ሳይንስ ውስጥ ብዙ ጊዜ የተሰጠውን ዳታ ወደ ሌላ የአቀራረብ ቅርጽ መቀየር ያስፈልጋል፣ እና እንደዚህ ያሉ ስራዎች ሲደረጉ ማፖችን ስለሚጠቀሙ በጣም አስፈላጊ ናቸው።

በተለምዶ ሁለት ሜተዶችን ብዙ ጊዜ እንጠቀማለን።

Series.map() ሜተድ(method) አንድ እሴት ወደ ሌላ ነጠላ እሴት የሚቀይር ፋንክሽን እንደ ግቤት ይቀበላል፣ እና ያን ፋንክሽን በተሰጠው ሲሪዝ ውስጥ ባሉ ሁሉም እሴቶች ላይ በጅምላ ከፈጸመ በኋላ አዲስ ሲሪዝ ይመልሳል። ለምሳሌ በወይን ነጥብ ዳታ ላይ በጅምላ የአማካይ እሴቱን ቀንሰን ልዩነት(deviation) ማግኘት ከፈለግን እንዲህ ማድረግ እንችላለን።

1
2
review_points_mean = reviews.points.mean()
reviews.points.map(lambda p: p - review_points_mean)
1
2
3
4
5
6
0        -1.447138
1        -1.447138
            ...   
129969    1.552862
129970    1.552862
Name: points, Length: 129971, dtype: float64

DataFrame.apply() ሜተድ(method) በእያንዳንዱ ረድፍ ላይ የተበጀ ፋንክሽን በመጠራት በመላው ዳታፍሬም ላይ ለውጥ ማድረግ ሲፈልጉ ይጠቅማል።

1
2
3
4
5
def remean_points(row):
    row.points = row.points - review_points_mean
    return row

reviews.apply(remean_points, axis='columns')

apply() ሜተዱን axis='index' ፓራሜተር ጋር በመጠራት በእያንዳንዱ ረድፍ ሳይሆን በእያንዳንዱ አምድ ላይ ፋንክሽኑን መፈጸም ይችላሉ።

Series.map() እና DataFrame.apply() እያንዳንዳቸው አዲስ የተቀየረ ሲሪዝ እና ዳታፍሬም ይመልሳሉ፤ በመጀመሪያው ዳታ ላይ ግን ምንም አይነት ለውጥ አያደርጉም።

ሜተድSeries.map()DataFrame.apply()
የሚተገበርበት ነገርሲሪዝዳታፍሬም
የሚተገበርበት ክፍልበግለሰብ እሴት ደረጃ ይተገበራል
(ሲሪዝን የአምድ ቬክተር(column vector) ብለን ካየነው በረድፍ ደረጃ ይተገበራል)
በመሠረቱ በረድፍ ደረጃ ይተገበራል
አማራጭ ሲገለጽ በአምድ ደረጃ ላይም ሊተገበር ይችላል

ለማስታወሻ Series.apply() እና DataFrame.map() ደግሞ አሉ።

  • Series.apply():
    • by_row='compat'(ነባሪ): ከ Series.map() ጋር በተመሳሳይ ሁኔታ ይሠራል
    • by_row=False: ሙሉ ሲሪዙን በአንድ ጊዜ ለፋንክሽኑ ግቤት ያስተላልፋል(axis='index' ተብሎ ሲገለጽ DataFrame.apply() የሚሠራበትን መንገድ ይመስላል)
  • DataFrame.map(): በዳታፍሬም ውስጥ ባሉ የግለሰብ እሴቶች ላይ ፋንክሽንን ይተገብራል(ዒላማው ሲሪዝ ሳይሆን ዳታፍሬም መሆኑን ካስቀረን፣ ከ Series.map() ጋር ተመሳሳይ ነው)

በእውነቱ ፓንዳስ በራሱ ብዙ ጊዜ የሚጠቀሙ ማፖችን ይደግፋል። ቀደም ብለን ያየነው ምሳሌ በሚከተለው እጅግ ቀላል ኮድም ሊተገበር ይችላል፣ በዚህ ጊዜም ፓንዳስ ዓላማውን በመረዳት በትክክል ይሠራል።

1
2
review_points_mean = reviews.points.mean()
reviews.points - review_points_mean
1
2
3
4
5
6
0        -1.447138
1        -1.447138
            ...   
129969    1.552862
129970    1.552862
Name: points, Length: 129971, dtype: float64

ከዚህም በላይ፣ ፓንዳስ ርዝመታቸው አንድ የሆኑ ሲሪዞች መካከል ኦፕሬሽኖችን ይደግፋል። በወይን ዳታ ምሳሌው ውስጥ የምርት አገርና የምርት ክልል መረጃን እንደሚከተለው በጽሑፍ ማዋሃድም ይቻላል።

1
reviews.country + " - " + reviews.region_1
1
2
3
4
5
6
0            Italy - Etna
1                     NaN
               ...       
129969    France - Alsace
129970    France - Alsace
Length: 129971, dtype: object

እነዚህ ኦፕሬሽኖች በፓንዳስ ውስጥ የተገነቡ የስሌት ፍጥነት ማሻሻያ ዘዴዎችን ስለሚጠቀሙ፣ ከ map() ወይም apply() ሜተዶች የበለጠ ፈጣን ናቸው፤ እንዲሁም ፓንዳስ ለሁሉም መደበኛ የፓይተን ኦፕሬተሮች(>, <, == ወዘተ) በዚህ ዓይነት መንገድ መሥራት ይችላል። ቢሆንም map() እና apply() የበለጠ ተለዋዋጭ ስለሆኑ እና የበለጠ ውስብስብ ስራዎችን ማከናወን ስለሚችሉ፣ እነዚህን ሜተዶችም ማወቅ ጠቃሚ ነው።

ይህ ልጥፍ በ CC BY-NC 4.0 ፈቃድ ስር ነው።