【问题标题】:Pandas rolling window get minimum value熊猫滚动窗口获得最小值
【发布时间】:2020-03-26 21:21:57
【问题描述】:

我有一个包含 6169 个时间序列数据点的数据集。我试图在某个滚动窗口内找到最小值。在本例中,窗口为 396(略超过一年)。我使用熊猫滚动功能编写了以下代码。但是,当我运行代码时,我得到的值比我应该得到的要多得多。我的意思是我最终应该得到 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)

【问题讨论】:

    标签: python-3.x pandas


    【解决方案1】:

    问题是滚动窗口,每次都会得到一个局部最小值。这是一个解释的草图:

    黑线是移动窗口,红圈是局部最小值。

    您要解决的问题稍微复杂一些,找到局部最小值通常并非易事。看看这些其他资源:local minima x-ylocal minima 1d arraypeak 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)
    

    【讨论】:

    • 感谢您的解释。但它不应该在那个窗口内给出绝对最小值吗?我的意思是,因为我的窗口长度很大(396)。它不应运行超过 15-16 次。所以我不应该还是得到 15-16 分吗
    • 是否有可能在一个窗口内你有超过最小值?也许你有重复的价值观?
    • 是的,可能重复值是问题所在。再次感谢
    猜你喜欢
    • 2017-03-30
    • 2019-11-01
    • 2017-08-27
    • 1970-01-01
    • 2020-04-21
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    相关资源
    最近更新 更多