python - 熊猫滚动申请返回 np.nan
问题描述
我想将自定义偏度函数应用于滚动应用,但得到了 np.nan 。
import pandas as pd
import numpy as np
def _get_skewness(col, q=(0.05, 0.95)):
if q[0] > 0:
quantiles = col.quantile(q)
col.loc[(col<quantiles[q[0]]) | (col > quantiles[q[1]])] = np.nan
skew = col.skew(axis=0, skipna=True)
return skew
df = pd.DataFrame(np.arange(40).reshape(-1, 2))
df_skew = df.rolling(20, 10).apply(_get_skewness)
print(df_skew)
我得到了以下结果。我知道前 10 行是由于滚动窗口 min_period=10。只是不明白为什么最后几行也返回 np.nan 。
0 1
0 NaN NaN
1 NaN NaN
2 NaN NaN
3 NaN NaN
4 NaN NaN
5 NaN NaN
6 NaN NaN
7 NaN NaN
8 NaN NaN
9 0.0 0.0
10 0.0 0.0
11 0.0 0.0
12 0.0 0.0
13 0.0 0.0
14 0.0 0.0
15 NaN NaN
16 NaN NaN
17 NaN NaN
18 NaN NaN
19 NaN NaN
解决方案
通过loc
在col
每次迭代中修改实际的 DataFrame 。列中的引入NaN
最终意味着窗口变成了所有NaN
。最简单的解决方法(不了解如何应用偏度的更多信息)是创建一个副本以col
进行处理:
def _get_skewness(col, q=(0.05, 0.95)):
copy_col = col.copy() # Make a copy so as to not overwrite future values.
if q[0] > 0:
quantiles = copy_col.quantile(q)
copy_col.loc[
(copy_col < quantiles[q[0]]) | (copy_col > quantiles[q[1]])
] = np.nan
skew = copy_col.skew(axis=0, skipna=True)
return skew
df = pd.DataFrame(np.arange(40).reshape(-1, 2))
df_skew = df.rolling(20, 10).apply(_get_skewness)
df_skew
:
0 1
0 NaN NaN
1 NaN NaN
2 NaN NaN
3 NaN NaN
4 NaN NaN
5 NaN NaN
6 NaN NaN
7 NaN NaN
8 NaN NaN
9 0.0 0.0
10 0.0 0.0
11 0.0 0.0
12 0.0 0.0
13 0.0 0.0
14 0.0 0.0
15 0.0 0.0
16 0.0 0.0
17 0.0 0.0
18 0.0 0.0
19 0.0 0.0
推荐阅读
- excel - 在excel中查找两列差异最大的行
- c# - 将数据上传到sql表
- jmeter - 如何在 jmeter 上读取分块的 HTTP 响应?
- vb.net - 没有可用的错误消息,结果代码:DB_SEC_E_AUTH_FAILED(0x80040E4D)
- java - 如何在Java中获取给定日期的上周六/上周六?
- javascript - 根据特定值对 Array 对象进行分组
- javascript - 工作箱加载错误的动态导入 url
- spring - 带地图的 RequestParam 不必要地绑定 GET 请求中的其他请求参数
- javascript - React hooks,卸载组件时,重置 Redux 数据
- git - Azure DevOps - 在另一个 PR 完成后自动创建 PR