【问题标题】:Is there a way to do rolling percentage in pandas with three columns?有没有办法在三列的熊猫中做滚动百分比?
【发布时间】:2020-10-08 19:26:55
【问题描述】:

我正在寻找一种在具有三列的 Pandas DataFrame 中执行滚动百分比的方法。对于我的 df 中的每一行,我想计算最后三行与该列中的三次行之间的差异,然后对每一列执行此操作。对于输出,我想对每一行的平均值求和。下面,我将尝试向您展示我的意思以及我尝试过的内容。但是,正如您所知,我的知识有限,我正在寻找一种更快、更有效的方法来产生如下类似的输出,但对于更大的 DataFrame 中的每一行......

很高兴收到任何反馈!

我的测试数据集如下所示:

df1 = pd.DataFrame([[1,3,2,4,5,6,3,4],[1,3,4,6,7,2,3,4],[1,2,2,4,12,9,8,4]]).T
print(df1)
   0  1   2
0  1  1   1
1  3  3   2
2  2  4   2
3  4  6   4
4  5  7  12
5  6  2   9
6  3  3   8
7  4  4   4

如果我要“手动”执行此操作,它将从以下开始:

pctChange = pd.DataFrame([df1.First.pct_change(periods=3),df1.Second.pct_change(periods=3),df1.Third.pct_change(periods=3)]).T

print(pctChange)
          First    Second     Third
    0       NaN       NaN       NaN
    1       NaN       NaN       NaN
    2       NaN       NaN       NaN
    3  3.000000  5.000000  3.000000
    4  0.666667  1.333333  5.000000
    5  2.000000 -0.500000  3.500000
    6 -0.250000 -0.500000  1.000000
    7 -0.200000 -0.428571 -0.666667

然后取每一行的平均值。

ave = pctChange.mean(axis=1)
print(ave)

0         NaN
1         NaN
2         NaN
3    3.666667
4    2.333333
5    1.666667
6    0.083333
7   -0.431746

最后对最近的三行求和

    SumOfLastThree = ave.iloc[-3:].sum()
    print(SumOfLastThree)
#desired output
    1.3182539682539682

【问题讨论】:

  • 查看.rolling() 函数。 Pandas docs here。还有.diff() 函数。 Docs here.
  • 谢谢@S3DEV,我会再看看并尝试弄清楚如何完成这个!

标签: python pandas numpy dataframe


【解决方案1】:

也许你可以试试这个来获得你的 3 天移动平均线:

df1 = pd.DataFrame([[1,3,2,4,5,6,3,4],[1,3,4,6,7,2,3,4],[1,2,2,4,12,9,8,4]]).T
df1.columns = ['First','Second','Third']
#3 day rolling average of value
df1['PctChange1']=pd.to_numeric(df1.First.rolling(3,min_periods=3).mean().fillna(''))

我做了 pd.to_numeric 因为它返回一个对象。要更改移动平均线的大小,您可以更改第一个参数.rolling()。如果您仍然希望前几行的滚动平均值,您可以更改它min_periods=1 - 这应该允许您将该移动平均值添加为框架中的新列。

那么您的滚动总和将是:

df1['RollingSum'] = pd.to_numeric(df1.PctChange1.rolling(3,min_periods=3).sum().fillna(''))

全部加起来:

df1 = pd.DataFrame([[1,3,2,4,5,6,3,4],[1,3,4,6,7,2,3,4],[1,2,2,4,12,9,8,4]]).T
df1.columns = ['First','Second','Third']
#3 day rolling average of value
df1['PctChange1']=pd.to_numeric(df1.First.rolling(3,min_periods=3).mean().fillna(''))
#sum of last three rolling averages
df1['RollingSum'] = pd.to_numeric(df1.PctChange1.rolling(3,min_periods=3).sum().fillna(''))
df1

让我知道这是否有效!

【讨论】:

    猜你喜欢
    • 2021-09-02
    • 2022-11-17
    • 2022-01-16
    • 2023-01-26
    • 2021-01-18
    • 2017-03-05
    • 2022-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多