【问题标题】:ERROR: ValueError: Must pass DataFrame with boolean values only when I try to do a scatter plot using statsmodels错误:ValueError:只有当我尝试使用 statsmodels 进行散点图时,才必须传递带有布尔值的 DataFrame
【发布时间】:2017-04-11 22:32:22
【问题描述】:

我是 Python 新手,我阅读的相关问题对我来说没有多大意义。我有以下问题。我想用 Python 做多元回归,我正在尝试 statsmodels。在这种情况下,我想做一个散点图。

我的数据样本:

ID  order  V1     V2    E1  E2  E3   M
103  1    ECA    TEXT    7   3   5   7
105  1    ECA    TEXT    3   7   4   5
107  1    ECA    TEXT    7   7   7   4
109  1    ECA    TEXT    6   6   6   3

我想用 E1-E3 作为我的 IV 和 M 的平均分数作为我的 DV 进行多元回归。

这就是我加载数据的方式。

myRegressionData = pd.read_csv('C:/Users/user/Desktop/Folder 1/Python/Regression data file.csv')

这些是我的 x 和 y:

X_sk = myRegressionData[[col for col in myRegressionData.columns if col[:8] == 'E']]

Y = myRegressionData[['M{}'.format(ii) for ii in range(1, 19)]]
y = np.mean(Y, axis=1)

这是我得到错误的代码:

myRegressionData.plot(kind='scatter',x = X_sk, y=np.mean(Y, axis=1))

返回

ValueError:必须只传递带有布尔值的DataFrame

myRegressionData.info() 

返回

RangeIndex:90 个条目,0 到 89 列:146 个条目,IDOpenEndedResponse 到 EngagingAA dtypes:float64(10)、int64(134)、object(2) 内存使用量:102.7+ KB

【问题讨论】:

  • 没有您的数据,我们无法完全解决此问题,例如myRegressionData.info() 显示什么?如果你只是做了myRegressionData.plot.scatter(x = X_sk, y = np.mean(Y, axis=1)) 或只是myRegressionData.plot().bar(),会不会很糟糕
  • @EdChum 将是: RangeIndex:90 个条目,0 到 89 列:146 个条目,IDOpenEndedResponse 到 EngagingAA dtypes:float64(10),int64 (134),对象(2) 内存使用量:102.7+ KB。不,它不起作用,我得到同样的错误。
  • 请将其编辑到您的问题中,除了值错误可能是虚假的,因为散点图可以处理的不仅仅是布尔值,因此您需要发布一个包含原始数据的最小示例,您的代码以加载 df ,所有重现错误的代码和所需的输出
  • 不幸的是仍然需要原始数据,你可能有不可靠的数据
  • 在您的示例数据中,您只有一个 M 目标列,但聚合了 18 个目标列。也许您应该通过在示例数据中添加另一个M 列来表明这一点,这样您就有了M1M2。此外,您可能应该更新您的代码以使用col[:1] == 'E'range(1, 3),或类似的。还要记住,range 在开头包含在内,但在结尾不包含在内。

标签: python statsmodels


【解决方案1】:

如下:

myRegressionData.plot(kind='scatter',x = X_sk, y=np.mean(Y, axis=1))

xy expect column names,或不雅。 X_sknp.mean(Y, axis=1) 是数据。提供列名或直接使用您的绘图仪。


我们使用matplotlib的示例:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

myRegressionData = pd.DataFrame([
    {'a0': 4, 'a1': 3, 'b0': 2, 'b1': 1}, 
    {'a0': 3, 'a1': 1, 'b0': 4, 'b1': 1}, 
    {'a0': 1, 'a1': 2, 'b0': 3, 'b1': 1}
])

X_sk = myRegressionData[[col for col in myRegressionData.columns if col[:1] == 'b']]
Y = myRegressionData[['a{}'.format(ii) for ii in range(0,2)]]
plt.scatter(X_sk['b0'], np.mean(Y, axis=1))

该示例应该是您正在做的事情的简化版本。


如果你坚持使用 pandas DataFrame 绘图仪,你可以这样做:

y = pd.DataFrame(np.mean(Y, axis=1), columns=['y'])
df = pd.concat([X_sk, y], axis=1)
df.plot(kind='scatter', x='b0', y='y')

有许多 X 值,但只有一个 y 值并使用颜色进行区分:

X_sk = myRegressionData[[col for col in myRegressionData.columns if col[:1] == 'b']]
Y = myRegressionData[['a{}'.format(ii) for ii in range(0,2)]]
y = pd.DataFrame(np.mean(Y, axis=1))
yy = pd.concat([y, y])
plt.scatter(X_sk, yy, c=['b', 'r'])

使用scatter_matrix的最终替代方案:

y = pd.DataFrame(np.mean(Y, axis=1), columns=['y'])
df = pd.concat([X_sk, y], axis=1)
scatter_matrix(df, alpha=0.2, figsize=(6, 6))

【讨论】:

  • 这样有效,但一次只能使用一列 X_SK 否则我会收到错误 x 和 y 必须具有相同的大小。
  • model = sm.OLS(y, X_sk) results = model.fit() #创建一个情节 fig, ax = plt.subplots() fig = sm.graphics.plot_fit(results, 0, ax=ax) plt.show() 可以吗?
  • 看看我的更新。只需多次添加y。除此之外,我建议看看这个关于散点图矩阵的问题:stackoverflow.com/questions/7941207/…
猜你喜欢
  • 1970-01-01
  • 2019-04-27
  • 2017-07-02
  • 2020-07-13
  • 2021-06-01
  • 2017-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多