2013-02-01 2 views
9

일일 오클로 낮추려는 여러 날에 걸친 일련의 일지 기록이 있습니다. 나는 비슷한 것을 할 수있다팬더 (Pandas) - 날짜로 날 내부 일람표 그룹화하기

hi = series.resample('B', how=lambda x: np.max(np.cumsum())) 
low = series.resample('B', how=lambda x: np.min(np.cumsum())) 

그러나 각 호출마다 cumsum을 계산하는 것은 비효율적 인 것처럼 보입니다. 먼저 cumsum을 계산 한 다음 데이터에 'ohcl'을 적용하는 방법이 있습니까?

1999-08-09 12:30:00-04:00 -0.000486 
1999-08-09 12:31:00-04:00 -0.000606 
1999-08-09 12:32:00-04:00 -0.000120 
1999-08-09 12:33:00-04:00 -0.000037 
1999-08-09 12:34:00-04:00 -0.000337 
1999-08-09 12:35:00-04:00 0.000100 
1999-08-09 12:36:00-04:00 0.000219 
1999-08-09 12:37:00-04:00 0.000285 
1999-08-09 12:38:00-04:00 -0.000981 
1999-08-09 12:39:00-04:00 -0.000487 
1999-08-09 12:40:00-04:00 0.000476 
1999-08-09 12:41:00-04:00 0.000362 
1999-08-09 12:42:00-04:00 -0.000038 
1999-08-09 12:43:00-04:00 -0.000310 
1999-08-09 12:44:00-04:00 -0.000337 
... 
1999-09-28 06:45:00-04:00 0.000000 
1999-09-28 06:46:00-04:00 0.000000 
1999-09-28 06:47:00-04:00 0.000000 
1999-09-28 06:48:00-04:00 0.000102 
1999-09-28 06:49:00-04:00 -0.000068 
1999-09-28 06:50:00-04:00 0.000136 
1999-09-28 06:51:00-04:00 0.000566 
1999-09-28 06:52:00-04:00 0.000469 
1999-09-28 06:53:00-04:00 0.000000 
1999-09-28 06:54:00-04:00 0.000000 
1999-09-28 06:55:00-04:00 0.000000 
1999-09-28 06:56:00-04:00 0.000000 
1999-09-28 06:57:00-04:00 0.000000 
1999-09-28 06:58:00-04:00 0.000000 
1999-09-28 06:59:00-04:00 0.000000 

답변

15
df.groupby([df.index.year, df.index.month, df.index.day]).transform(np.cumsum).resample('B', how='ohlc') 

나는 이것이 내가 원하는 것을 할 수 있다고 생각하지만 테스트해야합니다.

편집 : zelazny7의 repsonse 후 :

df.groupby(pd.TimeGrouper('D')).transform(np.cumsum).resample('D', how='ohlc') 

작품도 내 이전 솔루션보다 더 효율적입니다.

+0

잘 작동하는 것으로 보입니다 (0.9.1 사용). 이제'[df.index.year ...] 대신 @ Zelazny7의 멋진'TimeGrouper' 트릭을 사용하면 멋진 해결책을 얻을 수 있습니다. – cronos

+0

버전 0.10.1에서는'DataFrameGroupBy' 클래스의'ohlc' 메소드를 사용할 때'NotImplementedError'가 나타납니다. – Zelazny7

+0

0.9.2.dev-61766ec에서도 작동하는 것으로 보입니다. – signalseeker

4

리샘플링 제안을 작동시키지 못했습니다. 행운이 있었나요? 여기

from io import BytesIO 
from pandas import * 

text = """1999-08-09 12:30:00-04:00 -0.000486 
1999-08-09 12:31:00-04:00 -0.000606 
1999-08-09 12:32:00-04:00 -0.000120 
1999-08-09 12:33:00-04:00 -0.000037 
1999-08-09 12:34:00-04:00 -0.000337 
1999-08-09 12:35:00-04:00 0.000100 
1999-08-09 12:36:00-04:00 0.000219 
1999-08-09 12:37:00-04:00 0.000285 
1999-08-09 12:38:00-04:00 -0.000981 
1999-08-09 12:39:00-04:00 -0.000487 
1999-08-09 12:40:00-04:00 0.000476 
1999-08-09 12:41:00-04:00 0.000362 
1999-08-09 12:42:00-04:00 -0.000038 
1999-08-09 12:43:00-04:00 -0.000310 
1999-08-09 12:44:00-04:00 -0.000337""" 

df = read_csv(BytesIO(text), sep='\s+', parse_dates=[[0,1]], index_col=[0], header=None) 

나는 사전의 사전을 만들 다음은 영업일 레벨에서 데이터를 집계 한 패스에 OHLC 통계를 계산하는 방법입니다. 외부 키는 함수를 적용 할 열을 참조합니다. 내부 키에는 집계 함수의 이름이 들어 있고 내부 값은 적용 할 함수입니다.

f = {2: {'O':'first', 
     'H':'max', 
     'L':'min', 
     'C':'last'}} 

df.groupby(TimeGrouper(freq='B')).agg(f) 

Out: 
        2 
        H   C   L   O 
1999-08-09 0.000476 -0.000337 -0.000981 -0.000486