使用scipy的linregress计算SMA斜率返回NaN的问题咨询
斜率返回NaN的原因
- 直接原因:
scipy.stats.linregress对输入的序列有非空要求,只要自变量或因变量中存在NaN值,回归计算的所有返回值都会是NaN。你提供的数据集里SMA列前10行全部为空值,直接传入全量数据计算就会得到NaN结果。 - 次要校验:你可以运行
print(df['SMA'].isna().sum())查看空值数量,当前数据集的空值数为10,符合这个触发条件。
修复方案
你只需要先筛选出SMA列非空的子集再做回归计算即可,参考代码如下:
import pandas as pd import datetime as dt from scipy import stats # 原有日期处理逻辑不变 df.date = pd.to_datetime(df.date) df['date_ordinal'] = df['date'].map(dt.toordinal) # 新增筛选有效数据的步骤 valid_data = df.dropna(subset=['SMA']) slope, intercept, r_value, p_value, std_err = stats.linregress(valid_data['date_ordinal'], valid_data['SMA']) # 赋值斜率到全表 df['slope'] = slope
注:如果你需要计算滚动窗口的斜率而非全局斜率,需要将上述计算逻辑放到rolling.apply中实现。
内容的提问来源于stack exchange,提问作者confused
相关产品推荐
相关产品推荐

