Makala

Muhtasari wa maudhui ya kozi ya Kaggle 'Pandas' (1) - Somo la 1-3

Muhtasari wa kutumia Pandas kusafisha na kuchakata data. Chapisho hili linafupisha sehemu ya baadaye ya kozi ya wazi ya Kaggle 'Pandas' (Somo la 1-3).

Muhtasari wa maudhui ya kozi ya Kaggle 'Pandas' (1) - Somo la 1-3

Hapa ninaweka muhtasari wa yale niliyoyasoma kupitia kozi ya Pandas ya Kaggle.
Kwa kuwa maudhui ni mengi kiasi, nimeyagawa katika sehemu 2.

Cheti cha Kukamilisha

Somo la 1. Kuunda, Kusoma na Kuandika

Kuingiza Pandas

1
import pandas as pd

Katika Pandas kuna vitu viwili muhimu vya msingi vinavyoitwa fremu ya data (DataFrame) na mfululizo (Series).

Fremu ya data

Fremu ya data (DataFrame) inaweza kufikiriwa kama jedwali au matrisi. Inaundwa kama matrisi ya vipengele (entries) vilivyo huru, ambapo kila kipengele kina thamani (value) fulani na hulingana na safu (row) au rekodi (record) moja pamoja na kolamu (column) moja.

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

Vipengele vya fremu ya data si lazima viwe vya namba tu; mfano ufuatao ni fremu ya data yenye thamani za maandishi (maoni yaliyoachwa na watumiaji).

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

Unapounda kitu cha fremu ya data, hutumia konstrakta pd.DataFrame() na kuitangaza kwa sintaksia ya kamusi (dictionary) ya Python. Kwenye key huweka jina la kolamu, na kwenye value huweka orodha (list) ya vipengele vya kuandikwa. Hii ndiyo njia ya kawaida ya kutangaza fremu mpya ya data.

Unapotangaza fremu ya data, lebo za kolamu hupewa majina ya kolamu husika, lakini lebo za safu, usipozibainisha kando, hupewa nambari kamili 0, 1, 2, … . Ikihitajika, unaweza kuzibainisha lebo za safu kwa mkono. Kwenye fremu ya data, orodha ya lebo za safu huitwa indeksi (Index), na unaweza kuweka thamani zake kwa kutumia kigezo cha index cha konstrakta.

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.

Mfululizo

Mfululizo (Series) ni mfuatano wa thamani za data au vekta.

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

