gpt4 book ai didi

python - 用滚动平均值或其他插值法替换 NaN 或缺失值

转载 作者:太空狗 更新时间:2023-10-29 19:33:40 28 4
gpt4 key购买 nike

我有一个包含月度数据的 pandas 数据框,我想为其计算 12 个月的移动平均值。但是,一月份每个月的数据都丢失了 (NaN),所以我正在使用

pd.rolling_mean(data["variable"]), 12, center=True)

但它只给了我所有的 NaN 值。

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

dataframe 有其他包含 1 月份数据的变量,所以我不想只丢弃 1 月份的列并计算 11 个月的移动平均数。

最佳答案

有几种方法可以解决这个问题,最好的方法取决于 1 月份的数据是否与其他月份的数据存在系统性差异。大多数现实世界的数据可能都有些季节性,所以让我们以北半球随机城市的平均高温(华氏度)为例。

df=pd.DataFrame({ 'month' : [10,11,12,1,2,3],
'temp' : [65,50,45,np.nan,40,43] }).set_index('month')

您可以按照建议使用滚动平均值,但问题是您将获得全年的平均温度,这忽略了 1 月是最冷的月份这一事实。要纠正这一点,您可以将窗口减少到 3,这会导致 1 月的温度是 12 月和 2 月的平均温度。 (我还按照 @user394430 的回答中的建议使用 min_periods=1。)

df['rollmean12'] = df['temp'].rolling(12,center=True,min_periods=1).mean()
df['rollmean3'] = df['temp'].rolling( 3,center=True,min_periods=1).mean()

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

df['update'] = df['rollmean3']
df['update'].update( df['temp'] ) # note: this is an inplace operation

还有更简单的方法,即保留现有值,同时用上个月、下个月或上个月和下个月的平均值填充缺失的一月温度。

df['ffill']   = df['temp'].ffill()         # previous month 
df['bfill'] = df['temp'].bfill() # next month
df['interp'] = df['temp'].interpolate() # mean of prev/next

在这种情况下,interpolate() 默认为简单线性解释,但您还有其他几个插值选项。参见 documentation on pandas interpolate获取更多信息。或者这个 statck 溢出问题: Interpolation on DataFrame in pandas

这是包含所有结果的示例数据:

       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

请特别注意“update”和“interp”在所有月份给出相同的结果。虽然在这里使用哪一种并不重要,但在其他情况下,一种方式或另一种方式可能更好。

关于python - 用滚动平均值或其他插值法替换 NaN 或缺失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25234782/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com