2015-09-06 5 views
0

Я новичок в Pandas. У меня есть следующие данные (цены акции)Индексирование несколькими полями с pandas в 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() 

Однако возвраты рассчитываются через идентификаторы в том порядке, в котором они отображаются. Любая идея, как это сделать правильно? Я также хотел бы получить доступ к данным, как

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

Вы должны указать, что вы ожидаете в качестве вывода? –

ответ

0

Если предположить, что это те столбцы в dataframe (и никто не являются индексом), то вы хотите сгруппировать по дате, времени и ид по цене. Затем вы удаляете идентификатор, который эффективно создает сводную таблицу с датами и временем в виде строк и идентификаторов в качестве столбцов. Затем вы должны использовать 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) 

Тогда просто группа на метки времени и идентификатор, и поместить значение идентификатор.

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

Спасибо. В первом случае (когда дата и время не объединены), как мне получить доступ к отдельному идентификатору и возвращает returns.ix ['2015-01-02'] ['9:00'] не работает или некоторые из комбинаций Я пытался. – Vitter

Смежные вопросы