对于下面这样的df,我使用pct_change()来计算滚动百分比变化:

price = [np.NaN, 10, 13, np.NaN, np.NaN, 9]
df = pd. DataFrame(price, columns = ['price'])
df
Out[75]:
    price
0 NaN
1 10.0
2 13.0
3 NaN
4 NaN
5 9.0

但我得到了这些意想不到的结果:

df.price.pct_change(periods = 1, fill_method='bfill')
Out[76]:
0 NaN
1 0.000000
2 0.300000
3 -0.307692
4 0.000000
5 0.000000
Name: price, dtype: float64

df.price.pct_change(periods = 1, fill_method='pad')
Out[77]:
0 NaN
1 NaN
2 0.300000
3 0.000000
4 0.000000
5 -0.307692
Name: price, dtype: float64

df.price.pct_change(periods = 1, fill_method='ffill')
Out[78]:
0 NaN
1 NaN
2 0.300000
3 0.000000
4 0.000000
5 -0.307692
Name: price, dtype: float64

我希望在用NaN计算时,结果是NaN,而不是向前或向后填充然后计算.

请问如何做到这一点呢?谢谢.

预期结果:

0 NaN
1 NaN
2 0.300000
3 NaN
4 NaN
5 NaN
Name: price, dtype: float64

参考资料:

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.pct_change.html

推荐答案

也许你可以用diffshift手动计算百分比:

period = 1
pct = df.price.diff().div(df.price.shift(period))
print(pct)

# Output
0    NaN
1    NaN
2    0.3
3    NaN
4    NaN
5    NaN
Name: price, dtype: float64

Update:你可以超过fill_method=None

period = 1
pct = df.price.pct_change(periods=period, fill_method=None)
print(pct)

# Output
0    NaN
1    NaN
2    0.3
3    NaN
4    NaN
5    NaN
Name: price, dtype: float64

Python-3.x相关问答推荐

确定字符串的长度并提取前15或14个字符

Python多处理池:缺少一个进程

我没有';无法理解此TemplateDoesNotExist错误

新行是pandas数据帧中旧行的组合

将列表转换为 pandas 数据框,其中列表包含字典

以特定方式重新排列 pandas 数据框的列

ImportError:抓取数据后找不到 html5lib

我正在使用 python 线程,当查询 mysql 时,代码似乎在运行并保持在无限循环中,没有返回任何错误

如何使用 django rest 框架在 self forienkey 中删除多达 n 种类型的数据?

Python Regex 查找给定字符串是否遵循交替元音、辅音或辅音、元音的连续模式

使用 selenium 加速网页抓取

合并问卷中多列中的稀疏问题 - Pandas

通过附加/包含多个列表来创建 nDimensional 列表

Python:获取未绑定的类方法

numpy.ndarray 与 pandas.DataFrame

如何在不使用 @hydra.main() 的情况下获取 Hydra 配置

python 内置的 __exit__ 参数类型是什么?

0 是 0 == 0(#evaluates 为真?)

为现有项目创建virtualenv

在 PostgreSQL 上使用 SQLAlchemy 创建全文搜索索引