9

次のような列を持つ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
4

2 に答える 2

8

interceptキーワード引数を使用します。

model_profit_tr = pd.ols(y=df_closed['Profit cum (%)'], 
                         x=df_closed['Order'], 
                         intercept=False)

ドキュメントから:

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]
于 2012-09-30T20:33:52.877 に答える
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()
于 2012-10-01T10:33:12.457 に答える