2017-04-16 12 views
8

मेरे पास एक डेटा फ्रेम है जो CSV से आयात किया जाता है।एक विशिष्ट कॉलम पर पांडा पर रोलिंग मतलब

   stock pop 
Date 
2016-01-04 325.316 82 
2016-01-11 320.036 83 
2016-01-18 299.169 79 
2016-01-25 296.579 84 
2016-02-01 295.334 82 
2016-02-08 309.777 81 
2016-02-15 317.397 75 
2016-02-22 328.005 80 
2016-02-29 315.504 81 
2016-03-07 328.802 81 
2016-03-14 339.559 86 
2016-03-21 352.160 82 
2016-03-28 348.773 84 
2016-04-04 346.482 83 
2016-04-11 346.980 80 
2016-04-18 357.140 75 
2016-04-25 357.439 77 
2016-05-02 356.443 78 
2016-05-09 365.158 78 
2016-05-16 352.160 72 
2016-05-23 344.540 74 
2016-05-30 354.998 81 
2016-06-06 347.428 77 
2016-06-13 341.053 78 
2016-06-20 363.515 80 
2016-06-27 349.669 80 
2016-07-04 371.583 82 
2016-07-11 358.335 81 
2016-07-18 362.021 79 
2016-07-25 368.844 77 
...    ... ... 

मैं एक नया कॉलम एमए जोड़ना चाहता था जो स्तंभ पॉप के लिए रोलिंग माध्य की गणना करता है। मैंने कोशिश की निम्नलिखित

df['MA']=data.rolling(5,on='pop').mean() 

मैं एक त्रुटि

ValueError: Wrong number of items passed 2, placement implies 1 

तो मैं मुझे अगर यह सिर्फ एक कॉलम शामिल बिना काम करता है की कोशिश करते हैं सोचा मिलता है। मैं

data.rolling(5,on='pop').mean() 

इस्तेमाल किया मैं उत्पादन

   stock pop 
Date 
2016-01-04  NaN 82 
2016-01-11  NaN 83 
2016-01-18  NaN 79 
2016-01-25  NaN 84 
2016-02-01 307.2868 82 
2016-02-08 304.1790 81 
2016-02-15 303.6512 75 
2016-02-22 309.4184 80 
2016-02-29 313.2034 81 
2016-03-07 319.8970 81 
2016-03-14 325.8534 86 
2016-03-21 332.8060 82 
2016-03-28 336.9596 84 
2016-04-04 343.1552 83 
2016-04-11 346.7908 80 
2016-04-18 350.3070 75 
2016-04-25 351.3628 77 
2016-05-02 352.8968 78 
2016-05-09 356.6320 78 
2016-05-16 357.6680 72 
2016-05-23 355.1480 74 
2016-05-30 354.6598 81 
2016-06-06 352.8568 77 
2016-06-13 348.0358 78 
2016-06-20 350.3068 80 
2016-06-27 351.3326 80 
2016-07-04 354.6496 82 
2016-07-11 356.8310 81 
2016-07-18 361.0246 79 
2016-07-25 362.0904 77 
...    ... ... 

मैं लागू करने के लिए रोलिंग स्तंभ पॉप पर इसका मतलब यह नहीं कर पा रहे हो गया। मैं क्या गलत कर रहा हूं?

+0

यह केवल >>> data.rolling (5, = 'पॉप' पर) रोलिंग [खिड़की = 5, केंद्र = झूठी, अक्ष = 0, पर = पॉप] – Anti21

+0

देता है आप शीर्षक के बीच एक लाइन ब्रेक है 'तारीख' और 'पॉप' और' स्टॉक'। 'सूची (डीएफ) 'के नतीजे क्या हैं? – Chuck

+0

इसका उपयोग करें- 'डेटा [' पॉप ']। रोलिंग (5) .mean() '... –

उत्तर

12

एक स्तंभ निर्दिष्ट करने के लिए, आप एक रोलिंग वस्तु बना सकते हैं अपने Series के आधार पर:

df['new_col'] = data['column'].rolling(5).mean() 

