Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用滚动平均值或其他插值替换NaN或缺失值_Python_Pandas_Missing Data_Moving Average - Fatal编程技术网

Python 用滚动平均值或其他插值替换NaN或缺失值

Python 用滚动平均值或其他插值替换NaN或缺失值,python,pandas,missing-data,moving-average,Python,Pandas,Missing Data,Moving Average,我有一个每月数据的熊猫数据框,我想计算12个月移动平均值。但是,一月份的数据丢失了(NaN),所以我使用 pd.rolling_mean(data["variable"]), 12, center=True) 但它给了我所有的价值观 有没有一种简单的方法可以忽略NaN值?我知道实际上这将成为11个月移动平均线 dataframe还有其他包含一月数据的变量,所以我不想仅仅扔掉一月列,然后做一个11个月的移动平均值。有几种方法可以实现这一点,最好的方法将取决于一月数据是否与其他月份有系统的不同。大

我有一个每月数据的熊猫数据框,我想计算12个月移动平均值。但是,一月份的数据丢失了(NaN),所以我使用

pd.rolling_mean(data["variable"]), 12, center=True)
但它给了我所有的价值观

有没有一种简单的方法可以忽略NaN值?我知道实际上这将成为11个月移动平均线


dataframe还有其他包含一月数据的变量,所以我不想仅仅扔掉一月列,然后做一个11个月的移动平均值。

有几种方法可以实现这一点,最好的方法将取决于一月数据是否与其他月份有系统的不同。大多数真实世界的数据可能有一定的季节性,因此让我们以北半球随机城市的平均高温(华氏)为例

df=pd.DataFrame({ 'month' : [10,11,12,1,2,3],
                  'temp'  : [65,50,45,np.nan,40,43] }).set_index('month')
你可以使用你建议的滚动平均值,但问题是你会得到全年的平均温度,这忽略了一个事实,即一月是最冷的月份。要更正此问题,可以将窗口减少到3,这将导致1月的温度为12月和2月的平均温度。(我也在使用@user394430的答案中建议的
min_periods=1

这些都是改进,但仍然存在使用滚动方式覆盖现有值的问题。为了避免这种情况,您可以结合使用
update()
方法()

甚至还有更简单的方法,在用上个月、下个月或上个月和下个月的平均值填充缺失的1月份临时值时,不使用现有值

df['ffill']   = df['temp'].ffill()         # previous month 
df['bfill']   = df['temp'].bfill()         # next month
df['interp']  = df['temp'].interpolate()   # mean of prev/next
在这种情况下,
interpolate()
默认为简单的线性解释,但您还有其他几种插入选项。有关更多信息,请参阅。或者这个statck溢出问题:

以下是所有结果的样本数据:

       temp  rollmean12  rollmean3  update  ffill  bfill  interp
month                                                           
10     65.0        48.6  57.500000    65.0   65.0   65.0    65.0
11     50.0        48.6  53.333333    50.0   50.0   50.0    50.0
12     45.0        48.6  47.500000    45.0   45.0   45.0    45.0
1       NaN        48.6  42.500000    42.5   45.0   40.0    42.5
2      40.0        48.6  41.500000    40.0   40.0   40.0    40.0
3      43.0        48.6  41.500000    43.0   43.0   43.0    43.0

特别要注意的是,“更新”和“interp”在所有月份都给出相同的结果。虽然您在这里使用哪种方法并不重要,但在其他情况下,这种或那种方法可能会更好。

真正的关键是使用
min\u periods=1
。另外,从版本18开始,正确的调用是使用。因此,您的代码应该是


data[“variable”].rolling(min_periods=1,center=True,window=12)。mean()

我相信添加min_periods=11解决了我的问题。我也遇到过类似的问题,而
min_periods=1
正是我解决了这个问题+1.建议滚动object@user394430--仅供参考,我大幅改进了我的答案,包括您使用的min_句点,并比较了不同的方法。在我的回答中,标有“rollmean12”的一栏应该与你的答案相对应。
df['ffill']   = df['temp'].ffill()         # previous month 
df['bfill']   = df['temp'].bfill()         # next month
df['interp']  = df['temp'].interpolate()   # mean of prev/next
       temp  rollmean12  rollmean3  update  ffill  bfill  interp
month                                                           
10     65.0        48.6  57.500000    65.0   65.0   65.0    65.0
11     50.0        48.6  53.333333    50.0   50.0   50.0    50.0
12     45.0        48.6  47.500000    45.0   45.0   45.0    45.0
1       NaN        48.6  42.500000    42.5   45.0   40.0    42.5
2      40.0        48.6  41.500000    40.0   40.0   40.0    40.0
3      43.0        48.6  41.500000    43.0   43.0   43.0    43.0