Panda's het Zwitserse zakmes voor uw gegevens, deel 2

Dit is deel twee van een tweedelige tutorial over Panda's, de geweldige toolkit voor het analyseren van Python-gegevens. 

In deel één hebben we de basistypen van de gegevens van Panda's behandeld: de reeks en het gegevensframe. We importeerden en exporteerden gegevens, geselecteerde subsets met gegevens, werkten met metadata en sorteerden de gegevens. 

In dit deel zullen we onze reis voortzetten en omgaan met ontbrekende gegevens, gegevensmanipulatie, samenvoeging van gegevens, gegevensgroepering, tijdreeksen en plotten.

Omgaan met ontbrekende waarden

Een van de sterkste punten van panda's is het hanteren van ontbrekende waarden. Het zal niet alleen crashen en branden in de aanwezigheid van ontbrekende gegevens. Als er gegevens ontbreken, vervangt panda's het door numpy's np.nan (geen nummer), en het neemt niet deel aan een berekening.

Laten we ons dataframe opnieuw indexeren, meer rijen en kolommen toevoegen, maar zonder nieuwe gegevens. Om het interessant te maken, vullen we enkele waarden in.

>>> df = pd.DataFrame (np.random.randn (5,2), index = index, columns = ['a', 'b']) >>> new_index = df.index.append (pd.Index (['six'])) >>> new_columns = lijst (df.columns) + ['c'] >>> df = df.reindex (index = new_index, columns = new_columns) >>> df.loc [' drie ']. c = 3 >>> df.loc [' vier ']. c = 4 >>> df abc one -0.042172 0.374922 NaN twee -0.689523 1.411403 NaN drie 0.332707 0.307561 3.0 vier 0.426519 -0.425181 4.0 vijf -0.161095 - 0.849932 NaN zes NaN NaN NaN 

Let daar op df.index.append () geeft a terug nieuwe index en wijzigt de bestaande index niet. Ook, df.reindex () geeft a terug nieuwe dataframe dat ik weer toewijs aan de df veranderlijk.

Op dit moment heeft ons dataframe zes rijen. De laatste rij is alle NaN's en alle andere rijen behalve de derde en vierde hebben NaN in de kolom "c". Wat kun je doen met ontbrekende gegevens? Dit zijn opties:

  • Houd het (maar het zal niet deelnemen aan berekeningen).
  • Laat het vallen (het resultaat van de berekening zal niet de ontbrekende gegevens bevatten).
  • Vervang deze door een standaardwaarde.
Houd de ontbrekende gegevens --------------------- >>> df * = 2 >>> df abc one -0.084345 0.749845 NaN two -1.379046 2.822806 NaN three 0.665414 0.615123 6.0 vier 0.853037 -0.850362 8.0 vijf -0.322190 -1.699864 NaN zes NaN NaN NaN Rijen met ontbrekende gegevens laten vallen --------------------------- >> > df.dropna () abc three 0.665414 0.615123 6.0 four 0.853037 -0.850362 8.0 Vervangen door standaardwaarde -------------------------- >>> df .fillna (5) abc one -0.084345 0.749845 5.0 twee -1.379046 2.822806 5.0 drie 0.665414 0.615123 6.0 vier 0.853037 -0.850362 8.0 vijf -0.322190 -1.699864 5.0 zes 5.000000 5.000000 5.0 

Als u alleen wilt controleren of er gegevens ontbreken in uw dataframe, gebruikt u de is niets() methode. Dit retourneert een Boolean-masker van uw dataframe, wat wel zo is waar voor ontbrekende waarden en vals ergens anders.

>>> df.isnull () a b c one False False True two False False True three False False False vier False False False five False False True six True True True

Het manipuleren van uw gegevens

Wanneer u een dataframe hebt, moet u vaak bewerkingen uitvoeren op de gegevens. Laten we beginnen met een nieuw gegevensframe met vier rijen en drie kolommen met willekeurige gehele getallen tussen 1 en 9 (inclusief).

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

Nu kunt u aan de gegevens gaan werken. Laten we alle kolommen samenvatten en het resultaat toewijzen aan de laatste rij en vervolgens alle rijen (dimensie 1) optellen en toewijzen aan de laatste kolom:

>>> 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 

U kunt ook bewerkingen uitvoeren op het volledige gegevensframe. Hier is een voorbeeld van 3 aftrekken van elke cel:

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

Voor volledige controle kunt u willekeurige functies toepassen:

>>> 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

Gegevens samenvoegen

Een ander veelvoorkomend scenario bij het werken met dataframes is het combineren en samenvoegen van dataframes (en series) samen. Panda's, zoals gewoonlijk, geeft je verschillende opties. Laten we een ander gegevensframe maken en de verschillende opties verkennen.

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

concat

Bij het gebruik van pd.concat worden alle rijen van de geleverde onderdelen eenvoudig door panda's samengevoegd. Er is geen uitlijning van indexen. Zie in het volgende voorbeeld hoe dubbele indexwaarden worden gemaakt:

>>> 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 

U kunt ook kolommen aaneenschakelen met behulp van de as = 1 argument:

