当前位置: 首页 > 知识库问答 >
问题:

使用数据框运行OLS回归

马新觉
2023-03-14

我有一个pandas数据框,我希望能够根据B列和C列中的值预测a列的值。下面是一个玩具示例:

import pandas as pd
df = pd.DataFrame({"A": [10,20,30,40,50], 
                   "B": [20, 30, 10, 40, 50], 
                   "C": [32, 234, 23, 23, 42523]})

理想情况下,我会有类似于ols(A~bc,data=df)的东西,但当我查看算法库中的示例时,比如scikit learn,它似乎会使用行列表而不是列将数据提供给模型。这需要我将数据重新格式化为列表中的列表,这似乎违背了最初使用熊猫的目的。对熊猫数据帧中的数据运行OLS回归(或更普遍的任何机器学习算法)的最具python风格的方式是什么?

共有3个答案

林礼骞
2023-03-14

我不知道这在sklearnpandas中是否是新的,但我能够将数据帧直接传递到sklearn,而无需将数据帧转换为numpy数组或任何其他数据类型。

from sklearn import linear_model

reg = linear_model.LinearRegression()
reg.fit(df[['B', 'C']], df['A'])

>>> reg.coef_
array([  4.01182386e-01,   3.51587361e-04])
茅星雨
2023-03-14

注意:pandas.stats已被删除0.20.0

使用熊猫可以做到这一点。统计数据。ols

>>> from pandas.stats.api import ols
>>> df = pd.DataFrame({"A": [10,20,30,40,50], "B": [20, 30, 10, 40, 50], "C": [32, 234, 23, 23, 42523]})
>>> res = ols(y=df['A'], x=df[['B','C']])
>>> res
-------------------------Summary of Regression Analysis-------------------------

Formula: Y ~ <B> + <C> + <intercept>

Number of Observations:         5
Number of Degrees of Freedom:   3

R-squared:         0.5789
Adj R-squared:     0.1577

Rmse:             14.5108

F-stat (2, 2):     1.3746, p-value:     0.4211

Degrees of Freedom: model 2, resid 2

-----------------------Summary of Estimated Coefficients------------------------
      Variable       Coef    Std Err     t-stat    p-value    CI 2.5%   CI 97.5%
--------------------------------------------------------------------------------
             B     0.4012     0.6497       0.62     0.5999    -0.8723     1.6746
             C     0.0004     0.0005       0.65     0.5826    -0.0007     0.0014
     intercept    14.9525    17.7643       0.84     0.4886   -19.8655    49.7705
---------------------------------End of Summary---------------------------------

请注意,您需要安装statsmodels软件包,它由panda内部使用。统计数据。ols功能。

颜宸
2023-03-14

我认为,使用statsmodels包,您几乎可以完全做到您认为理想的事情,该包是pandas版本0.20之前的可选依赖项之一。0(它用于pandas.stats中的一些内容)

>>> import pandas as pd
>>> import statsmodels.formula.api as sm
>>> df = pd.DataFrame({"A": [10,20,30,40,50], "B": [20, 30, 10, 40, 50], "C": [32, 234, 23, 23, 42523]})
>>> result = sm.ols(formula="A ~ B + C", data=df).fit()
>>> print(result.params)
Intercept    14.952480
B             0.401182
C             0.000352
dtype: float64
>>> print(result.summary())
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                      A   R-squared:                       0.579
Model:                            OLS   Adj. R-squared:                  0.158
Method:                 Least Squares   F-statistic:                     1.375
Date:                Thu, 14 Nov 2013   Prob (F-statistic):              0.421
Time:                        20:04:30   Log-Likelihood:                -18.178
No. Observations:                   5   AIC:                             42.36
Df Residuals:                       2   BIC:                             41.19
Df Model:                           2                                         
==============================================================================
                 coef    std err          t      P>|t|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
Intercept     14.9525     17.764      0.842      0.489       -61.481    91.386
B              0.4012      0.650      0.617      0.600        -2.394     3.197
C              0.0004      0.001      0.650      0.583        -0.002     0.003
==============================================================================
Omnibus:                          nan   Durbin-Watson:                   1.061
Prob(Omnibus):                    nan   Jarque-Bera (JB):                0.498
Skew:                          -0.123   Prob(JB):                        0.780
Kurtosis:                       1.474   Cond. No.                     5.21e+04
==============================================================================

Warnings:
[1] The condition number is large, 5.21e+04. This might indicate that there are
strong multicollinearity or other numerical problems.
 类似资料:
  • 假设我有一个数据帧,其中包含一个列(称为colA ),这是一个行序列。我想在可乐的每个记录中添加一个新字段。(而新的字段与之前的记录关联,所以我必须写一个udf。)这个udf应该怎么写? 我尝试编写一个udf,它将colA作为输入,并输出Seq[Row],其中每个记录都包含新字段。但问题是udf无法返回Seq[Row]/异常是“org.apache.spark.sql类型的模式”。不支持行“”。我

  • 问题内容: 我正在使用monotonically_increasing_id()使用以下语法将行号分配给pyspark数据帧: 现在df1有26,572,528条记录。因此,我期望idx值为0-26,572,527。 但是当我选择max(idx)时,它的值非常大:335,008,054,165。 这个功能是怎么回事?使用此功能与具有相似记录数量的另一个数据集合并是否可靠? 我有大约300个数据框,

  • 问题内容: 在不使用sql / hiveContext的Spark中使用groupby-having的语法是什么?我知道我能做 但是我该如何使用类似的语法 这似乎不存在。 问题答案: 是的,它不存在。您表达了相同的逻辑,后跟:

  • 问题内容: Python pandas具有pct_change函数,可用于计算数据帧中股票价格的回报: 我正在使用以下代码获取对数返回值,但它给出的值与pct.change()函数完全相同: 问题答案: 这是一种使用来计算日志返回的方法。结果与所计算的总收益相似但不相同。您可以上传示例数据的副本(Dropbox共享链接)以重现您看到的不一致之处吗?

  • 问题内容: 我有一个数据框,类似: 我想在数据框的末尾添加一个“总计”行: 我尝试使用该命令,但最终得到一个Series,尽管可以将其转换回Dataframe,但它不维护数据类型: 我想维护原始数据帧中的数据类型,因为我需要对总行应用其他操作,例如: 问题答案: 将总计行附加到 仅当您有一列字符串或对象时,才需要进行转换。 这是一个脆弱的解决方案,因此我建议仍然坚持对数据框进行操作。例如。

  • 我有一个数据框架,其中有一列用于分组和问题答案列: 我想将问题的列移到行中,这样所需的数据框将如下所示: ...依此类推,直到最后一行: 最好的方法是什么?