2012-03-04 13 views
6

Esta es la primera vez que pruebo pandas. Creo que tengo un caso de uso razonable, pero estoy dando tumbos. Quiero cargar un archivo delimitado por tabuladores en un Dataframe de Pandas, luego agruparlo por Symbol y trazarlo con el eje x indexado por la columna TimeStamp. Aquí hay un subconjunto de los datos:Pandas DataFrame - el índice deseado tiene valores duplicados

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 

Tenga en cuenta dos cosas acerca de la columna TimeStamp;

  1. tiene valores duplicados y
  2. los intervalos son irregulares.

pensé que podía hacer algo como esto ...

from pandas import * 
import pylab as plt 

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

df.plot() 
plt.show() 

Pero el método read_csv genera una excepción "columnas intentado los pasos 1-X como índice, pero encontré duplicados". ¿Hay alguna opción que me permita especificar una columna de índice con valores duplicados?

También me gustaría alinear mis intervalos irregulares de indicación de fecha y hora en una resolución de un segundo, aún así quisiera trazar varios eventos por un segundo dado, pero ¿podría introducir un índice único y luego alinear mis precios?

Respuesta

4

I creado varios problemas en este momento para hacer frente a algunas de las características/comodidades que creo que sería bueno tener: GH-856, GH-857, GH-858

Actualmente estamos trabajando en una renovación de las capacidades de series de tiempo y hacer la alineación en segundo lugar, la resolución ahora es posible (aunque no con duplicados, por lo que tendría que escribir algunas funciones para eso). También quiero apoyar marcas de tiempo duplicadas de una mejor manera. Sin embargo, esto es realmente panel (3D) de datos, así que una forma que es posible alterar las cosas es la siguiente:

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 que esto creó un MultiIndex. Otra forma podría haber conseguido esto:

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 

puede obtener estos datos en un cierto formato de panel de este 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 

A continuación, puede generar algunas parcelas de esos datos.

tenga en cuenta que las indicaciones de fecha y hora son todavía como cadenas-- Supongo que podrían convertirse en objetos Python datetime.time y podría ser un poco más fácil trabajar con ellas. No tengo muchos planes para proporcionar una gran cantidad de soporte para tiempos crudos frente a marcas de tiempo (fecha + hora) pero si suficientes personas lo necesitan, supongo que puedo estar convencido :)

Si tiene múltiples observaciones en un segundo para un solo símbolo, entonces algunos de los métodos anteriores no funcionarán. Pero quiero construir un mejor soporte para eso en próximos lanzamientos de pandas, así que conocer sus casos de uso me será útil. Considere unirse a la lista de correo (pystatsmodels)

+0

Gracias. Me uniré a pystatsmodels - si buscas noobs tropezables con casos de uso, podría ser territorio fértil. – kavu

+0

Si por tiempos crudos te refieres solo a enteros con quizás una tasa de muestreo, aquí hay un voto popular. El mundo entero de las grabaciones científicas está desesperado por una extensión de TimeSeries en esa dirección ... – meteore

Cuestiones relacionadas