2012-03-04 14 views
6

Questa è la prima volta che provo Pandas. Penso di avere un caso d'uso ragionevole, ma sto inciampando. Voglio caricare un file delimitato da tabulazioni in un Dataframe di Pandas, quindi raggrupparlo per simbolo e tracciarlo con l'x.axis indicizzato dalla colonna TimeStamp. Ecco un sottoinsieme dei dati:Pandas DataFrame - l'indice desiderato ha valori duplicati

Symbol,Price,M1,M2,Volume,TimeStamp 
TBET,2.19,3,8.05,1124179,9:59:14 AM 
FUEL,3.949,9,1.15,109674,9:59:11 AM 
SUNH,4.37,6,0.09,24394,9:59:09 AM 
FUEL,3.9099,8,1.11,105265,9:59:09 AM 
TBET,2.18,2,8.03,1121629,9:59:05 AM 
ORBC,3.4,2,0.22,10509,9:59:02 AM 
FUEL,3.8599,7,1.07,102116,9:58:47 AM 
FUEL,3.8544,6,1.05,100116,9:58:40 AM 
GBR,3.83,4,0.46,64251,9:58:24 AM 
GBR,3.8,3,0.45,63211,9:58:20 AM 
XRA,3.6167,3,0.12,42310,9:58:08 AM 
GBR,3.75,2,0.34,47521,9:57:52 AM 
MPET,1.42,3,0.26,44600,9:57:52 AM 

Nota due cose sulla colonna TimeStamp;

  1. ha valori duplicati e
  2. gli intervalli sono irregolari.

ho pensato che avrei potuto fare qualcosa di simile ...

from pandas import * 
import pylab as plt 

df = read_csv('data.txt',index_col=5) 
df.sort(ascending=False) 

df.plot() 
plt.show() 

Ma il metodo read_csv solleva un'eccezione "colonne passaggi da 1-X come indice, ma ho trovato duplicati". C'è un'opzione che mi permetterà di specificare una colonna di indice con valori duplicati?

Sarei anche interessato ad allineare i miei intervalli di timestamp irregolari a una risoluzione di un secondo, vorrei comunque tracciare più eventi per un dato secondo, ma forse potrei introdurre un indice univoco, quindi allineare i miei prezzi ad esso?

risposta

4

ho creato diversi problemi solo ora ad affrontare alcune funzioni/servizi che penso sarebbe bello avere: GH-856, GH-857, GH-858

Stiamo attualmente lavorando su un rinnovamento delle capacità serie temporali e facendo l'allineamento in secondo luogo la risoluzione è possibile ora (anche se non con i duplicati, quindi sarebbe necessario scrivere alcune funzioni per quello). Voglio anche supportare i timestamp duplicati in un modo migliore. Tuttavia, questo è davvero pannello indicatore (3D), in modo in un modo che si potrebbe cambiare le cose è la seguente:

In [29]: df.pivot('Symbol', 'TimeStamp').stack() 
Out[29]: 
        M1 M2 Price Volume 
Symbol TimeStamp        
FUEL 9:58:40 AM 6 1.05 3.8544 100116 
     9:58:47 AM 7 1.07 3.8599 102116 
     9:59:09 AM 8 1.11 3.9099 105265 
     9:59:11 AM 9 1.15 3.9490 109674 
GBR 9:57:52 AM 2 0.34 3.7500 47521 
     9:58:20 AM 3 0.45 3.8000 63211 
     9:58:24 AM 4 0.46 3.8300 64251 
MPET 9:57:52 AM 3 0.26 1.4200 44600 
ORBC 9:59:02 AM 2 0.22 3.4000 10509 
SUNH 9:59:09 AM 6 0.09 4.3700 24394 
TBET 9:59:05 AM 2 8.03 2.1800 1121629 
     9:59:14 AM 3 8.05 2.1900 1124179 
XRA 9:58:08 AM 3 0.12 3.6167 42310 

nota che questo ha creato un MultiIndex. Un altro modo ho potuto ottenere questo:

In [32]: df.set_index(['Symbol', 'TimeStamp']) 
Out[32]: 
        Price M1 M2 Volume 
Symbol TimeStamp        
TBET 9:59:14 AM 2.1900 3 8.05 1124179 
FUEL 9:59:11 AM 3.9490 9 1.15 109674 
SUNH 9:59:09 AM 4.3700 6 0.09 24394 
FUEL 9:59:09 AM 3.9099 8 1.11 105265 
TBET 9:59:05 AM 2.1800 2 8.03 1121629 
ORBC 9:59:02 AM 3.4000 2 0.22 10509 
FUEL 9:58:47 AM 3.8599 7 1.07 102116 
     9:58:40 AM 3.8544 6 1.05 100116 
