2015-09-06 35 views
0

我是熊貓新手。我有我想要按日期排序,並計算每個ID,並在一個日期內的日期和時間返回以下數據(股票價格)用python對熊貓進行多字段索引

id,date,time,price 
0,2015-01-01,9:00,21.72 
1,2015-01-01,9:00,17.65 
2,2015-01-01,9:00,54.24 
0,2015-01-01,11:00,21.82 
1,2015-01-01,11:00,18.65 
2,2015-01-01,11:00,52.24 
0,2015-01-02,9:00,21.02 
1,2015-01-02,9:00,19.01 
2,2015-01-02,9:00,50.21 
0,2015-01-02,11:00,20.61 
1,2015-01-02,11:00,18.70 
2,2015-01-02,11:00,51.21 
... 
... 

。我想這

import pandas as pd 
import numpy as np 

df = pd.read_csv("/path/to/csv", index_col=[0,2,1]) 
df['returns'] = df['price'].pct_change() 

然而,回報是在它們出現的順序在整個IDS計算。任何想法如何正確地做到這一點?我也想訪問數據爲

price_0 = df['id'==0]['date'=='2014-01-01'][time=='9:00']['price'] 
+0

你應該指明你期待的輸出? –

回答

0

假設這些都是在你的數據框的列(並且沒有被索引),然後你按日期,時間,和ID在價格上要組。然後,您將id卸載,這有效地創建了一個數據透視表,其中包含日期和時間作爲行和id作爲列。然後您需要使用pct_change來實現您的目標。

returns = df.groupby(['date', 'time', 'id']).price.first().unstack().pct_change() 

>>> returns 
id     0   1   2 
date time        
1/1/15 11:00  NaN  NaN  NaN 
     9:00 -0.004583 -0.053619 0.038285 
1/2/15 11:00 -0.051105 0.059490 -0.055863 
     9:00 0.019893 0.016578 -0.019527 

但是,將日期和時間組合成時間戳可能會更好。假設你的日期和時間是文本表示,下面應該工作:

df['timestamp'] = df.apply(lambda row: pd.Timestamp(row.date + ' ' + row.time), axis=1) 

然後,就組上的時間戳和ID,並拆散的ID。

returns = df.groupby(['timestamp, 'id']).price.first().unstack('id').pct_change() 

>>> returns 
id       0   1   2 
timestamp           
2015-01-01 09:00:00  NaN  NaN  NaN 
2015-01-01 11:00:00 0.004604 0.056657 -0.036873 
2015-01-02 09:00:00 -0.036664 0.019303 -0.038859 

你會的指數回報給定的安全如下:

>>> returns.ix['2015-01-02 9:00'].loc[1] 
0.0193029490616623 
+0

謝謝。在第一種情況下(日期和時間未組合),如何訪問個人ID並返回returns.ix ['2015-01-02'] ['9:00']不起作用或某些組合我試過了。 – Vitter