Python 相反的pct_change()
假设我们有一个数据帧,我们计算行之间的百分比变化Python 相反的pct_change(),python,python-2.7,pandas,percentage,Python,Python 2.7,Pandas,Percentage,假设我们有一个数据帧,我们计算行之间的百分比变化 y_axis = [1,2,3,4,5,6,7,8,9] x_axis = [100,105,115,95,90,88,110,100,0] DF = pd.DataFrame({'Y':y_axis, 'X':x_axis}) DF = DF[['Y','X']] DF['PCT'] = DF['X'].pct_change() Y X PCT 0 1 100 NaN 1 2 105 0.050000
y_axis = [1,2,3,4,5,6,7,8,9]
x_axis = [100,105,115,95,90,88,110,100,0]
DF = pd.DataFrame({'Y':y_axis, 'X':x_axis})
DF = DF[['Y','X']]
DF['PCT'] = DF['X'].pct_change()
Y X PCT
0 1 100 NaN
1 2 105 0.050000
2 3 115 0.095238
3 4 95 -0.173913
4 5 90 -0.052632
5 6 88 -0.022222
6 7 110 0.250000
7 8 100 -0.090909
8 9 0 -1.000000
这样从第一排开始。
我想从最后一行开始计算pct\u change()
一种方法
DF['Reverse'] = list(reversed(x_axis))
DF['PCT_rev'] = DF['Reverse'].pct_change()
pct_rev = DF.PCT_rev.tolist()
DF['_PCT_'] = list(reversed(pct_rev))
DF2 = DF[['Y','X','PCT','_PCT_']]
Y X PCT _PCT_
0 1 100 NaN -0.047619
1 2 105 0.050000 -0.086957
2 3 115 0.095238 0.210526
3 4 95 -0.173913 0.055556
4 5 90 -0.052632 0.022727
5 6 88 -0.022222 -0.200000
6 7 110 0.250000 0.100000
7 8 100 -0.090909 inf
8 9 0 -1.000000 NaN
但这是一个非常丑陋和低效的解决方案。
我想知道是否还有更优雅的解决方案?我删除了我的另一个答案,因为这样更好
通过使用底层数组,您可以将时间减少一半。但您还必须抑制警告
a = DF.X.values
DF.assign(_PCT_=np.append((a[:-1] - a[1:]) / a[1:], np.nan))
Y X PCT _PCT_
0 1 100 NaN -0.047619
1 2 105 0.050000 -0.086957
2 3 115 0.095238 0.210526
3 4 95 -0.173913 0.055556
4 5 90 -0.052632 0.022727
5 6 88 -0.022222 -0.200000
6 7 110 0.250000 0.100000
7 8 100 -0.090909 inf
8 9 0 -1.000000 NaN
系列。pct变化(周期=1,填充方法=pad,限值=None,频率=None,**kwargs)
句点:int,默认为1个句点,用于转换形成百分比变化
嗯,是的。。。我忘了那个漂亮的参数。。。这就是答案。@su79eu7k谢谢
DF.assign(_PCT_=DF.X.pct_change(-1))
Y X PCT _PCT_
0 1 100 NaN -0.047619
1 2 105 0.050000 -0.086957
2 3 115 0.095238 0.210526
3 4 95 -0.173913 0.055556
4 5 90 -0.052632 0.022727
5 6 88 -0.022222 -0.200000
6 7 110 0.250000 0.100000
7 8 100 -0.090909 inf
8 9 0 -1.000000 NaN