我有一个像
这样的列的Pandas数据框Order Balance Profit cum (%)
我正在进行线性回归
model_profit_tr = pd.ols(y=df_closed['Profit cum (%)'], x=df_closed['Order'])
这个问题是标准模型就像(不通过原点的线的方程)
y = a * x + b
有2个自由度(a和b)
斜率(a):
a=model_profit_tr.beta['x']
和拦截(b):
b=model_profit_tr.beta['intercept']
我想降低我的模型的自由度(从2到1),我希望有一个像
这样的模型y = a * x
答案 0 :(得分:8)
使用intercept
关键字参数:
model_profit_tr = pd.ols(y=df_closed['Profit cum (%)'],
x=df_closed['Order'],
intercept=False)
来自docs:
In [65]: help(pandas.ols)
Help on function ols in module pandas.stats.interface:
ols(**kwargs)
[snip]
Parameters
----------
y: Series or DataFrame
See above for types
x: Series, DataFrame, dict of Series, dict of DataFrame, Panel
weights : Series or ndarray
The weights are presumed to be (proportional to) the inverse of the
variance of the observations. That is, if the variables are to be
transformed by 1/sqrt(W) you must supply weights = 1/W
intercept: bool
True if you want an intercept. Defaults to True.
nw_lags: None or int
Number of Newey-West lags. Defaults to None.
[snip]
答案 1 :(得分:0)
以下是显示解决方案的示例:
#!/usr/bin/env python
import pandas as pd
import matplotlib.pylab as plt
import numpy as np
data = [
(0.2, 1.3),
(1.3, 3.9),
(2.1, 4.8),
(2.9,5.5),
(3.3,6.9)
]
df = pd.DataFrame(data, columns=['X', 'Y'])
print(df)
# 2 degrees of freedom : slope / intercept
model_with_intercept = pd.ols(y=df['Y'], x=df['X'], intercept=True)
df['Y_fit_with_intercept'] = model_with_intercept.y_fitted
# 1 degree of freedom : slope ; intersept=0
model_no_intercept = pd.ols(y=df['Y'], x=df['X'], intercept=False)
df['Y_fit_no_intercept'] = model_no_intercept.y_fitted
# 1 degree of freedom : slope ; intersept=offset
offset = -1
df['Yoffset'] = df['Y'] - offset
model_with_offset = pd.ols(y=df['Yoffset'], x=df['X'], intercept=False)
df['Y_fit_offset'] = model_with_offset.y_fitted + offset
print(model_with_intercept)
print(model_no_intercept)
print(model_with_offset)
df.plot(x='X', y=['Y', 'Y_fit_with_intercept', 'Y_fit_no_intercept', 'Y_fit_offset'])
plt.show()