Pandas pct_change 包含 NaN 的数据会产生无意义的值

Pandas pct_change with data containing NaN results in nonsensical values

当涉及具有 NaN 值的数据时,我对 pct_change 函数的输出感到非常困惑。右列中的前几行输出是正确的 - 它给出了 A 列左侧单元格相对于前两行 A 列单元格的十进制形式的百分比变化。但是一旦它达到 A 列中的 NaN 值,pct_change 函数的输出就没有意义了。

例如:

Row 8: NaN is 50% greater than 2?

Row 9: NaN is 0% greater than 3? 

Row 11: 4 is 33% greater than NaN?

Row 12: 2 is 33% less than NaN?`

根据上面的数学计算,似乎 pct_change 正在为 NaN 分配值“3”。那是因为 pct_change 有效地向前填充了最后一个非 NaN 值吗?有人可以解释一下这里的逻辑以及为什么会这样吗?

import pandas as pd
import numpy as np

df = pd.DataFrame({'A': [2,1,3,1,4,5,2,3,np.nan,np.nan,np.nan,4,2,1,0,4]})
x = 2
df['pctchg_A'] = df['A'].pct_change(periods = x)

print(df.to_string())

这是输出:

行为符合预期。您需要仔细阅读 df.pct_change docs.

根据文档:

fill_method: str, default ‘pad’
How to handle NAs before computing percent changes.

这里,方法pad表示,它将forward-fillnon-NaN值最接近的NaN值。

因此,如果您 ffill or pad 您的 NaN 价值观,您就会明白到底发生了什么。看看这个:

In [3201]: df['padded_A'] = df['A'].fillna(method='pad')

In [3203]: df['pctchg_A'] = df['A'].pct_change(periods = x)

In [3204]: df
Out[3204]: 
      A  padded_A  pctchg_A
0   2.0       2.0       NaN
1   1.0       1.0       NaN
2   3.0       3.0  0.500000
3   1.0       1.0  0.000000
4   4.0       4.0  0.333333
5   5.0       5.0  4.000000
6   2.0       2.0 -0.500000
7   3.0       3.0 -0.400000
8   NaN       3.0  0.500000
9   NaN       3.0  0.000000
10  NaN       3.0  0.000000
11  4.0       4.0  0.333333
12  2.0       2.0 -0.333333
13  1.0       1.0 -0.750000
14  0.0       0.0 -1.000000
15  4.0       4.0  3.000000

现在您可以将 padded_A 值与 pctchg_A 进行比较,看看它是否按预期工作。