जवाब द्वारा पोस्ट की गई एसी 2001 ऐसा करने का सबसे शानदार तरीका नहीं है। वह डेटाफ्रेम में प्रत्येक कॉलम पर रोलिंग माध्य की गणना कर रहा है, फिर वह "पॉप" कॉलम का उपयोग करके "एम" कॉलम असाइन कर रहा है। निम्नलिखित की पहली विधि बहुत अधिक कुशल है:

%timeit df['ma'] = data['pop'].rolling(5).mean() 
%timeit df['ma_2'] = data.rolling(5).mean()['pop'] 

1000 loops, best of 3: 497 µs per loop 
100 loops, best of 3: 2.6 ms per loop 

मैं जब तक आप सभी स्तंभों पर गणना की रोलिंग साधन स्टोर करने के लिए की जरूरत है दूसरी विधि इस्तेमाल करने की सलाह नहीं होता।

2

यह समाधान मेरे लिए काम किया।

data['MA'] = data.rolling(5).mean()['pop'] 

मुझे लगता है कि समस्या यह हो सकती है कि ऑन = 'पॉप' सूचकांक से रोलिंग विंडो करने के लिए कॉलम को बदल रहा है।

डॉक स्ट्रिंग से: "एक DataFrame के लिए, स्तंभ है जिस पर रोलिंग खिड़की बल्कि सूचकांक की तुलना में गणना करने के लिए,"

+0

बहुत बहुत धन्यवाद! यह काम करता है! – Anti21

+2

अनित 21, यह एंड्रयू के उत्तर की समीक्षा के लायक है क्योंकि यह कहीं अधिक कुशल है। श्रृंखला बनाने के लिए बेहतर है क्योंकि उसने किया है और उसके बाद उस श्रृंखला पर रोलिंग माध्य की गणना करें। – ac2001

2

संपादित करें: pd.rolling_mean पांडा में रहेगी तथा इसे भविष्य में निकाल दिया जाएगा। इसके बजाय: pd.rolling का उपयोग करके आप कर सकते हैं:

  Date stock pop 
0 2016-01-04 325.316 82 
1 2016-01-11 320.036 83 
2 2016-01-18 299.169 79 
3 2016-01-25 296.579 84 
4 2016-02-01 295.334 82 
5 2016-02-08 309.777 81 
6 2016-02-15 317.397 75 
7 2016-02-22 328.005 80 
8 2016-02-29 315.504 81 
9 2016-03-07 328.802 81 

प्राप्त करने के लिए:

df['MA'] = df['pop'].rolling(window=5,center=False).mean() 
एक dataframe df के लिए

  Date stock pop MA 
0 2016-01-04 325.316 82 NaN 
1 2016-01-11 320.036 83 NaN 
2 2016-01-18 299.169 79 NaN 
3 2016-01-25 296.579 84 NaN 
4 2016-02-01 295.334 82 82.0 
5 2016-02-08 309.777 81 81.8 
6 2016-02-15 317.397 75 80.2 
7 2016-02-22 328.005 80 80.4 
8 2016-02-29 315.504 81 79.8 
9 2016-03-07 328.802 81 79.6 

प्रलेखन: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.rolling.html

ओल्ड: यद्यपि यह अब मान्य नहीं है आप इसका उपयोग कर सकते हैं:

df['MA']=pd.rolling_mean(df['pop'], window=5) 

पाने के लिए:

  Date stock pop MA 
0 2016-01-04 325.316 82 NaN 
1 2016-01-11 320.036 83 NaN 
2 2016-01-18 299.169 79 NaN 
3 2016-01-25 296.579 84 NaN 
4 2016-02-01 295.334 82 82.0 
5 2016-02-08 309.777 81 81.8 
6 2016-02-15 317.397 75 80.2 
7 2016-02-22 328.005 80 80.4 
8 2016-02-29 315.504 81 79.8 
9 2016-03-07 328.802 81 79.6 

प्रलेखन: http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.rolling_mean.html

+0

यह भी बहुत अच्छा काम करता है! बहुत बहुत धन्यवाद! – Anti21

+0

@ Anti21 अगर यह आपकी मदद करता है तो इस जवाब को ऊपर उठाना न भूलें! (यदि आप उन्हें स्वीकार नहीं करते हैं तो भी आप उत्तर को ऊपर उठा सकते हैं) :) – Chuck

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