>>> pd.concat ([df [: 2], df2], as = 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 -1 3 3 NaN NaN NaN 6 5 16 

Merk op dat omdat het eerste dataframe (ik gebruikte slechts twee rijen) niet zoveel rijen had, de ontbrekende waarden automatisch werden gevuld met NaN's, die die kolomtypen veranderden van int naar float.

Het is mogelijk om elk gewenst aantal dataframes samen te voegen in één oproep.

samensmelten

De samenvoegfunctie gedraagt ​​zich op dezelfde manier als SQL join. Het combineert alle kolommen uit rijen met vergelijkbare sleutels. Houd er rekening mee dat deze alleen werkt op twee gegevensframes:

>>> df = pd.DataFrame (dict (toets = ['start', 'finish'], x = [4, 8])) >>> df-sleutel x 0 start 4 1 finish 8 >>> df2 = pd .DataFrame (dict (key = ['start', 'finish'], y = [2, 18])) >>> df2 key y 0 start 2 1 finish 18 >>> pd.merge (df, df2, on = "toets") toets xy 0 start 4 2 1 finish 8 18

toevoegen

De dataframes toevoegen () methode is een kleine snelkoppeling. Het gedraagt ​​zich functioneel als concat (), maar slaat een aantal toetsaanslagen op.

>>> df key x 0 start 4 1 finish 8 Eén rij toevoegen met behulp van de append methode () ----------------------------- -------------- >>> df.append (dict (key = 'middle', x = 9), ignore_index = True) key x 0 start 4 1 finish 8 2 middle 9 Appending één rij met behulp van de concat () ------------------------------------------- >>> pd.concat ([df, pd.DataFrame (dict (key = 'middle', x = [9])]], ignore_index = True) key x 0 start 4 1 finish 8 2 middle 9

Uw gegevens groeperen

Hier is een gegevensframe met de leden en leeftijden van twee families: de Smiths en de Joneses. U kunt de GroupBy () methode om gegevens te groeperen op achternaam en informatie te vinden op gezinsniveau zoals de som van leeftijden en de gemiddelde leeftijd:

df = pd.DataFrame (dict (first = 'John Jim Jenny Jill Jack'.split (), last = "Smith Jones Jones Smith Smith" .split (), age = [11, 13, 22, 44, 65]) ) >>> df.groupby ('laatste'). sum () age last Jones 35 Smith 120 >>> df.groupby ('last'). mean () age last Jones 17.5 Smith 40.0 

Tijdreeksen

Veel belangrijke gegevens zijn tijdreeksgegevens. Panda's hebben sterke ondersteuning voor tijdreeksgegevens, te beginnen met gegevensbereiken, door middel van lokalisatie en tijdconversie, en helemaal tot geavanceerde frequentie-gebaseerde resampling.

De datumbereik() functie kan reeksen van datimes genereren. Hier is een voorbeeld van het genereren van een periode van zes weken vanaf 1 januari 2017 met behulp van de UTC-tijdzone.

>>> weken = pd.date_range (start = '1/1/2017', periodes = 6, freq = "W", tz = "UTC") >>> weken DatetimeIndex (['2017-01-01', '2017-01-08', '2017-01-15', '2017-01-22', '2017-01-29', '2017-02-05'], dtype = "datetime64 [ns, UTC] ", freq =" W-SUN ")

Het toevoegen van een tijdstempel aan uw gegevensframes, hetzij als gegevenskolom of als de index, is geweldig voor het organiseren en groeperen van uw gegevens op tijd. Het maakt ook hersamplen mogelijk. Hier is een voorbeeld van het opnieuw samplen van elke minuutgegevens als aggregaties van vijf minuten.

>>> minuten = pd.date_range (start = '1/1/2017', periodes = 10, freq = "1Min", tz = "UTC") >>> ts = pd.Series (np.random.randn ( len (minuten)), minuten) >>> 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.7764424 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'). Mean () 2017-01-01 00: 00: 00+ 00:00 1.023550 2017-01-01 00: 05: 00 + 00: 00 -0.253311

plotten

Panda's ondersteunt plotten met matplotlib. Zorg ervoor dat het is geïnstalleerd: pip installeer matplotlib. Om een ​​plot te genereren, kunt u de plot () van een reeks of een gegevensframe. Er zijn veel opties om de plot te besturen, maar de standaardwaarden werken voor eenvoudige visualisatiedoeleinden. Hier leest u hoe u een lijngrafiek kunt genereren en deze in een PDF-bestand kunt opslaan.

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

Merk op dat op macOS Python moet worden geïnstalleerd als een raamwerk voor het plotten met Panda's.

Conclusie

Panda's is een zeer breed gegevensanalyse-raamwerk. Het heeft een eenvoudig objectmodel met de concepten serie en dataframe en een schat aan ingebouwde functionaliteit. Je kunt Panda-functies en je eigen algoritmen samenstellen en mixen. 

Aarzel niet om te zien wat we te koop aanbieden en om te studeren op de markt, en aarzel niet om vragen te stellen en uw waardevolle feedback te geven met behulp van de onderstaande feed.

Gegevens importeren en exporteren in panda's zijn ook zeer uitgebreid en zorgen ervoor dat u het eenvoudig in bestaande systemen kunt integreren. Als u gegevens verwerkt in Python, hoort deze bij uw toolbox.