Pandas Cuțitul armatei elvețiene pentru datele dvs., partea 2

Aceasta este partea a doua a unui tutorial în două părți despre Pandas, utilajul de instrumente de analiză a datelor Python. 

În prima parte, am acoperit tipurile de date de bază ale Pandelor: seria și cadrul de date. Am importat și exportat date, selectând subseturi de date, am lucrat cu metadate și am sortat datele. 

În această parte vom continua călătoria noastră și vom trata datele lipsă, manipularea datelor, îmbinarea datelor, gruparea de date, serii de timp și complotarea.

Confruntarea cu valorile lipsă

Unul dintre punctele cele mai puternice ale pandelor este manipularea valorilor lipsă. Acesta nu va fi doar un accident și ars în prezența datelor care lipsesc. Când lipsesc datele, panda se înlocuiește cu np.nan (nu un număr) numpy și nu participă la niciun calcul.

Să ne reindexăm cadrul de date, adăugând mai multe rânduri și coloane, dar fără date noi. Pentru a fi interesant, vom popula câteva valori.

>>> df = pd.DataFrame (np.random.randn (5,2), index = index, coloane = ['a', 'b']) >>> new_index = df.index.append (pd.Index (>>>) >>> df.loc ['new'] >>> df.loc ['d']) >>> df.loc ['d' c = 4 >>> df abc o -0.042172 0.374922 NaN doi -0.689523 1.411403 NaN trei 0.332707 0.307561 3.0 patru 0.426519 -0.425181 4.0 cinci -0.161095 - 0,849932 NaN șase NaN NaN NaN 

Rețineți că df.index.append () returnează a nou index și nu modifică indexul existent. De asemenea, df.reindex () returnează a nou cadru de date pe care îl repartizez înapoi df variabil.

În acest moment, cadrul nostru de date are șase rânduri. Ultimul rând este NaNs, iar toate celelalte rânduri, cu excepția celui de-al treilea și al patrulea, au NaN în coloana "c". Ce puteți face cu datele lipsă? Iată opțiunile:

  • Păstrați-o (dar nu participă la calcule).
  • Aruncați-l (rezultatul calculului nu va conține datele care lipsesc).
  • Înlocuiți-l cu o valoare implicită.
Păstrați datele lipsă --------------------- >>> df * = 2 >>> df abc o -0.084345 0.749845 NaN două -1.379046 2.822806 NaN trei 0.665414 0.615123 6.0 patru 0.853037 -0.850362 8.0 cinci -0.322190 -1.699864 NaN șase NaN NaN NaN Rânduri de cădere cu date lipsă --------------------------- >> > df.dropna () abc trei 0.665414 0.615123 6.0 patru 0.853037 -0.850362 8.0 Înlocuiți cu valoarea implicită -------------------------- >>> df .fillna (5) abc un -0.084345 0.749845 5.0 doi -1.379046 2.822806 5.0 trei 0.665414 0.615123 6.0 patru 0.853037 -0.850362 8.0 cinci -0.322190 -1.699864 5.0 șase 5.000000 5.000000 5.0 

Dacă doriți să verificați dacă lipsesc date în cadrul de date, utilizați isnull () metodă. Aceasta returnează o mască booleană a cadrului dvs. de date, care este Adevărat pentru valori lipsă și Fals în altă parte.

>>> df.isnull () a b c unul Fals Fals Adevărat două Fals Fals Adevărat trei Fals Fals Fals 4 Fals Fals Fals 5 Fals Fals Adevărat șase Adevărat Adevărat Adevărat

Manipularea datelor dvs.

Când aveți un cadru de date, trebuie adesea să efectuați operații asupra datelor. Să începem cu un nou cadru de date care are patru rânduri și trei coloane ale unor numere întregi aleatorii între 1 și 9 (inclusiv).

>>> df = pd.DataFrame (np.random.randint (1, 10, size = (4, 3)), coloane = ['a', 'b', 'c') >>> df abc 0 1 3 3 1 8 9 2 2 8 1 5 3 4 6 1 

Acum, puteți începe să lucrați la date. Să însumăm toate coloanele și să atribuim rezultatul ultimului rând și apoi să adunăm toate rândurile (dimensiunea 1) și să le atribuim ultimei coloane:

>>> df.loc [3] = df.sum () >>> df abc 0 1 3 3 1 8 9 2 2 8 1 5 3 21 19 11 >>> df.c = df.sum (1)> >> df abc 0 1 3 7 1 8 9 19 2 8 1 14 3 21 19 51 

De asemenea, puteți efectua operații pe întregul cadru de date. Iată un exemplu de scădere a câte 3 din fiecare celulă:

>>> df - = 3 >>> df a b c 0 -2 0 4 1 5 6 16 2 5 -2 11 3 18 16 48 

Pentru control total, puteți aplica funcții arbitrare:

>>> df.apply (lambda x: x ** 2 + 5 * x - 4) a b c 0 -10 -4 32 1 46 62 332 2 46 -10 172 3 410 332 2540

Îmbinarea datelor

Un alt scenariu obișnuit atunci când lucrați cu cadrele de date este combinarea și îmbinarea cadrelor de date (și serie) împreună. Panda, ca de obicei, vă oferă diferite opțiuni. Să creați un alt cadru de date și să explorați diferitele opțiuni.

>>> df2 = df // 3 >>> df2 a b c 0 -1 0 1 1 1 2 5 2 1 -1 3 3 6 5 16

concat

Atunci când folosiți pd.concat, pandele concatenă în ordine toate rândurile părților furnizate. Nu există alinierea indexurilor. Vedeți în următorul exemplu modul în care sunt create valorile indexului duplicat:

>>> pd.concat ([df, df2]) a b c 0 -2 0 4 1 5 6 16 2 5 -2 11 3 18 16 48 0 -1 0 1 1 1 2 5 2 1 -1 3 3 6 5 16 

De asemenea, puteți concatena coloanele utilizând Axa = 1 argument:

>>> pd.concat ([df [: 2], df2], ax = 1) abcabc 0 -2,0 0,0 4,0 -1 0 1 1 5,0 6,0 16,0 1 2 5 2 NaN NaN NaN-1 3 3 NaN NaN NaN 6 5 16 

Rețineți că, deoarece primul cadru de date (am folosit numai două rânduri) nu aveam la fel de multe rânduri, valorile lipsă au fost populate automat cu NaNs, care au schimbat acele tipuri de coloane din int în float.

Este posibilă concatenarea oricărui număr de cadre de date într-un singur apel.

contopi

Funcția de îmbinare se comportă într-un mod similar cu cel al SQL. Acesta îmbină toate coloanele din rânduri care au chei similare. Rețineți că funcționează numai pe două cadre de date:

>>> df = pd.DataFrame (dict (cheie = ['start', 'finit'], x = [4, 8])) >>> df tasta x 0 start 4 1 finisare 8 >>> df2 = .DataFrame (dict (key = ['start', 'finit'], y = [2, 18])) >>> df2 cheie y start 2 1 finisare 18 >>> pd.merge (df, df2, on = "cheie") tasta xy 0 pornire 4 2 1 finisare 8 18

Adăuga

Cadrul de date adăuga() metoda este o mică comandă rapidă. Funcționează funcțional concat (), dar salvează unele lovituri-cheie.

>>> tasta df x 0 start 4 1 finisare 8 Adăugarea unui rând folosind metoda append () ----------------------------- -------------- >>> df.append (dict (key = 'middle', x = 9), ignore_index = True) tasta x 0 start 4 1 finisaj 8 2 mijloc 9 Adăugare un rând folosind concat () ------------------------------------------- >>> pd.concat ([df, pd.DataFrame (dict (cheie = 'mijloc', x = [9]))], ignore_index = True) cheie x 0 start 4 1 final 8 2 mijloc 9

Gruparea datelor dvs.

Aici este un cadru de date care conține membrii și vârstele a două familii: Smiths și Joneses. Puteți utiliza funcția a se grupa cu() metoda de grupare a datelor prin numele de familie și de a găsi informații la nivel de familie, cum ar fi suma vârstelor și vârsta medie:

df = pd.DataFrame (dict (prima = 'John Jim Jenny Jill Jack'.split (), ultima = "Smith Jones Smith Smith" .split (), vârsta = [11, 13, 22, 44, 65]) ) >>> df.groupby ('last'). () vârsta ultimul Jones 35 Smith 120 >>> df.groupby ('ultim'). 

Serii de timp

Multe date importante sunt datele din seria de timp. Panda are un suport puternic pentru datele din seriile de date începând cu intervalele de date, trecând prin localizare și conversia timpului, și până la reeșantionarea sofisticată bazată pe frecvență.

interval de date() funcția poate genera secvențe de date. Iată un exemplu de generare a unei perioade de șase săptămâni începând cu 1 ianuarie 2017, utilizând fusul orar UTC.

>>> săptămâni = pd.date_range (start = '1/1/2017', perioadele = 6, freq = "W", tz = "UTC") >>> săptămâni DatetimeIndex (['2017-01-01' '2017-01-08', '2017-01-22', '2017-01-29', '2017-02-05'], dtype = "datetime64 [ns, UTC] ", freq =" W-SUN ")

Adăugarea unui marcaj temporal la cadrele dvs. de date, fie ca coloană de date, fie ca index, este excelentă pentru organizarea și gruparea datelor în timp. De asemenea, permite reeșantionarea. Iată un exemplu de reeșantionare a datelor din fiecare minut ca agregări de cinci minute.

>>> minute = pd.date_range (start = '1/1/2017', perioade = 10, freq = "1Min", tz = "UTC") >>> ts = pd.Series (np.random.randn len (minute)), minute) >>> ts 2017-01-01 00: 00: 00 + 00: 00 1.866913 2017-01-01 00: 01: 00 + 00: 00 2.157201 2017-01-01 00:02 : 00 + 00: 00 -0.439932 2017-01-01 00: 03: 00 + 00: 00 0.777944 2017-01-01 00: 04: 00 + 00: 00 0.755624 2017-01-01 00: 05: 00 + 00 : 00 -2.150276 2017-01-01 00: 06: 00 + 00: 00 3.352880 2017-01-01 00: 07: 00 + 00: 00 -1.657432 2017-01-01 00: 08: 00 + 00: 00 - 0.144666 2017-01-01 00: 09: 00 + 00: 00 -0.667059 Freq: T, dtype: float64 >>> ts.resample ('5Min') medie 2017-01-01 00: 00: 00+ 00:00 1.023550 2017-01-01 00: 05: 00 + 00: 00 -0.253311

Trasarea

Panda acceptă plotarea cu matplotlib. Asigurați-vă că este instalat: pip instalați matplotlib. Pentru a genera un grafic, puteți apela plot () a unei serii sau a unui cadru de date. Există multe opțiuni pentru a controla complotul, dar valorile implicite funcționează în scopuri simple de vizualizare. Iată cum să generați un grafic de linii și să le salvați într-un fișier PDF.

ts = pd.Series (np.random.randn (1000), index = pd.date_range ('1/1/2017', perioade = 1000)) ts = ts.cumsum ax.get_figure () fig.savefig ('plot.pdf')

Rețineți că pe macOS, Python trebuie să fie instalat ca un cadru pentru plotarea cu Pandas.

Concluzie

Panda este un cadru larg de analiză a datelor. Are un model simplu de obiect cu conceptele de serie și cadre de date și o multitudine de funcționalități încorporate. Puteți să compuneți și să combinați funcțiile pandelor și propriii algoritmi. 

În plus, nu ezitați să vedeți ce avem la dispoziție pentru vânzare și pentru a studia pe piață și nu ezitați să întrebați orice întrebări și să furnizați feedback-ul valoros utilizând feedul de mai jos.

Importul de date și exportul în panda sunt și foarte extinse și vă asigură că o puteți integra cu ușurință în sistemele existente. Dacă faceți orice prelucrare de date în Python, pandele aparțin în cutia dvs. de instrumente.

Cod