Panda il coltellino svizzero per i tuoi dati, parte 1

Pandas è un incredibile toolkit di analisi dei dati per Python. È progettato per operare su dati relazionali o etichettati e offre strumenti per tagliare e tagliare a proprio piacimento. 

In questo tutorial in due parti, imparerai a conoscere le strutture dati fondamentali di Pandas: la serie e il frame dei dati. Imparerai anche come selezionare i dati, gestire i valori mancanti, manipolare i dati, unire i dati, raggruppare i dati, lavorare con le serie temporali e persino i dati di tracciamento.

Installazione

Per installare, solo pip installa panda. Si occuperà di installare numpy anche se non è installato.

Serie

Le serie di Pandas sono costituite da array 1-D scritti ed etichettati. Ciò significa che a ciascun elemento è possibile accedere tramite la sua etichetta oltre al suo indice.

Ecco una serie di numeri interi in cui le etichette sono numeri romani. È possibile indicizzare e tagliare utilizzando le etichette o gli indici interi. A differenza delle normali affettazioni di liste Python, quando si usano le etichette è incluso l'ultimo oggetto!

>>> s = pd.Series (np.arange (1,5), ['I', 'II', 'III', 'IV', 'V']) >>> s ['III'] 3 >>> s [0] 1 >>> s ['II': 'V'] II 2 III 3 IV 4 V 5 >>> s [1: 5] II 2 III 3 IV 4 V 5 

Se non si fornisce un indice, viene automaticamente creato un indice intero basato su 0:

>>> s = pd.Series ((50, 7, 88, 9)) >>> s 0 50 1 7 2 88 3 9

Ora, ecco un piccolo segreto per te. Le serie di panda sono un involucro attorno agli array di Numpy.

>>> s.values ​​array ([50, 7, 88, 9]) >>> tipo (s.valori)  

A differenza degli elenchi Python o degli array numpy, le operazioni su serie si allineano all'indice. Se gli indici non corrispondono, l'unione degli indici verrà utilizzata con i valori mancanti, a seconda dei casi. Ecco alcuni esempi che utilizzano dicts come dati in modo che le chiavi diventino l'indice delle serie:

>>> s1 = pd.Series (dict (a = 1, b = 2, c = 3)) >>> s2 = pd.Series (dict (a = 4, b = 5, c = 6, d = 7 )) >>> s1 + s2 a 5.0 b 7.0 c 9.0 d NaN >>> s1 [1:] * s2 [: - 1] a NaN b 10.0 c 18.0

Cornici Dati

I frame di dati sono la struttura dei dati panda primaria. Rappresentano tabelle di dati in cui ogni colonna è una serie. Anche i frame di dati hanno un indice, che funge da etichetta di riga. Un frame di dati ha anche etichette di colonne. Ecco come dichiarare un frame di dati usando un dict. 

>>> df = pd.DataFrame (dict (a = [1, 2, 3], b = [4,5,6], c = pd.Timestamp ('20170902'), d = pd.Categorical ([' rosso ',' verde ',' blu ']))) >>> df abcd 0 1 4 2017-09-02 rosso 1 2 5 2017-09-02 verde 2 3 6 2017-09-02 blu

Si noti che un indice intero (etichetta riga) è stato creato automaticamente. Ovviamente puoi fornire il tuo indice:

>>> df.index = ('I II III'.split ()) >>> df a b c d I 1 4 2017-09-02 rosso II 2 5 2017-09-02 verde III 3 6 2017-09-02 blu

Importazione ed esportazione di dati

I frame di dati possono essere costruiti da una vasta gamma di fonti:

  • dict of ndarrays 1-D, liste, dict o serie
  • 2-D numpy.ndarray
  • strutturato o record narray
  • un altro DataFrame

Puoi anche importare o caricare dati da molti formati di file e database come:

  • CSV
  • Eccellere
  • HTML
  • HDFStore 
  • SQL

Ecco come leggere un file CSV:

