我有一个包含6169个时序数据点的数据集。我正在尝试在某个滚动窗口内找到最小值。在这种情况下,窗口为396(略大于一年)。我在下面使用pandas滚动功能编写了以下代码。但是,当我运行代码时,最终得到的值比我应该得到的多得多。我的意思是我应该以6169/396 = 15或16个值结束。但是,我得到了258个值。任何想法为什么?为了了解数据,我发布了一个图表。我已经标记了一些红色的圆点,应该观察到这些圆点,并且通过观察图形,它绝对不能捕获到那么多的圆点。我的代码行有什么问题吗?
m4_minidx = df['fitted.values'].rolling(window = 396).min() == df['fitted.values']
m4_min = df[m4_minidx]
print(df.shape)
print(m4_min.shape)
output:
(6169, 5)
(258, 5)
答案 0 :(得分:2)
问题在于滚动窗口,您每次都会获得局部最小值。这是一张草图来解释:
黑线是移动窗口,而红线是局部最小值。
您要解决的问题稍微复杂一些,发现局部最小值通常并不容易。查看以下其他资源:local minima x-y或 local minima 1d array或peak finder in scipy library
=============编辑=================
如果您的数据框中没有重复,您将获得预期的结果:
x = np.random.random(6169)
df = pd.DataFrame({'fitted.values': x})
m4_minidx = df['fitted.values'].rolling(window = 396).min() == df['fitted.values']
m4_min = df[m4_minidx]
print(df.shape)
print(m4_min.shape)
输出:
(6169, 1)
(14, 1)