GBR 9:58:24 AM 3.8300 4 0.46 64251 
     9:58:20 AM 3.8000 3 0.45 63211 
XRA 9:58:08 AM 3.6167 3 0.12 42310 
GBR 9:57:52 AM 3.7500 2 0.34 47521 
MPET 9:57:52 AM 1.4200 3 0.26 44600 

In [33]: df.set_index(['Symbol', 'TimeStamp']).sortlevel(0) 
Out[33]: 
        Price M1 M2 Volume 
Symbol TimeStamp        
FUEL 9:58:40 AM 3.8544 6 1.05 100116 
     9:58:47 AM 3.8599 7 1.07 102116 
     9:59:09 AM 3.9099 8 1.11 105265 
     9:59:11 AM 3.9490 9 1.15 109674 
GBR 9:57:52 AM 3.7500 2 0.34 47521 
     9:58:20 AM 3.8000 3 0.45 63211 
     9:58:24 AM 3.8300 4 0.46 64251 
MPET 9:57:52 AM 1.4200 3 0.26 44600 
ORBC 9:59:02 AM 3.4000 2 0.22 10509 
SUNH 9:59:09 AM 4.3700 6 0.09 24394 
TBET 9:59:05 AM 2.1800 2 8.03 1121629 
     9:59:14 AM 2.1900 3 8.05 1124179 
XRA 9:58:08 AM 3.6167 3 0.12 42310 

è possibile ottenere questi dati in un formato pannello di vero in questo modo:

In [35]: df.set_index(['TimeStamp', 'Symbol']).sortlevel(0).to_panel() 
Out[35]: 
<class 'pandas.core.panel.Panel'> 
Dimensions: 4 (items) x 11 (major) x 7 (minor) 
Items: Price to Volume 
Major axis: 9:57:52 AM to 9:59:14 AM 
Minor axis: FUEL to XRA 

In [36]: panel = df.set_index(['TimeStamp', 'Symbol']).sortlevel(0).to_panel() 

In [37]: panel['Price'] 
Out[37]: 
Symbol  FUEL GBR MPET ORBC SUNH TBET  XRA 
TimeStamp            
9:57:52 AM  NaN 3.75 1.42 NaN NaN NaN  NaN 
9:58:08 AM  NaN NaN NaN NaN NaN NaN 3.6167 
9:58:20 AM  NaN 3.80 NaN NaN NaN NaN  NaN 
9:58:24 AM  NaN 3.83 NaN NaN NaN NaN  NaN 
9:58:40 AM 3.8544 NaN NaN NaN NaN NaN  NaN 
9:58:47 AM 3.8599 NaN NaN NaN NaN NaN  NaN 
9:59:02 AM  NaN NaN NaN 3.4 NaN NaN  NaN 
9:59:05 AM  NaN NaN NaN NaN NaN 2.18  NaN 
9:59:09 AM 3.9099 NaN NaN NaN 4.37 NaN  NaN 
9:59:11 AM 3.9490 NaN NaN NaN NaN NaN  NaN 
9:59:14 AM  NaN NaN NaN NaN NaN 2.19  NaN 

si può quindi generare alcune trame da tali dati.

nota che i timestamp sono ancora come stringhe-- Immagino che possano essere convertiti in oggetti Python datetime.time e le cose potrebbero essere un po 'più facili da usare. Non ho molti piani per fornire un sacco di supporto per tempi grezzi rispetto a timestamp (data + ora) ma se c'è bisogno di abbastanza persone suppongo di poter essere convinto :)

Se si hanno più osservazioni su un secondo per un singolo simbolo, alcuni dei metodi sopra descritti non funzioneranno. Ma voglio creare un supporto migliore per questo nelle prossime versioni di panda, quindi conoscere i tuoi casi d'uso mi sarà utile-- considera l'adesione alla mailing list (pystatsmodels)

+0

Grazie. Mi unirò a pystatsmodels: se cercherete di imbattersi in noob con casi d'uso, potrei essere un territorio fertile. – kavu

+0

Se per tempi non elaborati intendi solo numeri interi con forse una frequenza di campionamento, ecco un upvote. L'intero mondo delle registrazioni scientifiche è alla disperata ricerca di un'estensione di TimeSeries in quella direzione ... – meteore