2012-06-11 3 views
1

저는 파이썬 (pandas)을 사용하여 데이터 집합을 분석하고 있습니다. (파이썬은 너무 굉장합니다, 오픈 소스의 힘은 놀랍습니다). 내 데이터 집합의 특정 부분에 문제가 있습니다.중복 타임 스탬프를 팬더로 집계하는 방법은 무엇입니까?

나는 다음과 같은 데이터 세트

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 

이 그리고 내가 데이터를로드하는 팬더를 사용하고

... 계속된다. 이 후, 나는 다음과 같은 일을 할 수 있기를 바랄 것이다. 중복되는 시간의 볼륨 가중 평균을 취한다.

즉 오전 8시 1 분 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

파업 및 계약 열에 다시 데이터 프레임에 다시 추가하려고합니다. 그러나 v.ticker는 데이터 프레임의 위치와 티커 자체를 반환하기 때문에 올바르게 추가되지 않습니다. 제가 쓴 : pds.DataFrame ([ '시간'K '가격':(v.price * v.volume) .sum()/v.volume.sum() '부피'를 volume.mean a.groupby ([ 'time'])], columns = [ 'time', 'price', 'volume')에서 k의 경우 v.ticker, 'strike': v.strike) ','ticker ','strike ']) – Andrew

+0

@ user1449148 - 어떻게 든 집계해야합니다. v. ticker.max(), 'strike': v.strike.max()'는 원래 값이 모두 동일한 경우 동일한 값을 반환합니다. – eumiro

관련 문제