使用python中的pandas对多个字段进行索引

时间:2015-09-06 04:16:31

标签: python pandas indexing

我是熊猫新手。我有以下数据(股票价格)

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
...
...

我想按日期排序并计算每个ID的回报以及日期内的日期和时间。我试过这个

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()

但是,返回是按ID出现的顺序计算的。知道如何正确地做到这一点?我也希望以

的形式访问数据
price_0 = df['id'==0]['date'=='2014-01-01'][time=='9:00']['price']

1 个答案:

答案 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