2014-07-05 20 views
8

पर रैखिक प्रतिगमन के लिए फ़्लोट करने के लिए तारीख को कनवर्ट करें ऐसा लगता है कि ओएलएस रैखिक प्रतिगमन के लिए पांडस में अच्छी तरह से काम करने के लिए, तर्कों को तैरना चाहिए। मैं एक csv फार्म के ("gameAct.csv" कहा जाता है) के साथ शुरू कर रहा हूँ:पांडस डेटा फ्रेम

date, city, players, sales 

2014-04-28,London,111,1091.28 

2014-04-29,London,100,1100.44 

2014-04-28,Paris,87,1001.33 

... 

मैं कैसे बिक्री की तारीख पर निर्भर की रेखीय प्रतीपगमन निष्पादित करना चाहते हैं (समय आगे बढ़ता है के रूप में, कैसे बिक्री के लिए कदम है?) । नीचे दिए गए मेरे कोड के साथ समस्या उन तारीखों के साथ प्रतीत होती है जो फ्लोट मान नहीं हैं। मैं पांडस में इस अनुक्रमण समस्या को हल करने के तरीके पर सहायता की सराहना करता हूं।

मेरे वर्तमान (गैर काम कर रहे है, लेकिन संकलन कोड):

import pandas as pd 

from pandas import DataFrame, Series 

import statsmodels.formula.api as sm 

df = pd.read_csv('gameAct.csv') 

df.columns = ['date', 'city', 'players', 'sales'] 

city_data = df[df['city'] == 'London'] 

result = sm.ols(formula = 'sales ~ date', data = city_data).fit() 

मैं शहर मूल्य अलग-अलग रूप में, मैं आर^2 = 1 परिणाम प्राप्त है, जो गलत है। मैंने dataframe df को परिभाषित करने में index_col = 0, parse_dates == True' का भी प्रयास किया है, लेकिन सफलता के बिना।

मुझे संदेह है कि ऐसी सीएसवी फाइलों में तारीखों पर मूल प्रतिगमन करने के लिए और अधिक सामान्य समय श्रृंखला विश्लेषण के लिए पढ़ने का एक बेहतर तरीका है। सहायता, उदाहरण, और संसाधनों की सराहना की जाती है!

ध्यान दें, इसके बाद के संस्करण कोड के साथ, अगर मैं एक सरणी के लिए (किसी दिए गए शहर के लिए) दिनांक सूचकांक कनवर्ट करते हैं, इस सरणी में मानों के रूप में हैं:

'\xef\xbb\xbf2014-04-28' 

कैसे एक एक AIC उत्पादन करता है सभी गैर-बिक्री मानकों पर विश्लेषण? (उदाहरण के लिए परिणाम यह हो सकता है कि बिक्री तिथि और शहर पर सबसे अधिक रैखिक रूप से निर्भर करती है)।

+0

निश्चित रूप से, एक समाधान जो अवांछित और अनपैंडस जैसा है: datecol = london ['date']; londates = []; x में डेटकोल के लिए: londates.append (फ्लोट (एक्स।प्रतिस्थापित करें ('-', ''))) और फिर संदर्भ के लिए धन्यवाद londates सरणी – Quetzalcoatl

उत्तर

18

इस तरह के प्रतिगमन के लिए, मैं आम तौर पर डेटा की शुरुआत के बाद से तारीखों या टाइमस्टैम्प को एक पूर्णांक संख्या में परिवर्तित करता हूं ।

यह करता है अच्छी तरह से चाल:

df = pd.read_csv('test.csv') 
df['date'] = pd.to_datetime(df['date'])  
df['date_delta'] = (df['date'] - df['date'].min())/np.timedelta64(1,'D') 
city_data = df[df['city'] == 'London'] 
result = sm.ols(formula = 'sales ~ date_delta', data = city_data).fit() 

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

इस बात का सबूत भी है कि आंकड़े मॉडल पांडा से टाइम्सरी का समर्थन करते हैं। आप इस रैखिक मॉडल के रूप में अच्छी तरह लागू करने में सक्षम हो सकता है: http://statsmodels.sourceforge.net/stable/examples/generated/ex_dates.html

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

+0

धन्यवाद। मुझे वर्तमान में यह त्रुटि मिल रही है (जो मुझे लगता है कि 'date_delta' पर आपकी तीसरी पंक्ति से उत्पन्न होता है): परिणाम [मास्क] = सेशन (एक्स [मास्क], वाई) टाइप एरर: असमर्थित ऑपरेंड प्रकार (-) के लिए: ' str 'और' str ' अब, यदि मैं इस' date_delta 'सेटिंग को हटा देता हूं, तो यह संकलित करता है लेकिन समस्या यह है कि एक रैखिक प्रतिगमन प्रदर्शन के लिए पैरामीटर की संख्या के बजाय, अद्वितीय तिथियों के लेन (परिणाम .params) = #। टिप्पणियाँ स्वागत है। – Quetzalcoatl

+0

यदि इसका उपयोग हो सकता है: >> pd.version <मॉड्यूल 'pandas.version' से /usr/local/lib/python2.7/dist-packages/pandas-0.14.0-py2.7-linux -x86_64.egg/pandas/version.pyc '> – Quetzalcoatl

+1

हम्म, यह दिलचस्प है। मेरे पास पांडों का वही संस्करण है जैसा आप करते हैं। ऐसा लगता है कि आपकी 'df [' date ']' कॉलम अभी भी 'str' प्रकार है। दूसरी पंक्ति 'डीएफ [' तिथि '] = pd.to_datetime (डीएफ [' तिथि '])' स्ट्रों को डेट ऑब्जेक्ट्स में कनवर्ट करने का ख्याल रखना चाहिए। शायद यह आपके इनपुट सीएसवी में अजीब पात्रों की वजह से असफल रहा है। मैंने देखा है कि आपने चिपकाया है कि कुछ मान '\ xef \ xbb \ xbf2014-04-28' जैसा दिखते हैं, जो मुझे कुछ कचरा पात्रों (संभवतः एक अपूर्ण यूटीएफ -8 रूपांतरण से) की तरह दिखता है। मैं इनपुट को स्वच्छ करने और इसे एक और शॉट देने की सिफारिश करता हूं। –

-1

मुझे आंकड़े मॉडल के विनिर्देशों के बारे में निश्चित नहीं है, लेकिन this post पाइथन के लिए सभी दिनांक/समय रूपांतरण सूचीबद्ध करता है। वे हमेशा एक-एक नहीं होते हैं, इसलिए यह एक संदर्भ है जिसे मैं अक्सर इस्तेमाल करता हूं ;-)

+0

पर निर्दिष्ट लंदन डेटा को वापस दबाएं हालांकि मैं इसे अपनी विशिष्ट समस्या पर लागू करने में सक्षम नहीं हूं। – Quetzalcoatl

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