import numpy as np
import pandas as pd
import statsmodels.api as sm
import statsmodels.graphics as smg
data = pd.DataFrame({'Y': np.random.rand(1000), 'X':np.random.rand(1000)})
这有效
smg.regressionplots.plot_fit(sm.OLS(data.Y.values, data.X.values).fit(), 0, y_true=None)
这不是
smg.regressionplots.plot_fit(sm.OLS(data.Y, data.X).fit(), 0, y_true=None)
smg.regressionplots.plot_fit(sm.OLS(data['Y'], data['X']).fit(), 0, y_true=None)
答案 0 :(得分:4)
我追查到它,它确实是plot_fit
代码中的一个错误。在稳定版本中,您将找到以下行:
prstd, iv_l, iv_u = wls_prediction_std(results)
返回iv_l
和iv_u
,大概是用于绘制拟合值的标准偏差的上限值和下限值,如pandas系列。这会导致对ax.fill_between
的后续调用失败。
这似乎已在开发版https://github.com/statsmodels/statsmodels/blob/master/statsmodels/graphics/regressionplots.py中得到修复。你会在那里找到一个不同的电话:
prstd, iv_l, iv_u = wls_prediction_std(results._results)
iv_l
和iv_u
现在是numpy数组,如果你这样做,应该没有错误:
smg.regressionplots.plot_fit(sm.OLS(data['Y'], data['X']).fit(), 0, y_true=None)
现在你只需要满意
smg.regressionplots.plot_fit(sm.OLS(data.Y.values, data.X.values).fit(), 0, y_true=None)
尽管它与通常的标准线性回归调用并不完全一致。
答案 1 :(得分:3)
错误消息显示正在发生的事情。聚光:
/usr/lib/pymodules/python2.7/matplotlib/axes.pyc in fill_between(self, x, y1, y2, where, interpolate, **kwargs)
6542 start = xslice[0], y2slice[0]
-> 6543 end = xslice[-1], y2slice[-1]
[...]
/usr/local/lib/python2.7/dist-packages/pandas-0.11.0.dev_fc8de6d-py2.7-linux-i686.egg/pandas/core/index.pyc in get_value(self, series, key)
725 try:
--> 726 return self._engine.get_value(series, key)
727 except KeyError, e1:
728 if len(self) > 0 and self.inferred_type == 'integer':
[...]
KeyError: -1L
data.X
和data.Y
是Series
个对象,您无法使用[-1]
获取最后一个元素。如果可以的话,当你有一个使用-1
作为其元素之一的索引时,你会遇到麻烦:你想要最后一个元素,还是与-1
相关的元素?
pandas
尊重“面对模棱两可,拒绝猜测的诱惑”的原则,并选择不让这项工作,优先考虑标签而不是位置。你得到一个KeyError
,而不是IndexError
,暗示了这一点。例如,请参阅advanced indexing with integer labels上的文档中的讨论。