简体   繁体   中英

pandas pct_change() in reverse

Suppose we have a dataframe and we calculate as percent change between rows

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

That way it starts from the first row. I want calculate pct_change() starting from the last row.

One way to do it

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

But that is a very ugly and inefficient solution. I was wondering if there are more elegant solutions?

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

Series.pct_change(periods=1, fill_method='pad', limit=None, freq=None, **kwargs)

periods : int, default 1 Periods to shift for forming percent change

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.pct_change.html

I deleted my other answer because @su79eu7k 's is way better.

You can cut your time in half by using the underlying arrays. But you also have to suppress a warning.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM