我试图计算Pandas 序列中的滚动半方差或半标准差.

这一切归结为添加一个条件,用NaN替换滚动窗口中的所有值,然后计算该窗口中的标准差/方差(或者只过滤掉窗口中的值).

所以我要找的是这样的东西:

x = stock_prices.pct_change()
window = 10
rol_mean = x.rolling(window).mean()

sem_std = x.rolling(window)[x.rolling(window)<rol_mean].std()

但这当然会引发错误,因为"Series"对象没有属性"columns"和"&gt;""float"和"Rolling"实例之间不支持.

伪代码:

提前感谢您的帮助!

推荐答案

如果你知道,给定一个序列,如何计算半标准差,那么你可以使用.滚动().将()与该函数一起apply.

使用https://www.investopedia.com/terms/s/semideviation.asp中的定义

semi-deviation formula

我们cannot使用内置std,因为我们需要使用整个组的平均值,但只根据组中低于平均值的观察值计算偏差.

看起来我们需要将半偏差定义为一个函数:

import numpy as np

def semi_std(ser):
    average = np.nanmean(ser)
    r_below = ser[ser < average]
    return np.sqrt(1/len(r_below) * np.sum((average - r_below)**2))

x.rolling(window).apply(semi_std, raw=True)

# using raw=True speeds up the computation - this is applicable
# if the function works well with a numpy array instead of a Series
# also, if possible, investigate using numba.

我认为为了获得最大的鲁棒性,可能需要添加一个条件,如果为len(r_below) == 0,则结果为0或NaN(这是一个定义问题,但0可能是合理的 Select ).

Python相关问答推荐

' osmnx.shortest_track '返回有效源 node 和目标 node 的'无'

根据二元组列表在pandas中创建新列

如何过滤包含2个指定子字符串的收件箱列名?

为什么抓取的HTML与浏览器判断的元素不同?

如何保持服务器发送的事件连接活动?

SQLAlchemy bindparam在mssql上失败(但在mysql上工作)

Gekko中基于时间的间隔约束

Flask运行时无法在Python中打印到控制台

为什么t sns.barplot图例不显示所有值?'

如何强制向量中的特定元素在Gekko中处于优化解决方案中

如何使用matplotlib查看并列直方图

如何防止html代码出现在quarto gfm报告中的pandas表之上

Polars表达式无法访问中间列创建表达式

修改.pdb文件中的值并另存为新的

如果服务器设置为不侦听创建,则QWebSocket客户端不连接到QWebSocketServer;如果服务器稍后开始侦听,则不连接

多索引数据帧到标准索引DF

如何在Quarto中的标题页之前创建序言页

如何在Python中实现高效地支持字典和堆操作的缓存?

大Pandas 中的群体交叉融合

意外的麻木图像reshape 为网格问题