Pandas DataFrame - pct_change() function
The Pandas DataFrame pct_change() function computes the percentage change between the current and a prior element by default. This is useful in comparing the percentage of change in a time series of elements.
Syntax
DataFrame.pct_change(periods=1, fill_method='pad', limit=None, freq=None)
Parameters
periods |
Optional. Specify the period to shift for calculating percent change. Default: 1 |
fill_method |
Optional. Specify how to handle NAs before computing percent changes. Default: 'pad'. It can take values from {'backfill', 'bfill', 'pad', 'ffill', None}. pad / ffill: use last valid observation to fill gap. backfill / bfill: use next valid observation to fill gap. |
limit |
Optional. Specify the number of consecutive NAs to fill before stopping. Default is None. |
freq |
Optional. A DateOffset, timedelta, or str to specify increment to use from time series API (e.g. 'M' or BDay()). Default is None. |
Return Value
Returns the same type as the calling object with percentage change of element.
Example: Percentage change of elements of a DataFrame
In the example below, a DataFrame df is created. The pct_change() function is used to calculate the percentage change of elements of all numerical columns.
import pandas as pd import numpy as np df = pd.DataFrame({ "GDP": [1.5, 2.5, 3.5, 1.5, 2.5, -1], "GNP": [1, 2, 3, 3, 2, -1], "HPI": [2, 3, 2, np.NaN, 2, 2]}, index= ["2015", "2016", "2017", "2018", "2019", "2020"] ) print("The DataFrame is:") print(df) #percentage change of element with period = 1 print("\ndf.pct_change() returns:") print(df.pct_change()) #percentage change of element with period = 2 print("\ndf.pct_change(periods=2) returns:") print(df.pct_change(periods=2))
The output of the above code will be:
The DataFrame is: GDP GNP HPI 2015 1.5 1 2.0 2016 2.5 2 3.0 2017 3.5 3 2.0 2018 1.5 3 NaN 2019 2.5 2 2.0 2020 -1.0 -1 2.0 df.pct_change() returns: GDP GNP HPI 2015 NaN NaN NaN 2016 0.666667 1.000000 0.500000 2017 0.400000 0.500000 -0.333333 2018 -0.571429 0.000000 0.000000 2019 0.666667 -0.333333 0.000000 2020 -1.400000 -1.500000 0.000000 df.pct_change(periods=2) returns: GDP GNP HPI 2015 NaN NaN NaN 2016 NaN NaN NaN 2017 1.333333 2.000000 0.000000 2018 -0.400000 0.500000 -0.333333 2019 -0.285714 -0.333333 0.000000 2020 -1.666667 -1.333333 0.000000
Example: Percentage change row-wise
To calculate the percentage change row-wise, the axis=1 can be passed. Consider the example below:
import pandas as pd import numpy as np df = pd.DataFrame({ "2015": [1.5, 1, 2], "2016": [2.5, 2, 3], "2017": [3.5, 3, 2], "2018": [1.5, 3, np.NaN], "2019": [2.5, 2, 2], "2020": [-1, -1, 2]}, index= ["GDP", "GNP", "HDI"] ) print("The DataFrame is:") print(df) #percentage change of element with period = 1 print("\ndf.pct_change(axis=1) returns:") print(df.pct_change(axis=1)) #percentage change of element with period = 2 print("\ndf.pct_change(axis=1, periods=2) returns:") print(df.pct_change(axis=1, periods=2))
The output of the above code will be:
The DataFrame is: 2015 2016 2017 2018 2019 2020 GDP 1.5 2.5 3.5 1.5 2.5 -1 GNP 1.0 2.0 3.0 3.0 2.0 -1 HDI 2.0 3.0 2.0 NaN 2.0 2 df.pct_change(axis=1) returns: 2015 2016 2017 2018 2019 2020 GDP NaN 0.666667 0.400000 -0.571429 0.666667 -1.4 GNP NaN 1.000000 0.500000 0.000000 -0.333333 -1.5 HDI NaN 0.500000 -0.333333 0.000000 0.000000 0.0 df.pct_change(axis=1, periods=2) returns: 2015 2016 2017 2018 2019 2020 GDP NaN NaN 1.333333 -0.400000 -0.285714 -1.666667 GNP NaN NaN 2.000000 0.500000 -0.333333 -1.333333 HDI NaN NaN 0.000000 -0.333333 0.000000 0.000000
Example: Percentage change of selected columns
Instead of whole DataFrame, the pct_change() function can be applied on selected columns. Consider the following example.
import pandas as pd import numpy as np df = pd.DataFrame({ "GDP": [1.5, 2.5, 3.5, 1.5, 2.5, -1], "GNP": [1, 2, 3, 3, 2, -1], "HPI": [2, 3, 2, np.NaN, 2, 2]}, index= ["2015", "2016", "2017", "2018", "2019", "2020"] ) print("The DataFrame is:") print(df) #percentage change of element of single column print("\ndf['GDP'].pct_change() returns:") print(df['GDP'].pct_change()) #percentage change of element of multiple columns print("\ndf[['GDP', 'GNP']].pct_change() returns:") print(df[['GDP', 'GNP']].pct_change())
The output of the above code will be:
The DataFrame is: GDP GNP HPI 2015 1.5 1 2.0 2016 2.5 2 3.0 2017 3.5 3 2.0 2018 1.5 3 NaN 2019 2.5 2 2.0 2020 -1.0 -1 2.0 df['GDP'].pct_change() returns: 2015 NaN 2016 0.666667 2017 0.400000 2018 -0.571429 2019 0.666667 2020 -1.400000 Name: GDP, dtype: float64 df[['GDP', 'GNP']].pct_change() returns: GDP GNP 2015 NaN NaN 2016 0.666667 1.000000 2017 0.400000 0.500000 2018 -0.571429 0.000000 2019 0.666667 -0.333333 2020 -1.400000 -1.500000
Example: using fill_method parameter
The example below demonstrates on how to use fill_method parameter with this function.
import pandas as pd import numpy as np df = pd.DataFrame({ "GDP": [1.5, np.NaN, 2, np.NaN, 2.5, -1], "GNP": [1, 2, 3, 3, 2, -1]}, index= ["2015", "2016", "2017", "2018", "2019", "2020"] ) print("The DataFrame is:") print(df) #using bfill as fill_method method print("\ndf['GDP'].pct_change(fill_method='bfill') returns:") print(df['GDP'].pct_change(fill_method='bfill')) #using ffill as fill_method method print("\ndf['GDP'].pct_change(fill_method='ffill') returns:") print(df['GDP'].pct_change(fill_method='ffill'))
The output of the above code will be:
The DataFrame is: GDP GNP 2015 1.5 1 2016 NaN 2 2017 2.0 3 2018 NaN 3 2019 2.5 2 2020 -1.0 -1 df['GDP'].pct_change(fill_method=bfill) returns: 2015 NaN 2016 0.333333 2017 0.000000 2018 0.250000 2019 0.000000 2020 -1.400000 Name: GDP, dtype: float64 df['GDP'].pct_change(fill_method=ffill) returns: 2015 NaN 2016 0.000000 2017 0.333333 2018 0.000000 2019 0.250000 2020 -1.400000 Name: GDP, dtype: float64
❮ Pandas DataFrame - Functions