Kimsingi, mfululizo ni sawa na kolamu moja ya fremu ya data. Kwa hiyo, vivyo hivyo unaweza kuweka indeksi, ila badala ya “jina la kolamu” huwa na “jina” tu (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

Mfululizo na fremu ya data vina uhusiano wa karibu sana. Husaidia kuelewa ukichukulia fremu ya data kuwa mkusanyiko tu wa misururu.

Kusoma faili za data

Mara nyingi, badala ya kuandika data moja kwa moja, huleta data iliyopo tayari na kuitumia. Data inaweza kuhifadhiwa katika miundo mbalimbali, na aina ya msingi zaidi ni faili ya CSV. Yaliyomo ndani ya faili ya CSV kwa kawaida huonekana kama yafuatayo.

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

Yaani, faili ya CSV ni jedwali linalotenganisha kila thamani kwa koma (comma). Ndiyo maana jina lake ni “Comma-Separated Values”, CSV.

Unapopakia data ya muundo wa faili ya CSV kama fremu ya data, hutumia functshi ya pd.read_csv().

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

Unaweza kukagua umbo la fremu ya data kwa kutumia sifa ya shape.

1
product_reviews.shape
1
(129971, 14)

Matokeo ya mfano hapo juu yanamaanisha kuwa fremu hiyo ya data ina rekodi 129971 na kolamu 14.

Unaweza kuona safu tano za kwanza za fremu ya data kwa kutumia mbinu ya head().

1
product_reviews.head()

Functshi ya pd.read_csv() ina zaidi ya vigezo 30. Kwa mfano, ikiwa faili ya CSV unayotaka kuipakia tayari ina indeksi yake, unaweza kuweka thamani ya kigezo cha index_col ili Pandas itumie kolamu hiyo kama indeksi badala ya kutengeneza indeksi kiotomatiki.

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

Kuandika faili za data

Ukitumia mbinu ya to_csv(), unaweza kuhamisha fremu ya data kwenda kwenye faili ya CSV. Hutumika kama ifuatavyo.

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

Somo la 2. Uwekaji Faharisi, Uteuzi & Ugawaji

Kuchagua thamani maalum za kutumia katika fremu ya data au mfululizo wa Pandas ni hatua inayopitiwa na karibu kazi zote za uchakataji wa data, kwa hiyo ni muhimu kujifunza kwanza jinsi ya kuchagua pointi za data zinazohitajika haraka na kwa ufanisi.

Vifikiaji asilia vya Python

Vitu asilia vya Python hutoa njia bora za kuweka faharisi za data, na Pandas pia hutoa njia hizo hizo.

Sifa za kitu

Katika Python, unaweza kufikia thamani ya sifa (property) ya kitu kwa jina la sifa hiyo (attribute). Kwa mfano, kama kitu example_obj kina sifa ya title, unaweza kuiita kwa example_obj.title. Vivyo hivyo unaweza kufikia kolamu za fremu ya data ya Pandas.

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

Uwekaji faharisi wa kamusi

Pia, kwa aina ya data ya kamusi (dictionary) katika Python, unaweza kufikia thamani ndani ya kamusi kwa kutumia opereta wa uwekaji faharisi ([]). Vivyo hivyo unaweza kufikia kolamu za fremu ya data ya Pandas kwa njia hiyo.

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

Njia zote mbili, ya kufikia kwa sifa ya kitu na ya kuweka faharisi kama kamusi, ni halali; lakini njia ya uwekaji faharisi wa kamusi ina faida ya kushughulikia pia majina ya kolamu yenye alama maalum kama nafasi tupu (k.m. reviews['country providence'] linawezekana, lakini ufikiaji kama reviews.country providence hauwezekani).

Hata ndani ya mfululizo wa Pandas uliouchagua kwa njia hiyo, unaweza tena kutumia opereta wa uwekaji faharisi kusoma thamani ya mtu mmoja mmoja.

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

Vifikiaji maalum vya Pandas

Ufikiaji kupitia sifa ya kitu au opereta wa uwekaji faharisi uliotajwa hapo juu ni mzuri kwa sababu unaendana kiasili na ekolojia nyingine ya Python, lakini Pandas pia hutoa vifikiaji vyake maalum, yaani loc na iloc.

Uteuzi unaotegemea indeksi

Ukitumia iloc, unaweza kufanya uteuzi unaotegemea indeksi (index-based selection). Huchagua data kwa kubainisha nafasi ndani ya data kwa nambari kamili.

Kwa mfano, unaweza kuchagua safu ya kwanza ya fremu ya data kama ifuatavyo.

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

Tofauti na njia ya asili ya Python ambayo huchagua kolamu kwanza kisha safu, iloc huchagua safu kwanza kisha kolamu. Kolamu ya kwanza ya fremu ya data inaweza kuchaguliwa kama ifuatavyo.

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

Katika mfano hapo juu, tulitumia opereta : kuchagua safu zote, kisha tukachagua kolamu ya kwanza ndani yake. Ikiwa unataka kuchagua safu ya pili (1) na ya tatu (2) ya kolamu ya kwanza, unaweza kufanya hivi.

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

Au unaweza pia kupitisha orodha.

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

Unaweza pia kutumia nambari hasi kuchagua data kuanzia mwisho. Mfano ufuatao huchagua safu 5 za mwisho za data.

1
reviews.iloc[-5:]

Uteuzi unaotegemea lebo

Njia nyingine ni kutumia loc kufanya uteuzi unaotegemea lebo (label-based selection). Katika hali hii, huchagua kwa kutumia thamani ya indeksi badala ya nafasi ndani ya data.

Kwa mfano, unaweza kupata kipengele kinacholingana na kolamu ya ‘country’ katika safu yenye thamani ya indeksi 0 kama ifuatavyo.

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

iloc hupuuza thamani za indeksi za seti ya data na kuichukulia kama matrisi moja kubwa, hivyo hufikia vipengele binafsi kwa kutegemea nafasi. Kwa upande mwingine, loc hufanya kazi kwa kutumia taarifa za indeksi. Kwa kuwa mara nyingi indeksi nayo huwa na taarifa zenye maana, loc huwa ya kueleweka zaidi kuliko iloc katika hali nyingi.

Tofauti ya namna iloc na loc zinavyobainisha vipindi

iloc hutumia mfumo wa uwekaji faharisi wa maktaba ya kawaida ya Python bila kubadilika, na kwa hiyo 0:10 humaanisha kipindi nusu-wazi cha 0 hadi chini ya 10, yaani 0,...,9.

Kwa upande mwingine, loc hutambua kipindi kama kilichofungwa, kwa hiyo 0:10 humaanisha 0 hadi 10 ikiwemo, yaani 0,...,10.

Sababu ya tofauti hii ni kwamba loc inaweza kutumia si nambari kamili tu bali pia aina zote za kawaida za data kama indeksi. Kwa mfano, fikiria kuna fremu ya data yenye thamani za indeksi kama Apples, ..., Potatoes, ..., na hapa unahitaji kuchagua mazao yaliyo katika wigo wa kialfabeti kuanzia ‘Apples’ hadi ‘Potatoes’. Kwa kuwa baada ya herufi s huja t, mchanganyiko wa herufi unaoweza kuja mara moja baada ya ‘Potatoes’ ungekuwa ‘Potatoet’, hivyo badala ya kubainisha “kutoka 'Apples' hadi kabla ya 'Potatoet'” (df.loc['Apples':'Potatoet']), ni rahisi zaidi na ya moja kwa moja kubainisha tu “kutoka 'Apples' hadi 'Potatoes'” (df.loc['Apples':'Potatoes']). Kwa namna hii, kwa indeksi zinazotumia aina za data zisizo nambari kamili, njia ya pili huwa ya kueleweka zaidi, na ndiyo maana loc hufuata mtindo huo.

Mbali na hilo, tabia zilizobaki kimsingi ni zilezile.

Binafsi, ninapohitaji kubainisha wigo kwa kutumia opereta : katika seti ya data yenye indeksi za nambari kamili zilizopangwa kwa mpangilio wa kupanda, napendelea iloc ili kuepuka mkanganyiko unaotokana na tofauti hiyo ya namna ya kubainisha wigo; katika hali nyingine, hupendelea loc kwa kuwa ni ya moja kwa moja zaidi.

Kubadilisha indeksi

Inawezekana pia kurekebisha indeksi kulingana na haja. Ukilitumia mbinu ya set_index(), unaweza kuteua kolamu maalum ndani ya seti ya data kama indeksi mpya, kama ilivyo kwenye mfano ufuatao.

1
reviews.set_index("title")

Uteuzi wa masharti

Maelezo yaliyoelezwa hapo juu yanahusu njia za kuchakata na kuchagua data kwa kutumia sifa za kimuundo za fremu ya data yenyewe. Hata hivyo, unaweza kwenda hatua zaidi na kuchagua data zinazotimiza masharti mahususi yaliyo changamano zaidi.

Kwa mfano, fikiria hali ambapo katika fremu ya data iliyo na taarifa za bidhaa za mvinyo, unahitaji kuchagua tu data za mvinyo wa Italia wenye alama 90 au zaidi.

1
reviews.country == 'Italy'

Sharti hili hurudisha mfululizo unaoundwa na thamani za boole True/False.

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

loc kimsingi hutegemea lebo, lakini inaweza pia kupokea safu ya boole au mfululizo wa boole unaoweza kulinganishwa. Kwa hiyo, unaweza kuchagua tu data za mvinyo wa Italia kama ifuatavyo.

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

Unaweza kuunganisha masharti kadhaa kwa opereta & au |. Ili kuchagua data za mvinyo ambazo ni za Italia na pia zina alama 90 au zaidi, fanya kama ifuatavyo.

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

Data za mvinyo ambazo ni za Italia au zina alama 90 au zaidi zinaweza kuchaguliwa kama ifuatavyo.

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

Aidha, Pandas ina viteuzi vichache vya masharti vilivyojengewa ndani; miongoni mwa muhimu zaidi ni isin na isnull/notnull.

isin hurudisha mfululizo wa maski ya boole (True au False) unaoonyesha kama thamani ni mojawapo ya zile “zilizomo ndani (is in)” ya orodha, na unaweza kuitumia kuchagua data. Kwa mfano, unaweza kuchagua data za mvinyo wa Italia au Ufaransa kama ifuatavyo.

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

isna/notna hutumika unapochagua data zenye au zisizo na thamani pungufu (NaN). Kwa mfano, unaweza kuchagua tu data za mvinyo ambazo data ya bei haijakosekana kama ifuatavyo.

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

Kwa taarifa, ingawa si sehemu iliyokuwa kwenye kozi ya Kaggle asilia, iloc nayo pia inaweza kupokea safu ya boole (array). Hata hivyo, tofauti na loc, inasaidia array pekee na si mfululizo, hivyo ni vigumu kuitumia kwa namna iliyopanuliwa kama hapo juu.

Ugawaji wa data

Unaweza pia kugawa data mpya kwenye fremu ya data au kuandika juu ya data iliyopo.

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

Somo la 3. Funksheni za Muhtasari na Uambatanishaji

Kuangalia muhtasari wa data

Mbinu ya describe() hutoa muhtasari wa kiwango cha juu wa kolamu uliyopewa.

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

Matokeo ya mbinu ya describe() hubadilika kulingana na aina ya data ya ingizo. Kwa data ya maandishi badala ya ya namba, hurudisha matokeo kama yafuatayo.

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

Au unaweza kupata takwimu maalum unazotaka tu.

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)

