2012-06-11 1 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

Я пытаюсь добавить обратно в столбец удара и контракта обратно в dataframe. однако, поскольку v.ticker возвращает как позицию в фрейме данных, так и сам тикер, он не добавляет правильно. Я написал: pds.DataFrame (['время ": k,' цена ':(v.price * v.volume) .sum()/v.volume.sum(),' volume ': volume.mean(), 'ticker': v.ticker, 'strike': v.strike)} для k, v в a.groupby (['time'])], columns = ['time', 'price', 'volume ',' ticker ',' strike ']) – Andrew

+0

@ user1449148 - вам нужно как-то их заполнить. Попробуйте «тикер»: v.ticker.max(), «strike»: v.strike.max() ', который возвращает одно и то же значение, если оба исходных значения идентичны. – eumiro

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

  • Нет связанных вопросов^_^