Pandas 滚动平均值 returns 'nan'
Pandas rolling mean returns 'nan'
我有一个位置数组(索引),在这些位置可以在数据集中找到局部最大值。我已经应用了以下简单的极值检测方法,但是由于我的数据对较小的波动很敏感,我希望过滤检测到的极值以仅包括离均值一个标准差的异常值,如在 21 分钟的滑动中测量的 window 到 activity 卷。
为此,我需要滚动计算每 21 分钟 window 的平均值和标准差,其中 pandas.rolling_mean
方法将是必需的。但是,在将 detected_extrema
np.array
传递给 rolling_mean
和 stddev
方法时,我得到了结果:[[ nan nan nan nan nan nan …]]
不可用结果。这是为什么?
x = np.array(df_1, dtype=np.float)
# for local maxima
positions = argrelextrema(x, np.greater)
detected_extrema = x.take(positions)
print detected_extrema
print pd.rolling_mean(detected_extrema, 21, min_periods=None, freq=None, center=False, how=None)
print pd.rolling_std(detected_extrema, 21, min_periods=None, freq=None, center=False, how=None)
输出:
[[ 89. 60. 78. 55. 61. 49. 38. 40. 30. 20.
36. 39. 22. 19. 772. 204. 153. 139. 184. 130.
154. 187. 174. 279. 273. 164. 42. 36. 1004. 216.
761. 322. 205. 564. 373. 171.]]
[[ nan nan nan nan nan nan nan nan nan nan nan nan nan nan
nan nan nan nan nan nan nan nan nan nan nan nan nan nan
nan nan nan nan nan nan nan nan]]
[[ nan nan nan nan nan nan nan nan nan nan nan nan nan nan
nan nan nan nan nan nan nan nan nan nan nan nan nan nan
nan nan nan nan nan nan nan nan]]
您可以尝试重塑数组:
a = np.array([[89, 60, 78, 55, 61, 49, 38, 40, 30, 20, 36,39,22,19, 772, 204, 153, 139, 184, 130, 154, 187, 174, 279, 273, 164,42,36,1004, 216, 761, 322, 205, 564, 373, 171]])
a.shape
(1, 36)
pd.rolling_mean(a, 21, min_periods=None, freq=None, center=False, how=None)
[[ nan nan nan nan nan nan nan nan nan nan nan nan nan nan
nan nan nan nan nan nan nan nan nan nan nan nan nan nan
nan nan nan nan nan nan nan nan]]
b = a.flatten()
b.shape
(36,)
pd.rolling_mean(b, 21, min_periods=None, freq=None, center=False, how=None)
[ nan nan nan nan nan
nan nan nan nan nan
nan nan nan nan nan
nan nan nan nan nan
112.95238095 117.61904762 123.04761905 132.61904762 143. 147.9047619
147.57142857 147.47619048 193.38095238 202.23809524 237.52380952
251.14285714 259.04761905 284.85714286 301.71428571 273.0952381 ]
我有一个位置数组(索引),在这些位置可以在数据集中找到局部最大值。我已经应用了以下简单的极值检测方法,但是由于我的数据对较小的波动很敏感,我希望过滤检测到的极值以仅包括离均值一个标准差的异常值,如在 21 分钟的滑动中测量的 window 到 activity 卷。
为此,我需要滚动计算每 21 分钟 window 的平均值和标准差,其中 pandas.rolling_mean
方法将是必需的。但是,在将 detected_extrema
np.array
传递给 rolling_mean
和 stddev
方法时,我得到了结果:[[ nan nan nan nan nan nan …]]
不可用结果。这是为什么?
x = np.array(df_1, dtype=np.float)
# for local maxima
positions = argrelextrema(x, np.greater)
detected_extrema = x.take(positions)
print detected_extrema
print pd.rolling_mean(detected_extrema, 21, min_periods=None, freq=None, center=False, how=None)
print pd.rolling_std(detected_extrema, 21, min_periods=None, freq=None, center=False, how=None)
输出:
[[ 89. 60. 78. 55. 61. 49. 38. 40. 30. 20.
36. 39. 22. 19. 772. 204. 153. 139. 184. 130.
154. 187. 174. 279. 273. 164. 42. 36. 1004. 216.
761. 322. 205. 564. 373. 171.]]
[[ nan nan nan nan nan nan nan nan nan nan nan nan nan nan
nan nan nan nan nan nan nan nan nan nan nan nan nan nan
nan nan nan nan nan nan nan nan]]
[[ nan nan nan nan nan nan nan nan nan nan nan nan nan nan
nan nan nan nan nan nan nan nan nan nan nan nan nan nan
nan nan nan nan nan nan nan nan]]
您可以尝试重塑数组:
a = np.array([[89, 60, 78, 55, 61, 49, 38, 40, 30, 20, 36,39,22,19, 772, 204, 153, 139, 184, 130, 154, 187, 174, 279, 273, 164,42,36,1004, 216, 761, 322, 205, 564, 373, 171]])
a.shape
(1, 36)
pd.rolling_mean(a, 21, min_periods=None, freq=None, center=False, how=None)
[[ nan nan nan nan nan nan nan nan nan nan nan nan nan nan
nan nan nan nan nan nan nan nan nan nan nan nan nan nan
nan nan nan nan nan nan nan nan]]
b = a.flatten()
b.shape
(36,)
pd.rolling_mean(b, 21, min_periods=None, freq=None, center=False, how=None)
[ nan nan nan nan nan
nan nan nan nan nan
nan nan nan nan nan
nan nan nan nan nan
112.95238095 117.61904762 123.04761905 132.61904762 143. 147.9047619
147.57142857 147.47619048 193.38095238 202.23809524 237.52380952
251.14285714 259.04761905 284.85714286 301.71428571 273.0952381 ]