Ikiwa unataka kujua ni mara ngapi kila thamani ya kipekee imejitokeza ndani ya fremu ya data, unaweza kutumia mbinu ya value_counts().

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

Uambatanishaji (Maps)

Uambatanishaji (map) ni neno lililokopwa kutoka hisabati, linalomaanisha functshi inayolinganisha seti moja na seti nyingine. Katika sayansi ya data, mara nyingi tunahitaji kubadilisha data iliyotolewa kuwa muundo mwingine wa uwakilishi; tunapotenda kazi hizo hutumia uambatanishaji, na kwa hiyo ni muhimu sana.

Kwa kawaida mbinu mbili hutumiwa sana.

Mbinu ya Series.map() hupokea functshi inayobadilisha thamani moja kuwa thamani nyingine moja, kisha huitumia kwa pamoja kwa thamani zote ndani ya mfululizo uliotolewa, na hurudisha mfululizo mpya uliopatikana kwa njia hiyo. Kwa mfano, kama unataka kupata mkengeuko kwa kutoa wastani kutoka data ya alama za mvinyo kwa pamoja, unaweza kufanya hivi.

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

Mbinu ya DataFrame.apply() hutumika unapotaka kuita functshi maalum kwa kila safu na kutumia mabadiliko hayo kwa fremu nzima ya data.

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

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

