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-fill
与non-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
进行比较,看看它是否按预期工作。
当涉及具有 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-fill
与non-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
进行比较,看看它是否按预期工作。