【问题标题】:Finding greatest fall and rise in a dynamic rolling window based on index在基于指数的动态滚动窗口中寻找最大跌幅和升幅
【发布时间】:2020-03-28 21:29:14
【问题描述】:

有如下读数的df:

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(1000, size=100), index=range(100), columns = ['reading'])

想根据其索引找出每一行的最大升幅和最大降幅,理论上可以用公式来实现...

如何编码?

试过了:

df.assign(gr8Rise=df.rolling(df.index).apply(lambda x: x[-1]-x[0], raw=True).max())

...失败了ValueError: window must be an integer

更新:基于@jezrael 数据集,gr8Rise 的输出预期如下:

【问题讨论】:

    标签: pandas


    【解决方案1】:

    用途:

    np.random.seed(2019)
    
    df = pd.DataFrame(np.random.randint(100, size=10), index=range(10), columns = ['reading'])
    
    df['gr8Rise'] = [df['reading'].rolling(x).apply(lambda x: x[0]-x[-1], raw=True).max() 
                     for x in range(1, len(df)+1)]
    df.loc[0, 'gr8Rise']= np.nan
    print (df)
       reading  gr8Rise
    0       72      NaN
    1       31     41.0
    2       37     64.0
    3       88     59.0
    4       62     73.0
    5       24     76.0
    6       29     72.0
    7       15     57.0
    8       12     60.0
    9       16     56.0
    

    【讨论】:

    • 不幸的是,它看起来不正确。第 1 行应该是 41,第 2 行应该是 64。请看imgur.com/a/GrpAgE5?
    • df.gr8Rise.iloc[1] 应该是 = 41,因为 72 - 31 = 41 是最大的上升。 df.gr8Rise.iloc[2] 应该是 = 64,因为 88 - 24 = 64 是最大的上升。无法理解您是如何获得 51 和 51 的这些...
    • @reservoirinvest - 嗯,所有数据的预期输出是什么?
    • gr8Rise[0..9] = (41, 64, 59, 73, 76, 72, 57, 60, 56)。
    • 请参阅问题中的更新。
    猜你喜欢
    • 2023-01-21
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    相关资源
    最近更新 更多