Ukiiita mbinu ya apply() pamoja na kigezo cha axis='index', unaweza kutumia functshi hiyo kwa kila kolamu badala ya kila safu.

Series.map() na DataFrame.apply() kila moja hurudisha mfululizo mpya uliobadilishwa au fremu mpya ya data iliyobadilishwa, na havifanyi mabadiliko yoyote kwenye data asilia.

MbinuSeries.map()DataFrame.apply()
Kitu kinachotumika juu yakeMfululizoFremu ya data
Kitengo cha matumiziHutumika kwa kila thamani moja moja
(ukichukulia mfululizo kama vekta ya kolamu, hutumika kwa kiwango cha safu)
Kimsingi hutumika kwa kiwango cha safu
Inaweza pia kutumika kwa kiwango cha kolamu ukibainisha chaguo

Kwa taarifa, Series.apply() na DataFrame.map() pia zipo.

  • Series.apply():
    • by_row='compat' (chaguo-msingi): hufanya kazi sawa na Series.map()
    • by_row=False: hupitisha mfululizo mzima kama ingizo la functshi mara moja (hufanana na tabia ya DataFrame.apply() inapowekwa axis='index')
  • DataFrame.map(): hutumia functshi kwa kila thamani moja moja ndani ya fremu ya data (inafanana na Series.map(), isipokuwa tu kwamba lengo ni fremu ya data badala ya mfululizo)

Kwa kweli, Pandas yenyewe tayari inaunga mkono aina nyingi za uambatanishaji zinazotumika mara kwa mara. Mfano tulioona hapo awali unaweza pia kutekelezwa kwa msimbo mfupi zaidi kama ufuatao, na hata katika hali hiyo Pandas huelewa nia na kufanya kazi ipasavyo.

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

Si hayo tu, Pandas pia inaunga mkono uendeshaji kati ya misururu yenye urefu sawa. Katika mfano wa data ya mvinyo, inawezekana pia kuunganisha taarifa za nchi ya uzalishaji na eneo la uzalishaji kama maandishi kwa njia ifuatayo.

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

Kwa kuwa operesheni hizi hutumia mbinu za kuongeza kasi ya hesabu zilizojengewa ndani ya Pandas, huwa za haraka kuliko mbinu za map() au apply(), na Pandas inaweza kufanya kazi kwa namna hii kwa opereta zote za kawaida za Python (>, <, == n.k.). Hata hivyo, map() na apply() ni rahisi kubadilika zaidi na zinaweza kutekeleza kazi changamano zaidi, hivyo ni vyema pia kuzifahamu.

Makala hii iko chini ya leseni ya CC BY-NC 4.0 ya mwandishi.