2012-12-17 10 views
5

मेरे पास 30 मिनट अंतराल पर डेटा का एक बड़ा समय-श्रृंखला सेट है और डेटा के इस सेट पर एक स्लाइडिंग विंडो करने की कोशिश कर रहा है लेकिन पांडा का उपयोग करके दिन के प्रत्येक बिंदु के लिए अलग-अलग है।समय अक्ष के दौरान विंडो औसत स्लाइडिंग

मैं कोई सांख्यिकीविद नहीं हूं और इस तरह के काम के लिए सोचने या कोडिंग में बहुत अच्छा नहीं हूं, लेकिन मैं जो चाहता हूं उसे करने का मेरा बेकार प्रयास है। मैं वास्तव में इसे सुधारने में मदद की तलाश में हूं क्योंकि मुझे पता है कि ऐसा करने का एक बेहतर तरीका होगा, संभवतः मल्टीइंडेक्स और कुछ उचित पुनरावृत्ति का उपयोग करना? लेकिन मैंने इसे 'टाइम-अक्ष' में करने के लिए संघर्ष किया है।

def sliding_window(run,data,type='mean'): 
    data = data.asfreq('30T') 
    for x in date_range(run.START, run.END, freq='1d'): 
     if int(datetime.strftime(x, "%w")) == 0 or int(datetime.strftime(x, "%w")) == 6: 
      points = data.select(weekends).truncate(x - relativedelta(days=run.WINDOW),x + relativedelta(days=run.WINDOW)).groupby(lambda date: minutes(date, x)).mean() 
     else: 
      points = data.select(weekdays).truncate(x - relativedelta(days=run.WINDOW),x + relativedelta(days=run.WINDOW)).groupby(lambda date: minutes(date, x)).mean() 
     for point in points.index: 
      data[datetime(x.year,x.month,x.day,point.hour,point.minute)] = points[point] 
    return data 

run.START, run.END और run.INDOW डेटा के भीतर दो बिंदु और 45 (दिन) हैं। मैं इस कोड पर बहुत कुछ देख रहा हूं इसलिए मुझे यकीन नहीं है कि (यदि कोई है) किसी और के लिए समझ में आता है, तो कृपया पूछें ताकि मैं कुछ और स्पष्टीकरण दे सकूं।

हल: (crewbum का समाधान शिष्टाचार)

संशोधित समारोह के रूप में की उम्मीद मूर्खता से तेजी से चला जाता है:

def sliding_window(run,data,am='mean',days='weekdays'): 
    data = data.asfreq('30T') 
    data = DataFrame({'Day': [d.date() for d in data.index], 'Time': [d.time() for d in data.index], 'Weekend': [weekday_string(d) for d in data.index], 'data': data}) 
    pivot = data.pivot_table(values='data', rows='Day', cols=['Weekend', 'Time']) 
    pivot = pivot[days] 
    if am == 'median': 
     mean = rolling_median(pivot, run.WINDOW*2, min_periods=1) 
    mean = rolling_mean(pivot, run.WINDOW*2, min_periods=1) 
    return DataFrame({'mean': unpivot(mean), 'amax': np.tile(pivot.max().values, pivot.shape[0]), 'amin': np.tile(pivot.min().values, pivot.shape[0])}, index=data.index) 

unpivot समारोह:

def unpivot(frame): 
    N, K = frame.shape 
    return Series(frame.values.ravel('C'), index=[datetime.combine(d[0], d[1]) for d in zip(np.asarray(frame.index).repeat(K), np.tile(np.asarray(frame.ix[0].index), N))]) 

केंद्र = सच इस समय sliding_mean टूटा हुआ प्रतीत होता है, अगर मुझे मौका मिलता है तो इसे गिटूब में फाइल करेगा।

+0

आप को देखा है/कोशिश की निर्मित मतलब समारोह रोलिंग http:? //pandas.pydata.org/pandas-docs/stable/generated/pandas.stats.moments.rolling_mean.html उजागर = रोलिंग # pandas.stats.moments.rolling_mean – Garrett

+0

यह स्पष्ट करने की कोशिश कर रहा है कि आप क्या करने का प्रयास कर रहे हैं: आप सभी मानों को -45 से +45 दिन अवधि के भीतर औसत करना चाहते हैं, लेकिन 24-घंटे के समय बिंदु पर समूहित करना चाहते हैं। उदा।, औसत सभी (9 1) डेटा 13:00 बजे, और 13:30 आदि पर सभी डेटा अलग से औसत करें क्योंकि "स्लाइडिंग विंडो" को अपरिभाषित किया गया है: क्या एक स्लाइडिंग विंडो? – Evert

+0

इसके अलावा, क्यों सप्ताहांत और सप्ताहांत में अलगाव? विचाराधीन डेटा के लिए बस तार्किक, मुझे लगता है? – Evert

उत्तर

4

यदि आप मल्टीइंडेक्स में रुचि रखते हैं, तो df.pivot_table() देखें। यह पंक्तियों और/या कोल्स पैरामीटर में एकाधिक कुंजी पारित होने पर स्वचालित रूप से एक मल्टीइंडेक्स बनाएगा।

उदाहरण के लिए, कहें कि आप डेटा को पिटोट करना चाहते हैं, इसलिए प्रत्येक सप्ताहांत के लिए अलग-अलग कॉलम और दिन के 30 सप्ताह के गैर-सप्ताहांत ब्लॉक के लिए अलग-अलग कॉलम हैं; आप डेटाफ्रेम पर दिन, सप्ताहांत, और TOD (समय-प्रतिदिन) कॉलम जोड़कर और फिर उन कॉलम नामों को निम्नानुसार pivot_table में जोड़कर ऐसा कर सकते हैं।

pivot = df.pivot_table(values='Usage', rows='Day', cols=['TOD', 'Weekend']) 

इस प्रारूप में, pd.rolling_mean() (या अपनी रचना के एक समारोह) आसानी से pivot के स्तंभों के लिए लागू किया जा सकता है। pd.rolling_mean(), पांडा में सभी रोलिंग/चलती फ़ंक्शंस की तरह, केंद्रित स्लाइडिंग विंडो के लिए center पैरामीटर भी स्वीकार करता है।

pd.rolling_mean(pivot, 90, center=True, min_periods=1) 
+0

कमाल। बहुत बहुत धन्यवाद। –

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