2015-10-30 4 views
6

मैं एक बहुत ही सरल सेटअपस्पीड अप कस्टम एकत्रीकरण कार्यों

index period ask bid 
00:00:00.126 42125 112.118 112.117 
00:00:00.228 42125 112.120 112.117 
00:00:00.329 42125 112.121 112.120 
00:00:00.380 42125 112.123 112.120 
00:00:00.432 42125 112.124 112.121 
00:00:00.535 41126 112.124 112.121 
00:00:00.586 41126 112.122 112.121 
00:00:00.687 41126 112.124 112.121 
00:00:01.198 41126 112.124 112.120 
00:00:01.737 41126 112.124 112.121 
00:00:02.243 41126 112.123 112.121 

अब मैं कुल अवधि

g=df.groupby('period') 
को pandas.groupy का उपयोग

अवधि के अनुसार न्यूनतम और अधिकतम कीमतें प्राप्त करना आसान है, उदाहरण के लिए

import numpy as np 
res=g.agg({'ask': [np.amax, np.amin]}) 

यह भी काफी तेज़ है। अब, मैं प्रति अवधि पहले और अंतिम मूल्य भी चाहता हूं। यह वह जगह है जहां मुसीबत शुरू होती है। बेशक, मैं कर सकते हैं:

res=g.agg({'ask': lambda x: x[0]}) 

और यह काम करता है, मूल रूप से, लेकिन यह बड़े डेटा सेट के लिए बहुत धीमी है। असल में, एक पायथन फ़ंक्शन कॉल के लिए कॉल ओवरहेड बस विशाल है।

क्या किसी को np.amax के समान एक numpy फ़ंक्शन के बारे में पता है जो समूह के पहले या अंतिम तत्व को वापस कर देगा? मुझे एक नहीं मिला। iloc [0] चाल नहीं करता है क्योंकि यह किसी ऑब्जेक्ट की विधि है और इसलिए, मैं इसे g.agg पर फ़ंक्शन के रूप में पास नहीं कर सकता, क्योंकि मेरे पास इस चरण में ऑब्जेक्ट नहीं है (यही वह है जो लैम्ब्डा के लिए जरूरी है)।

अब, मैं आलसी नहीं हूं, और मैंने साइथन का उपयोग करके अपने लिए ऐसा करने की कोशिश की।

import numpy as np 
cimport numpy as np 

cpdef double first(np.ndarray array_series): 
    return array_series[0] 

लेकिन पांडा एक एकत्रीकरण समारोह के रूप में यह स्वीकार नहीं करेंगे क्योंकि यह एक np.ndarray के बजाय एक pd.core.series-वस्तु से गुजरता है। (किसी को दूसरे से नहीं निकलता है, संकलक इसे पहचान नहीं पाता है।)

क्या कोई जानता है कि साइथन फ़ंक्शन कैसे लिखना है जो पाइथन कॉल ओवरहेड के बिना एक पांडा श्रृंखला स्वीकार करता है?

+0

आप 'कोशिश की df.groupby ('अवधि') है पहला है।() 'और' df.groupby ('अवधि')। अंतिम() '? – EdChum

+0

धन्यवाद, यह एक अच्छा संकेत है। यह काम करता है, लेकिन मैं पहले() - फ़ंक्शन को g.agg (...) में पास नहीं कर सकता, क्या मैं कर सकता हूं? मैं इसे बेहतर पसंद करूंगा, क्योंकि मैं एक बार में कई अलग-अलग एकत्रीकरण कार्यों को लागू करना चाहता हूं (अमीन, अमेक्स, पहले, ...)। यह इसका उपयोग करने के लिए एक कामकाज होगा और फिर मुझे लगता है कि मेरे अंतिम डेटासेट को मैन्युअल रूप से इकट्ठा करें। – user5507059

+0

हाँ आप कर सकते हैं, कृपया मेरा उत्तर – EdChum

उत्तर

3

IIUC तो आप क्या कर सकते हैं first और last:

In [270]: 
g=df.groupby('period') 
res=g.agg({'ask': [np.amax, np.amin, 'first', 'last']}) 
res 

Out[270]: 
      ask       
      amax  amin first  last 
period          
41126 112.124 112.122 112.124 112.123 
42125 112.124 112.118 112.118 112.124 
+0

देखें आप बहुत ही अच्छे हैं। धन्यवाद!! – user5507059

+0

लेकिन एक कदम आगे जा रहा है। अगर मैं एक गैर-मानक कस्टम एकत्रीकरण समारोह चाहता हूं तो क्या होगा। क्या मैं इसे सिथोनिज़ कर सकता हूं? – user5507059

+0

शायद लेकिन मैं एक साइथन विशेषज्ञ नहीं हूं – EdChum

1

एक वैकल्पिक बस resample करने और प्रयोग OHLC (open=first,close=last,high=max,low=min)

In [56]: df = DataFrame({'A' : np.arange(10), 'B' : pd.date_range('20130101',periods=5).tolist()*2}) 

In [57]: df 
Out[57]: 
    A   B 
0 0 2013-01-01 
1 1 2013-01-02 
2 2 2013-01-03 
3 3 2013-01-04 
4 4 2013-01-05 
5 5 2013-01-01 
6 6 2013-01-02 
7 7 2013-01-03 
8 8 2013-01-04 
9 9 2013-01-05 

In [58]: df.set_index('B').resample('D',how='ohlc') 
Out[58]: 
       A    
      open high low close 
B        
2013-01-01 0 5 0  5 
2013-01-02 1 6 1  6 
2013-01-03 2 7 2  7 
2013-01-04 3 8 3  8 
2013-01-05 4 9 4  9 
संबंधित मुद्दे