Pandas trama de dados - índice desejado tem valores duplicados

votos
6

Esta é a minha primeira vez a tentar Pandas. Acho que tenho um caso de uso razoável, mas estou tropeçando. Eu quero carregar um arquivo delimitado por tabulação em um Pandas trama de dados, em seguida, agrupá-lo pela Symbol e traçá-lo com as x.axis indexados pela coluna TimeStamp. Aqui é um subconjunto dos dados:

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

Observe duas coisas sobre a coluna TimeStamp;

  1. ele tem valores duplicados e
  2. os intervalos são irregulares.

Eu pensei que eu poderia fazer algo assim ...

from pandas import *
import pylab as plt

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

df.plot()
plt.show()

Mas o método read_csv levanta uma exceção Tentei colunas 1-X como índice, mas encontrou duplicatas. Existe uma opção que me permite especificar uma coluna de índice com valores duplicados?

Eu também estaria interessado em alinhar os meus intervalos timestamp irregulares a um segunda resolução, eu ainda gostaria de traçar vários eventos para um determinado segundo, mas talvez eu pudesse apresentar um índice exclusivo, em seguida, alinhe meus preços para ele?

Publicado 04/03/2012 em 17:58
fonte usuário
Em outras línguas...                            


1 respostas

votos
5

Eu criei várias questões só agora abordar algumas características / conveniências que eu acho que seria bom ter: GH-856 , GH-857 , GH-858

Estamos atualmente trabalhando em uma reformulação das capacidades de séries temporais e fazer o alinhamento para segundo lugar resolução é possível agora (embora não com duplicatas, então seria necessário para escrever algumas funções para isso). Eu também quero apoiar timestamps duplicados em uma maneira melhor. No entanto, este é realmente o painel de dados (3D), então uma maneira que você pode alterar as coisas é o seguinte:

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

note que este criou um MultiIndex. Outra maneira que eu poderia ter chegado a este:

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

você pode obter esses dados em um formato de painel de verdade assim:

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

então você pode gerar algumas parcelas de dados.

notar aqui que a data e hora ainda são tão strings-- Eu acho que eles poderiam ser convertidos em Python datetime.time objetos e as coisas podem ser um pouco mais fácil trabalhar com. Eu não tenho muitos planos para fornecer um grande apoio para os tempos vs. timestamps matérias-(data + tempo), mas se muita gente precisa dele Acho que posso ser convencido :)

Se você tiver várias observações sobre um segundo para um único símbolo, em seguida, alguns dos métodos acima não vai funcionar. Mas eu quero construir no melhor suporte para que nas próximas versões de pandas, para saber seus casos de uso será útil para mim-- considerar juntar-se a lista de discussão (pystatsmodels)

Respondeu 04/03/2012 em 18:35
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more