2011-06-24 13 views
10

का उपयोग करके दो बारियों के बीच सहसंबंध कैसे प्राप्त करें मेरे पास तापमान की तारीख के दो सेट हैं, जिनमें नियमित (लेकिन अलग) समय अंतराल पर रीडिंग होते हैं। मैं डेटा के इन दो सेटों के बीच सहसंबंध प्राप्त करने की कोशिश कर रहा हूं।पांडस

मैं ऐसा करने के लिए Pandas के साथ खेल रहा हूं। मैंने दो बार टाइम्स तैयार किए हैं, और TimeSeriesA.corr(TimeSeriesB) का उपयोग कर रहा हूं। हालांकि, यदि 2 टाइमरीज़ में समय बिल्कुल मेल नहीं खाता है (वे आम तौर पर सेकंड से बंद होते हैं), तो मुझे नल को उत्तर के रूप में मिलता है। मैं एक सभ्य जवाब मिल सकता है अगर मैं कर सकता:

क) को जोड़/भरने प्रत्येक TimeSeries (मैं जानता हूँ कि इस पांडा में संभव है में कई बार याद आ रही, मैं सिर्फ यह कैसे करना है)

ख पता नहीं है) पाइथन डेटाटाइम ऑब्जेक्ट्स से सेकंड को पट्टी करें (मिनटों को बदलने के बिना 00 सेकंड सेट करें)। मैं सटीकता की एक डिग्री खो देंगे, लेकिन नहीं एक बड़ी राशि

ग) दो timeSeries

घ) की दो सूचियों के बीच सह-संबंध प्राप्त करने के लिए अजगर में कुछ का उपयोग करें के बीच संबंध प्राप्त करने के लिए पांडा में कुछ और का प्रयोग करें समय पर ध्यान में रखते हुए, प्रत्येक फ्लोट में एक समान डेटाटाइम ऑब्जेक्ट होता है।

किसी के पास कोई सुझाव है?

उत्तर

12

आपके पास पांडा का उपयोग करके कई विकल्प हैं, लेकिन आपको यह निर्णय लेना होगा कि डेटा को संरेखित करने के लिए यह समझ में आता है कि वे एक ही इंस्टेंट में नहीं होते हैं।

In [15]: ts 
    Out[15]: 
    2000-01-03 00:00:00 -0.722808451504 
    2000-01-04 00:00:00 0.0125041039477 
    2000-01-05 00:00:00 0.777515530539 
    2000-01-06 00:00:00 -0.35714026263 
    2000-01-07 00:00:00 -1.55213541118 
    2000-01-10 00:00:00 -0.508166334892 
    2000-01-11 00:00:00 0.58016097981 
    2000-01-12 00:00:00 1.50766289013 
    2000-01-13 00:00:00 -1.11114968643 
    2000-01-14 00:00:00 0.259320239297 



    In [16]: ts2 
    Out[16]: 
    2000-01-03 00:00:30 1.05595278907 
    2000-01-04 00:00:30 -0.568961755792 
    2000-01-05 00:00:30 0.660511172645 
    2000-01-06 00:00:30 -0.0327384421979 
    2000-01-07 00:00:30 0.158094407533 
    2000-01-10 00:00:30 -0.321679671377 
    2000-01-11 00:00:30 0.977286027619 
    2000-01-12 00:00:30 -0.603541295894 
    2000-01-13 00:00:30 1.15993249209 
    2000-01-14 00:00:30 -0.229379534767 

आप इन 30 सेकंड से बंद होती हैं देख सकते हैं:

समय श्रृंखला में से एक में समय "के रूप में" मानों का उपयोग करें, यहाँ एक उदाहरण है। reindex समारोह आप डेटा संरेखित करने के लिए सक्षम है, जबकि आगे मूल्यों भरने (हो रही मूल्य "के रूप में"):

In [17]: ts.reindex(ts2.index, method='pad') 
    Out[17]: 
    2000-01-03 00:00:30 -0.722808451504 
    2000-01-04 00:00:30 0.0125041039477 
    2000-01-05 00:00:30 0.777515530539 
    2000-01-06 00:00:30 -0.35714026263 
    2000-01-07 00:00:30 -1.55213541118 
    2000-01-10 00:00:30 -0.508166334892 
    2000-01-11 00:00:30 0.58016097981 
    2000-01-12 00:00:30 1.50766289013 
    2000-01-13 00:00:30 -1.11114968643 
    2000-01-14 00:00:30 0.259320239297 

    In [18]: ts2.corr(ts.reindex(ts2.index, method='pad')) 
    Out[18]: -0.31004148593302283 

ध्यान दें कि 'पैड' भी 'ffill' द्वारा एलियास है (लेकिन केवल के बहुत नवीनतम संस्करण में इस समय के रूप में गिटहब पर पांडा!)।

अपने सभी डेटाटाइम से स्ट्रिप सेकेंड। यह करने के लिए सबसे अच्छा तरीका है का उपयोग करने के rename

In [25]: ts2.rename(lambda date: date.replace(second=0)) 
    Out[25]: 
    2000-01-03 00:00:00 1.05595278907 
    2000-01-04 00:00:00 -0.568961755792 
    2000-01-05 00:00:00 0.660511172645 
    2000-01-06 00:00:00 -0.0327384421979 
    2000-01-07 00:00:00 0.158094407533 
    2000-01-10 00:00:00 -0.321679671377 
    2000-01-11 00:00:00 0.977286027619 
    2000-01-12 00:00:00 -0.603541295894 
    2000-01-13 00:00:00 1.15993249209 
    2000-01-14 00:00:00 -0.229379534767 

ध्यान दें कि अगर नाम बदलने वहाँ का कारण बनता है नकली दिनांकों होने के लिए एक Exception फेंक दिया जाएगा है।

In [31]: ts_mean = ts.groupby(lambda date: date.replace(second=0)).mean() 

    In [32]: ts2_mean = ts2.groupby(lambda date: date.replace(second=0)).mean() 

    In [33]: ts_mean.corr(ts2_mean) 
    Out[33]: -0.31004148593302283 

ये आखिरी कोड के टुकड़े अगर आप काम नहीं कर सकता:

कुछ थोड़ा और अधिक उन्नत लिए, आप प्रत्येक मिनट के लिए औसत मान (जहां प्रति सेकंड कई टिप्पणियों है) सहसंबंधी करना चाहता था लगता है https://github.com/wesm/pandas से नवीनतम कोड नहीं है। .mean() ऊपर GroupBy ऑब्जेक्ट पर काम नहीं करता है .agg(np.mean)

आशा है कि इससे मदद मिलती है!

+0

हा, आप इसे प्राप्त करने से पहले प्राप्त कर चुके थे: -) ... –

+0

यदि मैं अंतिम भाग को सही तरीके से पढ़ रहा हूं, तो अंतिम भाग 00 और 60 सेकंड के बीच मानों के लिए माध्य का आकलन करता है (एक्सएक्स: एक्सएक्स: 30, एक्सएक्स नहीं: एक्सएक्स: 00), और एक्सएक्स: एक्सएक्स को परिणाम असाइन करता है : 00। इसके आस-पास का आसान तरीका 'date.replace (second = 30)' होगा, औसत प्रति मिनट प्राप्त करने का एक अत्यधिक जटिल तरीका होगा: 'ts_mean = seriesT.groupby (lambda दिनांक: date.replace (second = 0) अगर date.second <30 else date.replace (second = 0) + timedelta (मिनट = 1))। मतलब() ' – user814005