如何在考虑数据周期性边界条件的情况下应用于 python 移动平均

how to apply in python mobile averaging considering periodic boundary conditions in data

我想在考虑周期性边界条件的情况下执行移动平均。我试着说清楚。

我有这个数据:

Date,Q
1989-01-01 00:00,0
1989-01-02 00:00,1
1989-01-03 00:00,4
1989-01-04 00:00,6
1989-01-05 00:00,8
1989-01-06 00:00,10
1989-01-07 00:00,11

我想考虑 3 个数据计算移动平均值:下一个和上一个。 特别是,我想在 "rolling" 函数中使用相同的选项,其中第一个数据(python 框架中的 0)能够考虑最后一个,反之亦然,最后一个第一个.这将使我有一种周期性的边界条件。

确实,我应用了以下内容: 首先,我阅读了数据框

df = pd.read_csv(fname, index_col = 0,  parse_dates=True)

然后我将 "rolling" 应用为

df['Q'] = pd.Series(df["Q"].rolling(3, center=True).mean())

但是,我得到以下结果:

Date
1989-01-01     NaN
1989-01-02    1.66
1989-01-03    3.66
1989-01-04    6
1989-01-05    8
1989-01-06    9.66
1989-01-07     NaN

我知道我可以应用 "min_periods=1" 选项,但这不是我想要的。确实,很明显第二行的结果是正确的:

1.66 = (0+1+4)/3

但是,我希望第一行的结果是:

(0+1+11)/3

如您所见,数字 11 是最后一行的值。同样,我希望在最后一行:

(10+11+0)/3

其中 0 是第一行的值。

你有什么建议或想法吗?

谢谢,

迭戈

我只是复制第一个之前和最后一个之后的值,对数据帧进行排序,然后进行滚动平均。那么去掉附加值就够了:

df.loc[df.index[0] - pd.offsets.Day(1), 'Q'] = df.iloc[-1]['Q']
df.loc[df.index[-2] + pd.offsets.Day(1), 'Q'] = df.iloc[0]['Q']
df = df.sort_index()
df['Q'] = pd.Series(df["Q"].rolling(3, center=True).mean())

它给出了预期的结果:

                   Q
Date                
1989-01-01  4.000000
1989-01-02  1.666667
1989-01-03  3.666667
1989-01-04  6.000000
1989-01-05  8.000000
1989-01-06  9.666667
1989-01-07  7.000000