2015-07-10 8 views
6

का उपयोग करते समय पांडा को जोड़() NaN इस तरह का सम्मान करता भरने के लिए नहीं:पांडा प्रक्षेप पिछले डेटा बिंदु के बाद Nans की जगह है, लेकिन पहले डेटा बिंदु से पहले

In [1]: s = pandas.Series([np.nan, np.nan, 1, np.nan, 3, np.nan, np.nan]) 

In [2]: s.interpolate() 
Out[2]: 
0 NaN 
1 NaN 
2  1 
3  2 
4  3 
5  3 
6  3 
dtype: float64 

In [3]: pandas.version.version 
Out[3]: '0.16.2' 

, क्यों पांडा सूचकांक 5 में मूल्यों की जगह है और 6 के साथ 6, लेकिन मान 0 और 1 के रूप में छोड़ दें?

क्या मैं इस व्यवहार को बदल सकता हूं? मैं इंडेक्स 5 और 6 पर NaN छोड़ना चाहता हूं।

(असल में, मैं इसे 0, 1, 5, और 6 भरने के लिए रैखिक रूप से extrapolate करना चाहता हूं, लेकिन यह एक अलग सवाल है। बोनस पॉइंट्स यदि आप इसका उत्तर भी देते हैं!)

उत्तर

5

आंतरिक रूप से, interpolate विधि एक 'सीमा' पैरामीटर जो भरने प्रचार एक विशिष्ट सीमा से अधिक से बचा जाता है उपयोग करता है।

>>>df=pd.DataFrame([0, np.nan, np.nan, np.nan, np.nan,np.nan, 2]) 
>>>df 
df 
    0 
0 0 
1 NaN 
2 NaN 
3 NaN 
4 NaN 
5 NaN 
6 2 
>>>df.interpolate(limit=2) 
      0 
0 0.000000 
1 0.333333 
2 0.666667 
3  NaN 
4  NaN 
5  NaN 
6 2.000000 

डिफ़ॉल्ट रूप से, सीमा आगे की दिशा में लागू होती है। पिछड़े दिशा में, एक डिफ़ॉल्ट सीमा है जो शून्य पर सेट है। यही कारण है कि आपका पहला कदम विधि से भरा नहीं है। कोई 'limit_direction' पैरामीटर का उपयोग करके दिशा बदल सकता है।

df.interpolate(limit=2, limit_direction='backward') 
      0 
0 0.000000 
1  NaN 
2  NaN 
3  NaN 
4 1.333333 
5 1.666667 
6 2.000000 

पहला कदम है और अपने dataframe के अंतिम चरणों को भरने के लिए, आप एक गैर शून्य 'सीमा' तथा 'दोनों' 'limit_direction' के लिए मूल्य निर्धारित करना चाहिए कर सकते हैं:

>>> df=pd.DataFrame([ np.nan, np.nan, 0, np.nan, 2, np.nan,8,5,np.nan, np.nan]) 
>>> df 
    0 
0 NaN 
1 NaN 
2 0 
3 NaN 
4 2 
5 NaN 
6 8 
7 5 
8 NaN 
9 NaN 
>>> df.interpolate(method='spline', order=1, limit=10, limit_direction='both') 
      0 
0 -3.807382 
1 -2.083581 
2 0.000000 
3 1.364022 
4 2.000000 
5 4.811625 
6 8.000000 
7 5.000000 
8 4.937632 
9 4.138735 

विषय पर चर्चा की गई है here

+0

क्या आपको लगता है कि limit_direction = 'दोनों' (सीमा = कोई नहीं) का उपयोग करने और extrapolation का उपयोग करने के बीच एक अंतर है, जैसा कि इंस्टेस के लिए यहां किया गया है (https://stackoverflow.com/questions/22491628/extrapolate-values-in-pandas -डेटा ढांचा) ? –

2

यह interpolate पांडा में व्यवहार अजीब लग रहा है। अपेक्षित परिणाम उत्पन्न करने के लिए आप scipy.interpolate.interp1d का उपयोग कर सकते हैं। रैखिक extrapolation के लिए, इस काम करने के लिए एक साधारण समारोह लिखा जा सकता है।

import pandas as pd 
import numpy as np 
import scipy as sp 

s = pd.Series([np.nan, np.nan, 1, np.nan, 3, np.nan, np.nan]) 

# interpolate using scipy 
# =========================================== 
s_no_nan = s.dropna() 
func = sp.interpolate.interp1d(s_no_nan.index.values, s_no_nan.values, kind='linear', bounds_error=False) 
s_interpolated = pd.Series(func(s.index), index=s.index) 

Out[107]: 
0 NaN 
1 NaN 
2  1 
3  2 
4  3 
5 NaN 
6 NaN 
dtype: float64 

# extrapolate using user-defined func 
# =========================================== 
def my_extrapolate_func(scipy_interpolate_func, new_x): 
    x1, x2 = scipy_interpolate_func.x[0], scipy_interpolate_func.x[-1] 
    y1, y2 = scipy_interpolate_func.y[0], scipy_interpolate_func.y[-1] 
    slope = (y2 - y1)/(x2 - x1) 
    return y1 + slope * (new_x - x1) 

s_extrapolated = pd.Series(my_extrapolate_func(func, s.index.values), index=s.index) 

Out[108]: 
0 -1 
1 0 
2 1 
3 2 
4 3 
5 4 
6 5 
dtype: float64 
+0

धन्यवाद। मुझे अभी भी उम्मीद है कि कोई पांडा के साथ क्या चल रहा है इसके बारे में स्पष्टीकरण के साथ जवाब देगा। यह सिर्फ scipy लपेटना चाहिए ... – foobarbecue

+0

रैपिंग scipy मतलब यह होगा कि पांडा scipy पर निर्भरता है, जो मुझे लगता है कि वे टालना चाहते हैं। – Jezzamon

+0

@foobarbecue क्या आपने कभी यह पता लगाया है? मुझे पांडा 0.18.1 – toasteez

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