2012-06-14 23 views
9

मैं उत्कृष्ट मौसम संबंधी डायग्नोस्टिक डेटा की बड़ी मात्रा से निपटने के लिए उत्कृष्ट pandas पैकेज का उपयोग कर रहा हूं और मैं डेटा को एकसाथ सिलाई के रूप में जल्दी से आयामों से बाहर चला रहा हूं। प्रलेखन को देखते हुए, यह हो सकता है कि MultiIndex का उपयोग करके मेरी समस्या हल हो सकती है, लेकिन मुझे यकीन नहीं है कि यह मेरी स्थिति पर कैसे लागू करें - दस्तावेज़ीकरण यादृच्छिक डेटा और DataFrame एस के साथ मल्टी इंडेक्स बनाने के उदाहरण दिखाता है, लेकिन पूर्व में श्रृंखला नहीं है मौजूदा समय सारिणी डेटा।मैं अपने पांडा डेटा समूह को 3 से अधिक आयामों में कैसे सामान्यीकृत कर सकता हूं?

पृष्ठभूमि

बुनियादी डेटा संरचना मैं उपयोग कर रहा हूँ दो मुख्य क्षेत्रों में शामिल हैं:

  • metadata, जो वर्णन कर क्या नंबर दिए गए हैं कुंजी-मान जोड़ों से मिलकर शब्दकोश है
  • data, जो एक पांडा डेटा संरचना है जिसमें संख्याएं स्वयं हैं।

सबसे कम आम विभाजक, timeseries डेटा है तो बुनियादी संरचना data प्रविष्टि के रूप में एक पांडा Series वस्तु है, और metadata क्षेत्र बताता है कि उन संख्याओं को वास्तव में अधिक 10 मीटर हवा के लिए (उदाहरण के लिए वेक्टर आरएमएस त्रुटि हो सकती हैं प्रयोग टेस्ट 1 से 24 घंटे के पूर्वानुमान के लिए पूर्वी प्रशांत)।

मैं परिणाम को और अधिक उपयोगी बनाने और आसान संयोजनों की अनुमति देने के लिए विभिन्न समय-सारिणी को एक साथ जोड़कर देख रहा हूं। उदाहरण के लिए, मैं सभी अलग-अलग लीड टाइम्स देख सकता हूं - मेरे पास एक फ़िल्टर दिनचर्या है जो मेरी टाइमरीज़ लेती है जो लीड टाइम (उदाहरण के लिए प्रयोग, क्षेत्र इत्यादि) के लिए को छोड़कर एक ही मेटाडेटा प्रविष्टियां साझा करती है और एक नया ऑब्जेक्ट जहां metadata फ़ील्ड में केवल सामान्य प्रविष्टियां होती हैं (यानी Lead Time हटा दी गई है) और अब data फ़ील्ड Lead Time मान द्वारा दिए गए कॉलम लेबल के साथ एक पांडा DataFrame है। मैं इसे फिर से बढ़ा सकता हूं और कह सकता हूं कि मैं परिणामी फ्रेम और समूह उन्हें लेना चाहता हूं, साथ ही मुझे एक और प्रविष्टि अलग-अलग (उदाहरण के लिए Experiment) के साथ एक पांडा Panel देने के लिए। मेरी प्रविष्टि के लिए जहां आइटम इंडेक्स को Experiment मेटाडेटा मानों द्वारा घटक फ्रेम से दिया जाता है और ऑब्जेक्ट के नए मेटाडाटा में Lead Time या Experiment नहीं होता है।

जब मैं इन समग्र वस्तुओं से अधिक पुनरावृति, मैं पैनल कि उचित मेटाडाटा/डेटा जोड़ी को फिर से संगठित रूप में मैं समय सीमा के साथ फ्रेम से एक आयाम (यानी श्रृंखला छोड़ बदलती के लिए फ्रेम के लिए एक iterseries दिनचर्या और iterframes दिनचर्या है कॉलम में उसके माता-पिता प्लसLead Time फ़ील्ड कॉलम लेबल से लिया गया मान के साथ पुनर्स्थापित किया जाएगा) के सभी मेटाडेटा होंगे। यह बहुत अच्छा काम करता है।

समस्या

