2017-11-21 31 views
9

के साथ टाइमस्टैम्प संगतता समस्या मैंने कुछ नई कार्यक्षमताओं का लाभ उठाने के लिए केवल 0.17.1 से 0.21.0 तक पांडा को अद्यतन किया, और matplotlib (जिसे मैंने नवीनतम 2.1.0 में भी अपडेट किया) के साथ संगतता समस्या में भाग लिया। । विशेष रूप से, टाइमस्टैम्प ऑब्जेक्ट में काफी बदलाव आया है।/Matplotlibपांडा 0.21.0 matplotlib

मैं एक और मशीन अभी भी पांडा के पुराने संस्करणों (0.17.1) चल रहा है के लिए हो (1.5.1) जो मैं मतभेदों की तुलना करने के लिए इस्तेमाल:

दोनों संस्करणों dtype='datetime64[ns] होने के लिए मेरी DataFrame सूचकांक दिखाने

DatetimeIndex(['2017-03-13', '2017-03-14', ... '2017-11-17'], type='datetime64[ns]', name='dates', length=170, freq=None) 

लेकिन जब type(df.index[0]) बुला, 0.17.1 pandas.tslib.Timestamp देता है और 0.21.0 pandas._libs.tslib.Timestamp देता है।

जब x- अक्ष के रूप में df.index साथ साजिश रचने: डिफ़ॉल्ट प्रारूपों पांडा 0.17.1 के लिए दिनांक के रूप में एक्स-अक्ष लेबल लेकिन पांडा 0.21.0 के लिए इसे पहचान करने में विफल रहता द्वारा

plt.plot(df.index, df['data']) 

matplotlibs और केवल कच्चे देता है संख्या 1.5e18 (नैनोसेक में युग का समय)।

OverflowError: signed integer is greater than maximum 

मैं सूचना एक्स-मूल्य डिबग में देख सकते हैं:

मैं भी एक स्वनिर्धारित कर्सर कि रिपोर्ट एक्स-मूल्य, जिसके साथ 0.21.0 के लिए विफल रहता है पर matplotlib.dates.DateFormatter का उपयोग करके ग्राफ पर स्थान पर क्लिक किया है 0.17.1 के लिए लगभग 736500 (यानी दिन 0 से दिन की गणना) है लेकिन 0.21.0 के लिए लगभग 1.5e18 (यानी नैनोसेक युग समय) है।

मैटलप्लिब और पांडा के बीच संगतता के इस ब्रेक पर मुझे हैरान है क्योंकि ज्यादातर लोगों द्वारा स्पष्ट रूप से उपयोग किया जाता है। क्या मैं नए संस्करणों के लिए ऊपर प्लॉट फ़ंक्शन को कॉल करने के तरीके में कुछ खो रहा हूं?

अद्यतन के रूप में मैं ऊपर उल्लेख किया है, मैं सीधे कॉल पसंद करते हैं एक दिया कुल्हाड़ियों साथ plot आपत्ति लेकिन बस की बिल्ली के लिए, मैं DataFrame ही df.plot() की साजिश विधि बुला की कोशिश की। जैसे ही यह किया जाता है, सभी बाद के प्लॉट एक ही पायथन सत्र के भीतर टाइमस्टैम्प को सही ढंग से पहचानते हैं। ऐसा लगता है कि एक पर्यावरण चर सेट है, क्योंकि मैं एक और डेटाफ्रेम पुनः लोड कर सकता हूं या subplots के साथ एक और अक्ष बना सकता हूं और 1.5e18 कहां दिखाता है। यह वास्तव में एक बग की तरह बदबू आ रही है के रूप में नवीनतम पांडा दस्तावेज़ कहते हैं pandas:

The plot method on Series and DataFrame is just a simple wrapper around plt.plot() 

लेकिन स्पष्ट रूप से यह अजगर सत्र ऐसी है कि बाद के भूखंडों को ठीक से समय-चिह्न सूचकांक से निपटने के लिए कुछ नहीं करता है।

वास्तव में, बस ऊपर पांडा पर उदाहरण चल लिंक:

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000)) 

कि क्या ts.plot() के आधार पर कहा जाता है या नहीं, तो निम्न साजिश या तो सही ढंग से स्वरूपों तिथि या नहीं के रूप में एक्स-अक्ष:

plt.plot(ts.index,ts) 
plt.show() 

एक बार सदस्य साजिश कहलाती है, बाद में नई श्रृंखला या डेटाफ्रेम पर plt.plot पर कॉल करने से सदस्य प्लॉट विधि को फिर से कॉल करने की आवश्यकता के बिना स्वचालित रूप से स्वत: अद्यतन हो जाएगा।

उत्तर

6

पांडा 0.21 की हालिया रिलीज से आने वाले issue with pandas datetimes and matplotlib है, जो आयात में अपने कन्वर्टर्स को और पंजीकृत नहीं करता है। एक बार जब आप उन कन्वर्टर्स का उपयोग एक बार (पांडा के भीतर) करते हैं तो वे पंजीकृत होंगे और स्वचालित रूप से matplotlib द्वारा भी उपयोग किए जाएंगे।

का संभावित हल उन्हें मैन्युअल रूप से रजिस्टर करने के लिए,

import pandas.plotting._converter as pandacnv 
pandacnv.register() 

किसी भी मामले में इस मुद्दे को अच्छी तरह से दोनों पांडा और matplotlib पक्ष में जाना जाता है हो सकता है, तो वहाँ अगले रिलीज के लिए ठीक किसी तरह का हो जाएगा। पांडस एक अपरिवर्तनीय रिलीज में readding the register के बारे में सोच रहा है। तो यह मुद्दा केवल अस्थायी रूप से हो सकता है। एक विकल्प पांडा 0.20.x पर वापस जाने के लिए भी है जहां यह नहीं होना चाहिए।

+0

आप सही हैं, मुझे पांडास जिथब में खोले गए मुद्दे पर भी यही प्रतिक्रिया मिली है। मैं पांडा वेबसाइट से थोड़ी अधिक आधिकारिक विधि पोस्ट कर रहा हूं जिसे मैंने काम करने की कोशिश की है। –

+0

क्या आपने इस विधि को भी आजमाया है? क्या आप इस पर रिपोर्ट कर सकते हैं कि यह काम कर रहा है या नहीं (इसे सैद्धांतिक रूप से करना चाहिए, लेकिन मैं कोशिश नहीं कर सका और यदि ऐसा नहीं है तो मैं जवाब को बेहतर ढंग से हटा दूंगा)। – ImportanceOfBeingErnest

+0

मैंने कोशिश की और यह भी काम किया - मैं पांडा वेबसाइट से दो लाइनों का उपयोग कर समाप्त हुआ क्योंकि संभवतः वे भविष्य के सबूत होने की अधिक संभावना रखते हैं। –

5

पांडास जिथब पर issue खोलने के बाद, मैंने सीखा कि यह वास्तव में यूनिट कनवर्टर के ऑटो-पंजीकरण के संबंध में पांडा और मैटलप्लिब के बीच issue ज्ञात था।

from pandas.tseries import converter 
converter.register() 

यह भी एक श्रृंखला में पहली बार एक सदस्य साजिश विधि कहा जाता है किया जाता है: वास्तव में यह क्या कन्वर्टर्स रजिस्टर करने के लिए, नई page जो मैंने पहले देखने के लिए विफल रहा था है उचित तरीके के साथ सूचीबद्ध किया गया या डेटाफ्रेम जो मैंने ऊपर बताया है उसे समझाता है।

ऐसा प्रतीत होता है कि matplotlib को पांडा डेटाटाइम के लिए कुछ बुनियादी समर्थन लागू करना है, लेकिन वास्तव में इस तरह के ब्रेक के लिए कुछ प्रकार की बहिष्कार चेतावनी उपयोगी हो सकती है। हालांकि जब तक matplotlib वास्तव में इस तरह के समर्थन (या आलसी पंजीकरण तंत्र का कुछ प्रकार) लागू नहीं करता है, व्यावहारिक रूप से मैं हमेशा उन दो लाइनों को पांडा आयात पर डाल रहा हूं। तो मुझे यकीन नहीं है कि क्यों matandotlib पक्ष पर चीजें तैयार होने से पहले पांडा आयात पर स्वचालित पंजीकरण अक्षम करना चाहते हैं।