2012-09-07 12 views
12

केडीबी + में aj फ़ंक्शन है जो आमतौर पर समय कॉलम के साथ तालिकाओं में शामिल होने के लिए उपयोग किया जाता है।केडीबी + जैसे पांडा में टाइम्सरी डेटा के लिए शामिल हैं?

यहां एक उदाहरण है जहां मेरे पास व्यापार और बोली तालिका है और मुझे हर व्यापार के लिए प्रचलित उद्धरण मिलता है।

q)5# t 
time   sym price size 
----------------------------- 
09:30:00.439 NVDA 13.42 60511 
09:30:00.439 NVDA 13.42 60511 
09:30:02.332 NVDA 13.42 100 
09:30:02.332 NVDA 13.42 100 
09:30:02.333 NVDA 13.41 100 

q)5# q 
time   sym bid ask bsize asize 
----------------------------------------- 
09:30:00.026 NVDA 13.34 13.44 3  16 
09:30:00.043 NVDA 13.34 13.44 3  17 
09:30:00.121 NVDA 13.36 13.65 1  10 
09:30:00.386 NVDA 13.36 13.52 21 1  
09:30:00.440 NVDA 13.4 13.44 15 17 

q)5# aj[`time; t; q] 
time   sym price size bid ask bsize asize 
----------------------------------------------------- 
09:30:00.439 NVDA 13.42 60511 13.36 13.52 21 1  
09:30:00.439 NVDA 13.42 60511 13.36 13.52 21 1  
09:30:02.332 NVDA 13.42 100 13.34 13.61 1  1  
09:30:02.332 NVDA 13.42 100 13.34 13.61 1  1  
09:30:02.333 NVDA 13.41 100 13.34 13.51 1  1 

मैं पांडा का उपयोग करके एक ही ऑपरेशन कैसे कर सकता हूं? मैं व्यापार और बोली डेटाफ्रेम के साथ काम कर रहा हूं जहां इंडेक्स डेटाटाइम 64 है।

In [55]: quotes.head() 
Out[55]: 
           bid ask bsize asize 
2012-09-06 09:30:00.026000 13.34 13.44  3  16 
2012-09-06 09:30:00.043000 13.34 13.44  3  17 
2012-09-06 09:30:00.121000 13.36 13.65  1  10 
2012-09-06 09:30:00.386000 13.36 13.52  21  1 
2012-09-06 09:30:00.440000 13.40 13.44  15  17 

In [56]: trades.head() 
Out[56]: 
          price size 
2012-09-06 09:30:00.439000 13.42 60511 
2012-09-06 09:30:00.439000 13.42 60511 
2012-09-06 09:30:02.332000 13.42 100 
2012-09-06 09:30:02.332000 13.42 100 
2012-09-06 09:30:02.333000 13.41 100 

मुझे लगता है कि पांडा के पास एक कार्य है लेकिन यह केवल डेटा ऑब्जेक्ट पर डेटाफ्रेम पर परिभाषित नहीं है। मुझे लगता है कि कोई भी श्रृंखला के माध्यम से लूप कर सकता है और उन्हें एक-एक करके संरेखित कर सकता है, लेकिन मुझे आश्चर्य है कि कोई बेहतर तरीका है या नहीं?

+1

इसे * रोलिंग जॉइन * – jangorecki

उत्तर

8

आप प्रश्न में उल्लेख किया है, प्रत्येक स्तंभ के माध्यम से पाशन आप के लिए काम करना चाहिए:

df1.apply(lambda x: x.asof(df2.index)) 

हम संभवतः एक शॉट में सभी स्तंभों करने के लिए DataFrame.asof की एक तेजी से NaN अनुभवहीन संस्करण बना सकते हैं। लेकिन अभी के लिए, मुझे लगता है कि यह सबसे सरल तरीका है।

+0

धन्यवाद भी कहा जाता है। मैं अभी इस दृष्टिकोण को ले रहा हूं। लेकिन एक NaN-naive संस्करण बहुत स्वागत है! – signalseeker

+1

https://gist.github.com/3686236 – signalseeker

13

मैं कुछ समय पहले अंडर विज्ञापित ordered_merge समारोह लिखा है:

In [27]: quotes 
Out[27]: 
         time bid ask bsize asize 
0 2012-09-06 09:30:00.026000 13.34 13.44  3  16 
1 2012-09-06 09:30:00.043000 13.34 13.44  3  17 
2 2012-09-06 09:30:00.121000 13.36 13.65  1  10 
3 2012-09-06 09:30:00.386000 13.36 13.52  21  1 
4 2012-09-06 09:30:00.440000 13.40 13.44  15  17 