मैं आयाम समाप्त हो चुकी है (अप करने के लिए 3 डी एक पैनल के साथ) और मैं एक बार में सब कुछ गठबंधन है भी dropna जैसी चीजों का उपयोग करने के खाली कॉलम को हटाने में सक्षम नहीं कर रहा हूँ पैनल (सारांश आंकड़ों की साजिश करते समय इसने कई बग का नेतृत्व किया है)। उच्च-आयामी डेटा वाले पांडा का उपयोग करने के बारे में पढ़ने से MultiIndex और इसके उपयोग के बारे में पढ़ना पड़ा है। मैंने प्रलेखन में दिए गए उदाहरणों का प्रयास किया है, लेकिन मैं अभी भी थोड़ा अस्पष्ट हूं कि इसे मेरी स्थिति में कैसे लागू किया जाए। कोई भी दिशा उपयोगी होगी।मैं करने में सक्षम होना चाहते हैं:

  • में मेरी Series आधारित डेटा कम्बाइन एक बहु अनुक्रमित DataFrame आयामों की एक मनमाना संख्या के साथ (यह बहुत अच्छा होगा - यह से फ्रेम बनाने के लिए एक कॉल को खत्म करेगा श्रृंखला, और फिर फ्रेम से पैनल बनाने के लिए एक और)
  • परिणामस्वरूप बहु-अनुक्रमित DataFrame पर एक आयाम छोड़कर, मैं घटक मेटाडेटा को रीसेट कर सकता हूं।

संपादित करें - कोड नमूना जोड़े

नीचे वेस मैककिनी का जवाब है मैं लगभग वास्तव में क्या जरूरत है - मुद्दा सीरीज समर्थित भंडारण वस्तुओं मैं अपने DataFrame के साथ काम करना है से प्रारंभिक अनुवाद में है एक बार जब मैं तत्वों को समूहबद्ध करना शुरू करता हूं तो बैब्जेक्ट ऑब्जेक्ट्स। डेटा-फ़्रेम-बैकड क्लास में निम्न विधि है जो श्रृंखला-आधारित ऑब्जेक्ट्स और मेटाडेटा फ़ील्ड की एक सूची लेती है जो कॉलम में भिन्न होगी।

@classmethod 
def from_list(cls, results_list, column_key): 
    """ 
    Populate object from a list of results that all share the metadata except 
    for the field `column_key`. 

    """ 
    # Need two copies of the input results - one for building the object 
    # data and one for building the object metadata 
    for_data, for_metadata = itertools.tee(results_list) 

    self    = cls() 
    self.column_key = column_key 
    self.metadata = next(for_metadata).metadata.copy() 
    if column_key in self.metadata: 
     del self.metadata[column_key] 
    self.data = pandas.DataFrame(dict(((transform(r[column_key]), r.data) 
             for r in for_data))) 
    return self 

विभिन्न कार्यों एक बार मैं फ्रेम इस दिनचर्या द्वारा दिए गए है, मैं आसानी से लागू कर सकते हैं नीचे सुझाव दिया - यह स्टोर करने के लिए की आवश्यकता समाप्त - विशेष रूप से उपयोगिता की है जब मैं कॉल concatnames क्षेत्र उपयोग करने में सक्षम किया जा रहा है कॉलम कुंजी का नाम आंतरिक रूप से का नाम है क्योंकि यह मल्टीइंडेक्स में उस अनुक्रमणिका आयाम के नाम के रूप में संग्रहीत है।

मैं नीचे दिए गए समाधान को लागू करने में सक्षम होना चाहता हूं और केवल श्रृंखला-समर्थित वर्गों की सूची और कुंजी की एक सूची लेना चाहता हूं और अनुक्रमिक रूप से समूह करना चाहता हूं। हालांकि, मैं नहीं जानता कि क्या कॉलम समय से आगे का प्रतिनिधित्व किया जाएगा, ताकि:

  • यह वास्तव में मेरे लिए कोई मतलब नहीं है एक 1-डी DataFrame
  • मैं डॉन में सीरीज डाटा स्टोर करने 'टी देखते हैं कि कैसे सूचकांक के नाम और प्रारंभिक श्रृंखला से स्तंभ स्थापित करने के लिए -> फ्रेम

उत्तर

9

समूहीकरण मैं एक साथ गोंद करने सीरीज DataFrames में एक MultiIndex बनाने के लिए अपने keys तर्क के साथ pandas.concat का उपयोग कर सुझाव दे सकता है कॉलम:

In [20]: data 
Out[20]: 
{'a': 2012-04-16 0 
2012-04-17 1 
2012-04-18 2 
2012-04-19 3 
2012-04-20 4 
2012-04-21 5 
2012-04-22 6 
2012-04-23 7 
2012-04-24 8 
2012-04-25 9 
Freq: D, 
'b': 2012-04-16 0 
2012-04-17 1 
2012-04-18 2 
2012-04-19 3 
2012-04-20 4 
2012-04-21 5 
2012-04-22 6 
2012-04-23 7 
2012-04-24 8 
2012-04-25 9 
Freq: D, 
'c': 2012-04-16 0 
2012-04-17 1 
2012-04-18 2 
2012-04-19 3 
2012-04-20 4 
2012-04-21 5 
2012-04-22 6 
2012-04-23 7 
2012-04-24 8 
2012-04-25 9 
Freq: D} 

