Python 有没有一种方法可以计算三列熊猫的滚动百分比?
我正在寻找一种方法,在一个有三列的Pandas数据帧中执行rolling Percance。对于df中的每一行,我想计算最后三行与该列中三行之间的差值,然后对每一列执行此操作。对于输出,我想求每行的平均值之和。下面,我将试着向你们展示我的意思和我的尝试。然而,正如您所知,我的知识是有限的,我正在寻找一种更快、更有效的方法来产生如下所示的likwise输出,但对于更大数据帧中的每一行 我非常感谢任何反馈 我的测试数据集如下所示:Python 有没有一种方法可以计算三列熊猫的滚动百分比?,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,我正在寻找一种方法,在一个有三列的Pandas数据帧中执行rolling Percance。对于df中的每一行,我想计算最后三行与该列中三行之间的差值,然后对每一列执行此操作。对于输出,我想求每行的平均值之和。下面,我将试着向你们展示我的意思和我的尝试。然而,正如您所知,我的知识是有限的,我正在寻找一种更快、更有效的方法来产生如下所示的likwise输出,但对于更大数据帧中的每一行 我非常感谢任何反馈 我的测试数据集如下所示: df1 = pd.DataFrame([[1,3,2,4,5,6,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
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
也许你可以试试这个来获得你的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,因为它返回了一个对象。要更改移动平均线的大小,您需要更改第一个参数.rolling()
。如果您希望前几行仍具有滚动平均值,则可以将其更改为min\u 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
让我知道这是否有效 也许你可以试试这个来获得你的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,因为它返回了一个对象。要更改移动平均线的大小,您需要更改第一个参数.rolling()
。如果您希望前几行仍具有滚动平均值,则可以将其更改为min\u 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
让我知道这是否有效 查看
.rolling()
函数。还有.diff()
函数。谢谢@S3DEV,我将再看一眼,并尝试找出如何实现这一点!查看.rolling()
函数。还有.diff()
函数。谢谢@S3DEV,我将再看一眼,并尝试找出如何实现这一点!