In [28]: trades 
Out[28]: 
         time price size 
0 2012-09-06 09:30:00.439000 13.42 60511 
1 2012-09-06 09:30:00.439000 13.42 60511 
2 2012-09-06 09:30:02.332000 13.42 100 
3 2012-09-06 09:30:02.332000 13.42 100 
4 2012-09-06 09:30:02.333000 13.41 100 

In [29]: ordered_merge(quotes, trades) 
Out[29]: 
         time bid ask bsize asize price size 
0 2012-09-06 09:30:00.026000 13.34 13.44  3  16 NaN NaN 
1 2012-09-06 09:30:00.043000 13.34 13.44  3  17 NaN NaN 
2 2012-09-06 09:30:00.121000 13.36 13.65  1  10 NaN NaN 
3 2012-09-06 09:30:00.386000 13.36 13.52  21  1 NaN NaN 
4 2012-09-06 09:30:00.439000 NaN NaN NaN NaN 13.42 60511 
5 2012-09-06 09:30:00.439000 NaN NaN NaN NaN 13.42 60511 
6 2012-09-06 09:30:00.440000 13.40 13.44  15  17 NaN NaN 
7 2012-09-06 09:30:02.332000 NaN NaN NaN NaN 13.42 100 
8 2012-09-06 09:30:02.332000 NaN NaN NaN NaN 13.42 100 
9 2012-09-06 09:30:02.333000 NaN NaN NaN NaN 13.41 100 

In [32]: ordered_merge(quotes, trades, fill_method='ffill') 
Out[32]: 
         time bid ask bsize asize price size 
0 2012-09-06 09:30:00.026000 13.34 13.44  3  16 NaN NaN 
1 2012-09-06 09:30:00.043000 13.34 13.44  3  17 NaN NaN 
2 2012-09-06 09:30:00.121000 13.36 13.65  1  10 NaN NaN 
3 2012-09-06 09:30:00.386000 13.36 13.52  21  1 NaN NaN 
4 2012-09-06 09:30:00.439000 13.36 13.52  21  1 13.42 60511 
5 2012-09-06 09:30:00.439000 13.36 13.52  21  1 13.42 60511 
6 2012-09-06 09:30:00.440000 13.40 13.44  15  17 13.42 60511 
7 2012-09-06 09:30:02.332000 13.40 13.44  15  17 13.42 100 
8 2012-09-06 09:30:02.332000 13.40 13.44  15  17 13.42 100 
9 2012-09-06 09:30:02.333000 13.40 13.44  15  17 13.41 100 

यह आसानी से हो सकता है (अच्छी तरह से, कोई है जो कोड से परिचित है के लिए) बढ़ाया एक "बाएं में शामिल होने के" होने का KDB नकल उतार। मुझे इस मामले में एहसास है कि व्यापार डेटा को आगे बढ़ाने के लिए उचित नहीं है; बस समारोह को चित्रित करना।

+1

धन्यवाद, यह जानना बहुत अच्छा है। यह अनिवार्य रूप से यूजे (http://code.kx.com/wiki/Reference/uj) केडीबी में है! एजे कार्यक्षमता के लिए, मैं चांग के दृष्टिकोण के साथ जा रहा हूं लेकिन मैं बाद में कोड पर गंभीर स्टैब लेने की योजना बना रहा हूं। – signalseeker

+1

क्या यह उस मामले को सामान्यीकृत किया जा सकता है जहां डेटाफ्रेम में कई सीरीज़ एक साथ होती हैं, उदाहरण के लिए यदि टाइमस्टैम्प के अलावा डेटा में स्टॉक आईडी कॉलम भी था? (इस प्रकार हमारे पास हजारों समूह हो सकते हैं, और उनमें से प्रत्येक एक श्रृंखला है)। मुझे संदेह है कि हमें 'groupby()' और 'order_merge'' के मिश्रण की आवश्यकता होगी, लेकिन मैं इसे कैसे करना है इसके बारे में कुश्ती कर रहा हूं ... निश्चित रूप से, यह केवल 'ffill' के समग्र क्रम पर गलत होगा डेटाफ्रेम (मैं नहीं चाहता कि समूह अगले भर में आगे बढ़ने के आधार पर आगे बढ़े)। –

संबंधित मुद्दे