首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >statmodels回归图不适用于pandas数据类型

statmodels回归图不适用于pandas数据类型
EN

Stack Overflow用户
提问于 2013-03-21 03:42:19
回答 2查看 1.2K关注 0票数 0
代码语言:javascript
复制
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)})

这是可行的

代码语言:javascript
复制
smg.regressionplots.plot_fit(sm.OLS(data.Y.values, data.X.values).fit(), 0, y_true=None)

这不是

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-21 03:52:30

该错误消息揭示了所发生的情况。压缩:

代码语言:javascript
复制
/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.Xdata.Y都是Series对象,不能使用[-1]获取最后一个元素。如果可以,那么当您有一个使用-1作为其元素之一的索引时,您可能会遇到麻烦:是要最后一个元素,还是要与-1关联的元素

pandas尊重“面对歧义,拒绝猜测的诱惑”的原则,并选择不让这个工作,优先考虑标签而不是位置。你得到的是KeyError,而不是IndexError,这就暗示了这一点。例如,请参阅有关advanced indexing with integer labels的文档中的讨论。

票数 3
EN

Stack Overflow用户

发布于 2013-03-21 06:14:32

我追踪到了它,它确实是plot_fit代码中的一个错误。在稳定版本中,你会发现这一行:

代码语言:javascript
复制
prstd, iv_l, iv_u = wls_prediction_std(results)

它返回iv_liv_u,大概是绘制拟合值的标准差的上下值,如pandas Series。这会导致对ax.fill_between的后续调用失败。

这似乎已经在开发版本的https://github.com/statsmodels/statsmodels/blob/master/statsmodels/graphics/regressionplots.py中得到了修复。在那里你会发现一个不同的调用:

代码语言:javascript
复制
prstd, iv_l, iv_u = wls_prediction_std(results._results)

iv_liv_u现在是numpy数组,如果这样做,应该不会再有错误:

代码语言:javascript
复制
smg.regressionplots.plot_fit(sm.OLS(data['Y'], data['X']).fit(), 0, y_true=None)

现在你只需要满足于

代码语言:javascript
复制
smg.regressionplots.plot_fit(sm.OLS(data.Y.values, data.X.values).fit(), 0, y_true=None)

即使它与通常的标准线性回归并不一致。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15533174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档