2012-03-04 66 views
6

這是我第一次嘗試熊貓。我認爲我有一個合理的使用案例,但我磕磕絆絆。我想將製表符分隔的文件加載到熊貓數據框中,然後按照符號對它進行分組,並使用時間戳列索引的x.axis對其進行繪圖。這裏是數據的一個子集:熊貓DataFrame - 所需的索引有重複值

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 

注意關於TimeStamp列的兩件事情;

  1. 它具有重複值和
  2. 的間隔是不規則的。

我想我可以做這樣的事情......

from pandas import * 
import pylab as plt 

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

df.plot() 
plt.show() 

但read_csv方法拋出一個異常「試圖列1-X作爲指標,但發現重複」。有沒有一個選項可以讓我指定一個具有重複值的索引列?

我也有興趣將不規則的時間戳間隔調整爲一秒鐘的分辨率,我仍然希望爲給定的秒鐘繪製多個事件,但也許我可以引入一個唯一的索引,然後將我的價格與它對齊?

回答

4

我創建了幾個問題,剛纔來解決某些功能/便利,我覺得這是不錯的:GH-856GH-857GH-858

我們目前正在努力的時間序列功能的改造和做比對其次是現在可能解決方案(雖然不是重複的,所以需要編寫一些功能)。我也想更好地支持重複時間戳。然而,這是真的面板(3D)的數據,這樣就可能會改變事物的一種方式如下:

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 

注意,這創造了一個多指標。我本來可以另一種方式:

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 

,你可以在一個真正的面板格式得到這個數據,像這樣:

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 

你就可以生成從該數據的一些情節。

請注意,時間戳仍然是字符串 - 我想他們可以轉換爲Python的datetime.time對象,事情可能會更容易處理。我沒有太多的計劃來提供對原始時間與時間戳(日期+時間)的大量支持,但是如果足夠的人需要它,我想我可以確信:)

如果您有多個觀測值對於單個符號,那麼上面的一些方法將不起作用。但是我想在即將發佈的大熊貓中爲它提供更好的支持,因此瞭解您的使用案例對我會有幫助 - 考慮加入郵件列表(pystatsmodels)

+0

謝謝。我會加入pystats模型 - 如果你正在尋找用例的絆腳石,我可能會變得肥沃。 – kavu 2012-03-04 22:01:08

+0

如果按原始時間,你的意思可能是一個採樣率的整數,這裏是一個upvote。科學錄音的整個世界都渴望延長TimeSeries的方向...... – meteore 2012-10-19 09:05:28