data.csv -------- I, 1,4,2017-09-02, rosso II, 2,5,2017-09-02, verde III, 3,6,2017-09-02, blu >>> pd.read_csv ('data.csv') I 1 4 2017-09-02 rosso 0 II 2 5 2017-09-02 verde 1 III 3 6 2017-09-02 blu 

Ecco l'elenco completo di read_functions ():

>>> read_functions = [una per una a dir (pd) se a.startswith ( 'READ')] >>> print ( '\ n'.join (read_functions)) read_clipboard read_csv read_excel read_feather read_fwf read_gbq read_hdf read_html read_json read_msgpack read_pickle read_sas read_sql read_sql_query read_sql_table read_stata read_table 

Esistono metodi corrispondenti sull'oggetto frame dati stesso per l'esportazione dei dati in molti formati e database. Ecco come esportare in json e msgpack:

>>> df.to_json () '"a": "I": 1, "II": 2, "III": 3, "b": "I": 4, "II": 5 , "III": 6, "c": "I": 1504310400000, "II": 1504310400000, "III": 1504310400000, "d": "I": "rosso", "II": " verde", "III": "blu" '>>> df.to_msgpack () b' \ x84 \ xa3typ \ xadblock_manager \ xa5klass \ xa9DataFrame \ xa4axes \ x92 \ x86 \ xa3typ \ xa5index \ xa5klass \ xa5Index \ xa4name \ xc0 \ xa5dtype \ xa6object \ xa4data \ x94 \ xa1a \ xa1b \ xa1c \ xa1d \ xa8compress \ xc0 \ x86 \ xa3typ \ xa5index \ xa5klass \ xa5Index \ xa4name \ xc0 \ xa5dtype \ xa6object \ xa4data \ x93 \ xa1I \ xa2II \ xa3III \ xa8compress \ xc0 \ xa6blocks \ x93 \ x86 \ xa4locs \ x86 \ xa3typ \ xa7ndarray \ xa5shape \ x91 \ x02 \ xa4ndim \ x01 \ xa5dtype \ xa5int64 \ xa4data \ xd8 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x x00 \ x00 \ x01 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ xa8compress \ xc0 \ xa6values ​​\ XC70 \ x00 \ x01 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x02 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x03 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x04 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x05 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x06 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ xa5shape \ x92 \ x02 \ x03 \ xa5dtype \ xa5int64 \ xa5klass \ xa8IntBlock \ xa8compress \ xc0 \ x86 \ xa4loc s \ x86 \ xa3typ \ xa7ndarray \ xa5shape \ x91 \ x01 \ xa4ndim \ x01 \ xa5dtype \ xa5int64 \ xa4data \ XD7 \ x00 \ x02 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ xa8compress \ xc0 \ xa6values ​​\ XC7 \ x18 \ x00 \ x00 \ x00 \ sso \ xafVb \ xe0 \ x14 \ x00 \ x00 \ sso \ xafVb \ xe0 \ x14 \ x00 \ x00 \ sso \ xafVb \ xe0 \ x14 \ xa5shape \ x92 \ x01 \ x03 \ xa5dtype \ xaedatetime64 [ns] \ xa5klass \ xadDatetimeBlock \ xa8compress \ xc0 \ x86 \ xa4locs \ x86 \ xa3typ \ xa7ndarray \ xa5shape \ x91 \ x01 \ xa4ndim \ x01 \ xa5dtype \ xa5int64 \ xa4data \ xd7 \ x00 \ x03 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ xa8compress \ xc0 \ xa6values ​​\ x87 \ xa3typ \ xa8category \ xa5klass \ xabCategorical \ xa4name \ xc0 \ xa5codes \ x86 \ xa3typ \ xa7ndarray \ xa5shape \ x91 \ x03 \ xa4ndim \ x01 \ xa5dtype \ xa4int8 \ xa4data \ xc7 \ x03 \ x00 \ x02 \ x01 \ x00 \ xa8compress \ xc0 \ xaacategories \ x86 \ xa3typ \ xa5index \ xa5klass \ xa5Index \ xa4name \ xc0 \ xa5dtype \ xa6object \ xa4data \ x93 \ xa4blue \ xa5green \ xa3red \ xa8compress \ xc0 \ xa7ordered \ xc2 \ xa8compress \ xc0 \ xa5shape \ x91 \ x03 \ xa5dtype \ xa8category \ xa5klass \ xb0CategoricalBlock \ xa8compress \ xc0 '

