Myślę, że możesz zrobić prawie dokładnie to, co uważałeś za idealne, używając pakietu statsmodels , który był jedną z `` pandas
opcjonalnych zależności przed pandas
'' wersją 0.20.0 (był używany do kilku rzeczy 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.
formula
, przypadkowoformulas
TypeError: from_formula() takes at least 3 arguments (2 given)
print(result.params)
iprint(result.summary())
formula()
podejścia generuje błąd typu TypeError: __init __ () brakuje 1 wymaganego argumentu pozycyjnego: „endog”, więc wydaje mi się, że jest on przestarzały. równieżols
jest terazOLS
Uwaga:
pandas.stats
została usunięta w wersji 0.20.0Można to zrobić za pomocą
pandas.stats.ols
:Zauważ, że musisz mieć
statsmodels
zainstalowany pakiet, jest on używany wewnętrznie przezpandas.stats.ols
funkcję.źródło
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://www.statsmodels.org/stable/regression.html
missing intercepts
. ProjektantR
pakietu równoważnego dostosowuje się, usuwając korektę dla średniej: stats.stackexchange.com/a/36068/64552 . . Inne sugestie:you can use sm.add_constant to add an intercept to the exog array
i użyjreg = ols("y ~ x", data=dict(y=y,x=x)).fit()
pandas.stats
💔Nie wiem, czy jest to nowe w programie
sklearn
lubpandas
, ale jestem w stanie przekazać ramkę danych bezpośrednio dosklearn
bez konwertowania ramki danych na tablicę numpy lub jakiekolwiek inne typy danych.źródło
.values.reshape(-1, 1)
do kolumn ramki danych. Na przykład:x_data = df['x_data'].values.reshape(-1, 1)
i przekazaniex_data
(i podobnie utworzonychy_data
) tablic np do.fit()
metody.Nie, po prostu przekonwertuj na tablicę NumPy:
Zajmuje to ciągły czas, ponieważ tworzy tylko widok danych. Następnie nakarm go, aby nauczyć się scikit:
źródło
np.matrix( np.asarray( df ) )
, ponieważ sklearn spodziewał się wektora pionowego, podczas gdy tablice numpy, po odcięciu ich od tablicy, działają jak poziome vecotry, co jest świetne przez większość czasu..values
atrybutu. Tjreg.fit(df[['B', 'C']].values, df['A'].values)
.Statsmodels kan tworzy model OLS z odwołaniami do kolumn bezpośrednio do ramki danych pandy.
Krótkie i słodkie:
model = sm.OLS(df[y], df[x]).fit()
Szczegóły kodu i podsumowanie regresji:
Wynik:
Jak bezpośrednio uzyskać R-kwadrat, współczynniki i wartość p:
źródło