当前位置: 首页 > 面试题库 >

从pandas 到Statsmodels的OLS中不推荐使用的滚动窗口选项

卫博雅
2023-03-14
问题内容

顾名思义,Pandas的ols命令中的rolling function选项在哪里迁移到statsmodels中?我似乎找不到。熊猫告诉我,厄运正在酝酿中:

FutureWarning: The pandas.stats.ols module is deprecated and will be removed in a future version. We refer to external packages like statsmodels, see some examples here: http://statsmodels.sourceforge.net/stable/regression.html
  model = pd.ols(y=series_1, x=mmmm, window=50)

实际上,如果您执行以下操作:

import statsmodels.api as sm

model = sm.OLS(series_1, mmmm, window=50).fit()

print(model.summary())

您会得到结果(窗口不会影响代码的运行),但是您只会获得在整个期间内运行的回归参数,而不是应该在每个滚动期间内使用的一系列参数。


问题答案:

我创建了一个ols模块来模拟熊猫的不赞成使用的模块MovingOLS;它是在这里。

它具有三个核心类:

  • OLS:静态(单窗口)普通最小二乘回归。输出是NumPy数组
  • RollingOLS:滚动(多窗口)普通最小二乘回归。输出是高维NumPy数组。
  • PandasRollingOLS:将RollingOLSpandas Series&DataFrames的结果包装起来。旨在模仿已弃用的熊猫模块的外观。

请注意,该模块是包的一部分(我目前正在上传到PyPi中),它需要一次包间导入。

上面的前两类完全在NumPy中实现,主要使用矩阵代数。 RollingOLS还充分利用广播的优势。属性主要模仿statsmodels的OLS
RegressionResultsWrapper

一个例子:

import urllib.parse
import pandas as pd
from pyfinance.ols import PandasRollingOLS

# You can also do this with pandas-datareader; here's the hard way
url = "https://fred.stlouisfed.org/graph/fredgraph.csv"

syms = {
    "TWEXBMTH" : "usd", 
    "T10Y2YM" : "term_spread", 
    "GOLDAMGBD228NLBM" : "gold",
}

params = {
    "fq": "Monthly,Monthly,Monthly",
    "id": ",".join(syms.keys()),
    "cosd": "2000-01-01",
    "coed": "2019-02-01",
}

data = pd.read_csv(
    url + "?" + urllib.parse.urlencode(params, safe=","),
    na_values={"."},
    parse_dates=["DATE"],
    index_col=0
).pct_change().dropna().rename(columns=syms)
print(data.head())
#                  usd  term_spread      gold
# DATE                                       
# 2000-02-01  0.012580    -1.409091  0.057152
# 2000-03-01 -0.000113     2.000000 -0.047034
# 2000-04-01  0.005634     0.518519 -0.023520
# 2000-05-01  0.022017    -0.097561 -0.016675
# 2000-06-01 -0.010116     0.027027  0.036599

y = data.usd
x = data.drop('usd', axis=1)

window = 12  # months
model = PandasRollingOLS(y=y, x=x, window=window)

print(model.beta.head())  # Coefficients excluding the intercept
#             term_spread      gold
# DATE                             
# 2001-01-01     0.000033 -0.054261
# 2001-02-01     0.000277 -0.188556
# 2001-03-01     0.002432 -0.294865
# 2001-04-01     0.002796 -0.334880
# 2001-05-01     0.002448 -0.241902

print(model.fstat.head())
# DATE
# 2001-01-01    0.136991
# 2001-02-01    1.233794
# 2001-03-01    3.053000
# 2001-04-01    3.997486
# 2001-05-01    3.855118
# Name: fstat, dtype: float64

print(model.rsq.head())  # R-squared
# DATE
# 2001-01-01    0.029543
# 2001-02-01    0.215179
# 2001-03-01    0.404210
# 2001-04-01    0.470432
# 2001-05-01    0.461408
# Name: rsq, dtype: float64


 类似资料:
  • 问题内容: 我有一个模态框窗口(弹出窗口),其中包含一个iframe, 并且在该 iframe中 有一个可滚动的 div 。 当我滚动iframe的内部DIV,并且达到其上限或下限时, 浏览器本身的窗口就会开始滚动。这是 不想要的行为 。 我已经尝试过类似的操作, 当鼠标进入弹出框区域时,该操作会在onMouseEnter时终止主窗口滚动: e.preventDefault()由于某些原因无法正常

  • 问题内容: 我正在寻找一种类似的各种功能的方法,但我希望滚动计算的窗口由一个值范围(例如,DataFrame列的值范围)定义,而不是由窗口中的行数。 例如,假设我有以下数据: 如果执行类似的操作,则会得到一个滚动总和,其中每个窗口包含5行。但是我想要的是一个滚动总和,其中每个窗口都包含的一定范围的值。也就是说,我希望能够执行类似的操作,并得到一个结果,其中第一个窗口包含所有介于1和5之间的行,然后

  • 我收到此错误,并且尝试将更改为仍然收到不同的错误。

  • 我正在使用statsmodels的OLS线性回归和Patsy四次公式,但得到的回归与LibreOffice Calc的数据相比不太吻合。为什么这与LibreOffice Calc的结果不匹配? STATSAMDELS代码: 生成以下系数: 和下面的图表: 但是,如果我将数据放入LibreOffice Calc,请单击绘图并选择“插入趋势线…”,选择“多项式”,输入“度”=4,然后选择“显示方程”,

  • 问题内容: 我已经看到了许多在API上使用注释以将其标记为“需要尽快替换”的示例。 但是,在几乎所有这些情况下,代码开发人员不仅继续使用已弃用的API,而且还抑制了弃用警告。 似乎API开发人员的最佳意图最终是创建更多与已实现的业务逻辑无关的代码- 如果不赞成使用API​​,但在抑制相关警告的情况下继续使用它,则似乎充其量只是代码的降级,并且在IMHO最差的情况下替换不推荐使用的库时,可能会导致应