2013-02-01 36 views
9

Tôi có chuỗi trả về nhật ký trong ngày trong nhiều ngày mà tôi muốn giảm dần xuống hàng ngày. Tôi có thể làm điều gì đó nhưGấu trúc - nhóm các khoảng thời gian trong ngày theo ngày

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

Nhưng có vẻ như không hiệu quả khi tính toán cumsum cho mỗi cuộc gọi. Có cách nào để tính toán cumsums đầu tiên và sau đó áp dụng 'ohcl' cho dữ liệu?

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 

Trả lời

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

Tôi nghĩ rằng đây có thể là những gì tôi muốn nhưng tôi phải kiểm tra.

EDIT: Sau repsonse zelazny7 của:

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

công trình và cũng là hiệu quả hơn so với giải pháp trước đây của tôi.

+0

Dường như hoạt động tốt (sử dụng 0.9.1). Bây giờ hãy sử dụng thủ thuật 'TimeGrouper' thú vị từ @ Zelazny7 thay vì' [df.index.year ...] ', và bạn có một giải pháp tốt đẹp. – cronos

+0

Trong phiên bản 0.10.1, tôi nhận được 'NotImplementedError' khi sử dụng phương thức' ohlc' của lớp 'DataFrameGroupBy' – Zelazny7

+0

Dường như cũng làm việc trong 0.9.2.dev-61766ec. – signalseeker

4

Tôi không thể yêu cầu đề xuất mẫu lại của bạn hoạt động. Bạn đã có bất kỳ may mắn? Dưới đây là một cách để tổng hợp dữ liệu ở mức độ ngày làm việc và tính toán các số liệu thống kê OHLC trong một pass:

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) 

Ở đây tôi tạo ra một từ điển của từ điển. Khóa ngoài tham chiếu đến các cột bạn muốn áp dụng các hàm. Khóa bên trong chứa tên của các hàm tổng hợp của bạn và các giá trị bên trong là các hàm bạn muốn áp dụng:

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 
Các vấn đề liên quan