የKaggle 'Pandas' የስልጠና ኮርስ ይዘት ማጠቃለያ (1) - ትምህርት 1-3
ዳታን ለማጽዳትና ለማቀናበር የPandas ላይብረሪን እንዴት መጠቀም እንደሚቻል እንደምን እንዘርዝራለን። የKaggle 'Pandas' ነፃ ኮርስ ይዘትን እናጠቃልላለን፣ አስፈላጊ በሆኑ ቦታዎችም ተጨማሪ ማብራሪያ እንጨምራለን። ይህ ፖስት የኮርሱን ኋለኛ ክፍል(Lesson 1-3) ይሸፍናል።
በካግል(Kaggle) የPandas ኮርስ ላይ ሲማር የተማርኩትን ይዘት እዚህ እያጠቃለልኩ እቀርባለሁ።
መጠኑ እጅግ ብዙ ስለሆነ በ2 ክፍሎች ከፍሌዋለሁ።
- ክፍል 1: ትምህርት 1-3 (ይህ ጽሑፍ)
- ክፍል 2: ትምህርት 4-6
ትምህርት 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]})
| Yes | No | |
|---|---|---|
| 0 | 50 | 131 |
| 1 | 21 | 2 |
የዳታፍሬም ኤንትሪዎች የግድ ቁጥሮች መሆን አያስፈልጋቸውም፤ የሚቀጥለው የጽሑፍ እሴቶችን(ተጠቃሚዎች የተዉትን ግምገማ) ያለው የዳታፍሬም ምሳሌ ነው።
1
pd.DataFrame({'Bob': ['I liked it.', 'It was awful.'], 'Sue': ['Pretty good.', 'Bland.']})
| Bob | Sue | |
|---|---|---|
| 0 | I liked it. | Pretty good. |
| 1 | It 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'])
| Bob | Sue | |
|---|---|---|
| Product A | I liked it. | Pretty good. |
| Product B | It 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 ደግሞ የኢንዴክስ መረጃን በመጠቀም ይሠራል። ብዙ ጊዜ በኢንዴክስ ውስጥም ትርጉም ያለው መረጃ ስለሚኖር፣ በብዙ ሁኔታዎች loc ከ iloc የበለጠ ቀላልና ቀጥተኛ ነው።
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() የበለጠ ተለዋዋጭ ስለሆኑ እና የበለጠ ውስብስብ ስራዎችን ማከናወን ስለሚችሉ፣ እነዚህን ሜተዶችም ማወቅ ጠቃሚ ነው።

