2012-06-11 70 views
1

我正在使用python(專門用於分析數據集)(pandas)。 (Python太棒了,開源的力量是驚人的)。我遇到了我的數據集的特定部分的問題。如何將重複時間戳與大熊貓聚合?

我有以下的數據集,

time,contract,ticker,expiry,strike,quote,price,volume 
08:01:08,C,PXA,20100101,4000,A,57.8,60 
08:01:11,C,PXA,20100101,4000,A,58.4,60 
08:01:12,C,PXA,20100101,4000,A,58,60 
08:01:16,C,PXA,20100101,4000,A,58.4,60 
08:01:16,C,PXA,20100101,4000,A,58,60 
08:01:21,C,PXA,20100101,4000,A,58.4,60 
08:01:21,C,PXA,20100101,4000,A,58,60 

,並繼續...

我使用熊貓加載數據。在此之後,我希望能夠做到以下幾點,取得重複時間的音量加權平均值。

即因爲在時間08:01:16有兩個要求,所以我想計算基於體積的平均價格(58.4 * 60 + 58 * 60)/(60 + 60)和平均值(60 + 60)/ 2。

+0

如何讀取數據?熊貓通常不接受索引中的重複項。 – eumiro

+0

我使用pds.read_csv,它讀取數據沒有問題。它所做的是讓我的第一列成爲日期等等。 – Andrew

回答

9
In [28]: a = pd.read_csv('aa.csv') 

In [29]: a 
Out[29]: 
     time contract ticker expiry strike quote price volume 
0 08:01:08  C PXA 20100101 4000  A 57.8  60 
1 08:01:11  C PXA 20100101 4000  A 58.4  60 
2 08:01:12  C PXA 20100101 4000  A 58.0  60 
3 08:01:16  C PXA 20100101 4000  A 58.4  60 
4 08:01:16  C PXA 20100101 4000  A 58.0  60 
5 08:01:21  C PXA 20100101 4000  A 58.4  60 
6 08:01:21  C PXA 20100101 4000  A 58.0  60 

In [30]: pd.DataFrame([{'time': k, 
         'price': (v.price * v.volume).sum()/v.volume.sum(), 
         'volume': v.volume.mean()} 
         for k,v in a.groupby(['time'])], 
         columns=['time', 'price', 'volume']) 
Out[30]: 
     time price volume 
0 08:01:08 57.8  60 
1 08:01:11 58.4  60 
2 08:01:12 58.0  60 
3 08:01:16 58.2  60 
4 08:01:21 58.2  60 
+0

謝謝。你太棒了!!! – Andrew

+0

我正在嘗試在罷工和合約列中重新加入數據框。然而,因爲v.ticker返回數據框中的位置和ticker本身,它不會正確添加。 i寫道: pds.DataFrame(['time':k,'price':(v.price * v.volume).sum()/ v.volume.sum(),'volume':volume.mean (),'ticker':v.ticker,'strike':v.strike)} for k,v in a.groupby(['time'])],columns = ['time','price','volume ','ticker','strike']) – Andrew

+0

@ user1449148 - 您必須以某種方式彙總它們。嘗試使用「ticker」:v.ticker.max(),'strike':v.strike.max()',如果兩個原始值相同,則返回相同的值。 – eumiro