In [21]: df = pd.concat(data, axis=1, keys=['a', 'b', 'c']) 

In [22]: df 
Out[22]: 
      a b c 
2012-04-16 0 0 0 
2012-04-17 1 1 1 
2012-04-18 2 2 2 
2012-04-19 3 3 3 
2012-04-20 4 4 4 
2012-04-21 5 5 5 
2012-04-22 6 6 6 
2012-04-23 7 7 7 
2012-04-24 8 8 8 
2012-04-25 9 9 9 

In [23]: df2 = pd.concat([df, df], axis=1, keys=['group1', 'group2']) 

In [24]: df2 
Out[24]: 
      group1  group2  
       a b c  a b c 
2012-04-16  0 0 0  0 0 0 
2012-04-17  1 1 1  1 1 1 
2012-04-18  2 2 2  2 2 2 
2012-04-19  3 3 3  3 3 3 
2012-04-20  4 4 4  4 4 4 
2012-04-21  5 5 5  5 5 5 
2012-04-22  6 6 6  6 6 6 
2012-04-23  7 7 7  7 7 7 
2012-04-24  8 8 8  8 8 8 
2012-04-25  9 9 9  9 9 9 

फिर आप है:

In [25]: df2['group2'] 
Out[25]: 
      a b c 
2012-04-16 0 0 0 
2012-04-17 1 1 1 
2012-04-18 2 2 2 
2012-04-19 3 3 3 
2012-04-20 4 4 4 
2012-04-21 5 5 5 
2012-04-22 6 6 6 
2012-04-23 7 7 7 
2012-04-24 8 8 8 
2012-04-25 9 9 9 

या यहाँ तक कि

In [27]: df2.xs('b', axis=1, level=1) 
Out[27]: 
      group1 group2 
2012-04-16  0  0 
2012-04-17  1  1 
2012-04-18  2  2 
2012-04-19  3  3 
2012-04-20  4  4 
2012-04-21  5  5 
2012-04-22  6  6 
2012-04-23  7  7 
2012-04-24  8  8 
2012-04-25  9  9 

आप मनमाने ढंग से कई स्तरों हो सकता है:

In [29]: pd.concat([df2, df2], axis=1, keys=['tier1', 'tier2']) 
Out[29]: 
      tier1      tier2      
      group1  group2  group1  group2  
       a b c  a b c  a b c  a b c 
2012-04-16  0 0 0  0 0 0  0 0 0  0 0 0 
2012-04-17  1 1 1  1 1 1  1 1 1  1 1 1 
2012-04-18  2 2 2  2 2 2  2 2 2  2 2 2 
2012-04-19  3 3 3  3 3 3  3 3 3  3 3 3 
2012-04-20  4 4 4  4 4 4  4 4 4  4 4 4 
2012-04-21  5 5 5  5 5 5  5 5 5  5 5 5 
2012-04-22  6 6 6  6 6 6  6 6 6  6 6 6 
2012-04-23  7 7 7  7 7 7  7 7 7  7 7 7 
2012-04-24  8 8 8  8 8 8  8 8 8  8 8 8 
2012-04-25  9 9 9  9 9 9  9 9 9  9 9 9 
+0

अच्छा! ऐसा लगता है कि मुझे इसकी आवश्यकता हो सकती है - अब वास्तव में इसे देखने और देखने के लिए। –

+0

मैं अंततः पूरी तरह से एन-आयामी वस्तु रखने की योजना बना रहा हूं, लेकिन यह कई मामलों में बिल्कुल आवश्यक नहीं है –

+0

ठीक है - मुझे लगता है कि सब कुछ का पालन करें लेकिन पहला कदम (यानी मुझे प्रारंभिक डेटाफ्रेम होने के बाद इसे प्राप्त होता है)। क्या इसका मतलब यह है कि मुझे सीरीज़ ऑब्जेक्ट्स (मूल डेटा संरचनाओं में) की अपनी सूची लेने और डेटाफ्रेम बनाने की आवश्यकता होगी, कुछ आरंभिक जुड़ने की विधि का उपयोग करके और फिर संगतता की श्रृंखला को पार करें और क्या ऐसा करने का एक बेहतर तरीका है ? –

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

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