Metadati e statistiche

Pandas fornisce molte informazioni sui frame di dati. Dai un'occhiata a questi metodi:

>>> Indice df.index (['I', 'II', 'III'], dtype = "oggetto") >>> df.columns Index (['a', 'b', 'c', ' d '], dtype = "oggetto") >>> df.describe () ab conteggio 3.0 3.0 media 2.0 5.0 std 1.0 1.0 min 1.0 4.0 25% 1.5 4.5 50% 2.0 5.0 75% 2.5 5.5 max 3.0 6.

Selezione dei dati

I frame di dati consentono di selezionare i dati. Se si desidera selezionare una riga per indice, è necessario utilizzare il loc attributo. Per selezionare le colonne, è sufficiente utilizzare il nome della colonna. Ecco come selezionare singole righe, singole colonne, una porzione di righe, una porzione di colonne e, last but not least, una sezione rettangolare (sottoinsieme di righe e sottoinsieme di colonne da queste righe):

Singola riga ---------- >>> df.loc ['II'] a 2 b 5 c 2017-09-02 00:00:00 d verde Più righe usando l'indice intero (no 'loc' ) -------------------------------------------- >>> df [ : 2] abcd I 1 4 2017-09-02 red II 2 5 2017-09-02 verde Colonna singola ------------- >>> df ['b'] I 4 II 5 III 6 Colonne multiple ---------------- >>> df.loc [:, 'b': 'c'] bc I 4 2017-09-02 II 5 2017-09 -02 III 6 2017-09-02 Sezione rettangolare ------------------- >>> df.loc [: 'II', 'b': 'c'] bc I 4 2017-09-02 II 5 2017-09-02 Utilizzo dell'indice intero (quando l'indice effettivo non è intero) ------------------------ ------------------------------ >>> df.iloc [: 2, 1: 3] bc I 4 2017-09 -02 II 5 2017-09-02 

Oltre a quelle selezioni dirette per l'indirizzamento dei dati, è anche possibile selezionare in base ai valori. Ad esempio, puoi selezionare solo le righe con valori pari nella colonna b: 

>>> df [df.b% 2 == 0] a b c d I 1 4 2017-09-02 rosso III 3 6 2017-09-02 blu

Ordinamento dei dati

Panda ti dà anche lo smistamento. Ordiniamo il seguente frame di dati per indice (righe) e per colonna. Anche l'indicizzazione a più livelli è supportata:

index = ['one', 'two', 'three', 'four', 'five'] df = pd.DataFrame (np.random.randn (5,2), index = index, columns = ['a' , 'b']) Ordina per indice (alfabetico e decrescente) ------------------------------------ --------- >>> df.sort_index (crescente = Falso) ab due -0.689523 1.411403 tre 0.332707 0.307561 uno -0.042172 0.374922 quattro 0.426519 -0.425181 cinque -0.161095 -0.849932 Ordina per colonna ------ -------- >>> df.sort_values ​​(di = 'a') ab due -0.689523 1.411403 cinque -0.161095 -0.849932 uno -0.042172 0.374922 tre 0.332707 0.307561 quattro 0.426519 -0.425181

Conclusione

In questa parte del tutorial, abbiamo trattato i tipi di dati di base di Pandas: la serie e il frame dei dati. Abbiamo importato ed esportato dati, sottoinsiemi di dati selezionati, lavorato con metadati e ordinato i dati. Nella seconda parte, continueremo il nostro viaggio e ci occuperemo dei dati mancanti, della manipolazione dei dati, della fusione dei dati, del raggruppamento dei dati, delle serie temporali e della stampa. Rimanete sintonizzati.

Nel frattempo, non esitare a vedere ciò che abbiamo a disposizione per la vendita e per studiare nel mercato, e non esitare a fare domande e fornire il tuo prezioso feedback utilizzando il feed qui sotto.