2013-02-01 15 views
9

द्वारा इंट्रा डे टाइम्सरीज को समूहीकृत करना मेरे पास कई दिनों में लॉग रिटर्न की एक इंट्रा डे श्रृंखला है जो मैं दैनिक ओएचएलसी को डाउनसमूल करना चाहता हूं। मैं कुछ कर सकता हूं जैसेपांडस -

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

लेकिन यह प्रत्येक कॉल पर cumsum की गणना करने में अक्षम लगता है। क्या पहले cumsums की गणना करने का कोई तरीका है और फिर डेटा पर 'ओहक्ल' लागू करें?

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 से ठंडा 'टाइमग्राउपर' चाल का उपयोग करें, और आपको एक अच्छा समाधान मिला। – cronos

+0

संस्करण 0.10.1 में मुझे 'DataFrameGroupBy' क्लास – Zelazny7

+0

की' ohlc' विधि का उपयोग करते समय 'NotImplementedError' प्राप्त हो रहा है, 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 
संबंधित मुद्दे