Pandas è una libreria per la manipolazione di dati in formato sequenziale o tabellare, quali serie temporali o dati di microarray.
Caratteristiche principali di Pandas sono:
Caricamento e salvataggio di formati standard per dati tabellari, quali CSV (Comma-separated Values), TSV (Tab-separated Values), file Excel e formati per database
Semplicità nella esecuzione di operazioni di indicizzazione e aggregazione di dati
Semplicità nella esecuzione di operazioni numeriche e statistiche
Semplicità nella visualizzazione dei risultati delle operazioni
Il sito ufficiale del progetto http://pandas.pydata.org/ contiene molte informazioni aggiuntive, documentazione etc.
Pandas si importa come qualsiasi altro modulo. La sintassi comune è
import pandas as pd
Dove as pd
permette di riferirsi al modulo con l'abbreviazione pd
Matplotlib è una libreria per la realizzazione di grafici estremamente potente e flessibile.
Il modulo pyplot
della libreria permette di realizzare in maniera semplice moltissimi tipi di plots.
Il modulo si importa di solito rinominandolo plt
import matplotlib.pyplot as plt
Usando matplotlib.pyplot
si importa solo il modulo pyplot
della libreria.
Per le nostre esigenze sarà sufficiente il metodo plt.show()
.
Pandas fornisce due tipi di dati molto utili, le Series
ed i DataFrame
:
Series
rappresenta dati 1D, come le serie temporali
DataFrame
rappresenta dati 2D, praticamente qualunque insieme di dati in forma tabellare
Ogni colonna di un DataFrame
è una Series
. Per questo questo vedremo prima le Series
e molto di quello che vedremo sarà applicabile anche ai DataFrame
.
Series
¶Una Series
è un vettore mono-dimensionale i cui elementi sono etichettati con un index
.
In questo senso, la Series
opera un po' come una lista (si possono accedere gli elementi in sequenza) e un po' come un dizionario (si può accedere ad un elemento tramite il suo indice, che opera come una chiave e non deve essere per forza numerico)
Series
¶Una Series
può essere creata tramite la funzione pd.Series()
:
s = pd.Series([2.5,3.6,5.7,5.8],index=[0,5,15,30])
s
s = pd.Series({"a": 342, "c": 245, "g" : 546, "t" : 222})
s
s = pd.Series([2.5,3.6,5.7,5.8])
s
## Accedere ad una ``Series``
Si può accedere ad una ``Series`` sia tramite indice (come nei dizionari),
sia tramite posizione (come nelle liste)
s = pd.Series({"a": 342, "c": 245, "g" : 546, "t" : 222})
s["c"]
s[-1]
Gli indici sono praticamente delle etichette associate alle posizioni corrispondenti,
per cui si possono usare per estrarre porzioni di ``Series``
s["c":"t"]
Attenzione: la sottoserie va da indice iniziale a indice finale *compreso*
E' anche possibile passare una lista di indici da estrarre
s[["a", "g"]]
Series
¶Le operazioni aritmetiche su una Series
si applicano a tutti i suoi elementi (tale operazione viene detta broadcasting)
s + 1
s *= 2
s
E' ovviamente sempre possibile eseguire un'operazione su un solo elemento riferendosi ad esso per posizione o indice
s['c'] += 1
s
Anche i test logici si applicano a tutti gli elementi
s > 1000
Il risultato è una Series
con come valori True
dove la condizione è soddisfatta, False
dove non lo è.
Queste serie vengono chiamate maschere e permettono di scegliere solo gli elementi che soddisfano la condizione
s[s > 1000]
o che non la soddisfano (utile quando non è facile invertire la condizione)
s[~(s > 1000)]
La somma tra due serie le somma elemento per elemento, allineandole per indice.
s + pd.Series({"a" : 1234, "g" : 3451})
Se un indice non è presente in una delle serie, il risultato è Nan
(not a number).
Usando il metodo add
è possibile specificare un valore di default da usare quando un indice non è presente
s1 = pd.Series({"a" : 1234, "g" : 3451})
s.add(s1, fill_value=0)
Series
¶s.sum()
s.product()
s.max()
s.argmax()
s.mean()
s.std()
s.corr(s) # pearson di default
s.corr(s, method='spearman')
s = pd.Series([1,2,1,1,1,2,3,4,4,4,2,3,4,3,1,1,2])
s.value_counts()
Series
¶E' possibile visualizzare il contenuto di una serie o il risultato di operazioni eseguite su serie tramite la libreria matplotlib
import matplotlib.pyplot as plt
s.plot()
plt.show()
s.plot(kind='bar')
plt.show()
E in molti altri modi: http://pandas.pydata.org/pandas-docs/stable/visualization.html
Per salvare il plot su file usare il metodo `savefig` di `pyplot`
s.plot(kind='bar')
plt.savefig("bar.png")
DataFrame
¶Un DataFrame
è praticamente una tabella di oggetti eterogenei.
In pratica è l'equivalente bi-dimensionale di una Series
.
Un DataFrame
ha indici sia per le righe che per le colonne:
index
rappresenta le etichette delle righe
columns
rappresenta le etichette delle colonne
In aggiunta, l'attributo shape
descrive le dimensioni della tabella
Ogni colonna di un DataFrame
è una Series
. Tutte le operazioni viste per le serie
possono essere applicate a colonne estratte da un DataFrame
.
Inoltre molte delle operazioni definite per le Series
possono essere applicate direttamente su un DataFrame
|
DataFrame
¶Ci sono molti modi per creare un DataFrame
. I più semplici sono:
d = {'cond1' : [0.5,-0.4,1.2,-2.1,2.3], 'cond2' : [0.6,-0.1,-0.1,-0.9,1.8]}
df = pd.DataFrame(d, index=['gene1','gene2','gene3','gene4','gene5'])
df
df = pd.DataFrame(d)
df
df = pd.read_csv('breast_cancer.txt', delimiter='\t')
list(df.index)
df.columns
df.shape
File excel possono essere letti con read_excel
E' possibile accedere ad un estratto del DataFrame
con il metodo head
df.head()
df['age_at_diagnosis']
df[['Pam50Subtype','stage']]
df.loc[0]
df.loc[[0,5,15]]
df[0:5]
df.loc[0:5]
DataFrame
¶Le operazioni sulle Series
si applicano in maniera analoga ai DataFrame
df[df['stage'] > 1]
df[df['stage'] > 1][['Pam50Subtype','stage']]
Le statistiche si possono applicare a singole colonne o all'intera tabella
df['age_at_diagnosis'].mean()
df.mean()
df.std()
E' possibile raggruppare righe in base ad il valore di una certa colonna. In tal modo è possibile calcolare statistiche stratificate
df.groupby('Pam50Subtype').mean()
df.groupby('Treatment')['size'].mean()
E' possibile applicare funzioni arbitrarie ad un DataFrame (o ad una sua parte) tramite il metodo apply
che prende come argomento la funzione da applicare.
df.groupby('Pam50Subtype')['stage'].apply(pd.Series.value_counts)