2015-09-06 53 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