【问题标题】:Python/Pandas: TypeError: float() argument must be a string or a number, not 'function'Python/Pandas:TypeError:float() 参数必须是字符串或数字,而不是“函数”
【发布时间】:2020-02-12 18:54:01
【问题描述】:

我正在尝试从 .csv 文件中的两列生成图。 x 轴的列采用短日期格式 mm/dd/yyyy,而 y 轴的列对应于作为常规数值的吸收测量数据。由此,我还试图从该图中收集线性回归线。这是我目前所拥有的:

mydateparser = lambda x: datetime.strptime(x, '%m/%d/%y')

df = (pd.read_csv('calibrationabs200211.csv', index_col=[], parse_dates=[0],
                  infer_datetime_format=True, date_parser=mydateparser))

if mydateparser == '%m/%d/%y':
    print('Error')
else:
    mydateparser = float(mydateparser)

plt.figure(figsize=(15,7.5))

x = df.iloc[:, 0].values.reshape(-1, 1)
y = df.iloc[:, 1].values.reshape(-1, 1)
linear_regressor = LinearRegression()
linear_regressor.fit(x, y)
y_pred = linear_regressor.predict(y)

plt.scatter(x, y, color='teal')
plt.plot(x, y_pred, color='teal')

plt.show()

但是,我收到一条错误消息:

TypeError                                 Traceback (most recent call last)
<ipython-input-272-d087bdc00150> in <module>
     12     print('Error')
     13 else:
---> 14     mydateparser = float(mydateparser)
     15 
     16 plt.figure(figsize=(15,7.5))

TypeError: float() argument must be a string or a number, not 'function'

此外,如果我注释掉 If 语句,我最终会得到一个情节,but with a faulty linear regression. 我对 python、matplotlib 和 pandas 还很陌生,因此非常感谢任何帮助或反馈。谢谢!

【问题讨论】:

  • 你的 if/else 块没用,试着消除它,看看你是否达到了目标。
  • 感谢您的回复。最后一位嵌入的图像显示了当我删除 if/else 块时会发生什么。我不能从 lambda 函数中解析出日期时间吗?我正在尝试将日期列转换为字符串或整数,以便绘图可以轻松生成 x 轴。
  • 我怀疑你不能对日期进行线性回归,除非你完全确定你想要它...... if/else 块后面的代码只是按照你的意图绘制你的分析结果它。

标签: python pandas matplotlib


【解决方案1】:

Python 中的函数可以用作变量,这就是您在这里所做的。如果你想用函数的结果做某事,你需要在函数名后面加上()来调用它。

mydateparser 是一个函数,mydateparser() 是调用该函数的结果。

此外,我认为您所做的比较没有意义。 datetime.strptime 返回一个 datetime 对象,稍后您将其与字符串进行比较。实际上,我完全不确定您要使用该块来完成什么。

您的回归需要将日期转换为某种数值以进行回归。我建议使用 matplotlib 的日期转换函数,特别是 date2num,来试试这个。

应该是这样的:

from matplotlib import dates
...
x = df[0].apply(dates.date2num)

【讨论】:

  • 感谢您的回复,对于造成的混乱,我深表歉意。我的印象是 datetime 对象是一个字符串。我可以给你的最简单的解释是,我正在尝试将 .csv 文件中的日期列转换为可能的整数或字符串,以便绘图可以轻松生成 x 轴。
  • 试试 matplotlib 的日期转换函数之一:matplotlib.org/3.1.0/api/dates_api.html。具体来说,使用 date2num 获取可以在回归中使用的每个日期的数值。应该只需要: from matplotlib import dates 然后你可以将日期列转换为整数:df[0] = df[0].apply(date2num)
  • 添加代码以大致获得您想要的内容。但是,您需要弄清楚要回归的内容。日级别的粒度是否足够,或者您是否需要更细粒度的日期时间值? Date2num 给出自 00:00 UTC 以来的天数,这可能是您想要的。
  • @nano_horizo​​n 哟,检查我的编辑。可能是你想要的。不记得您是否仅通过回复收到通知。
  • 收到您的回复。非常感谢,伙计。此外,为您的用户名添加回文很好。
【解决方案2】:

您必须调用 lambda 才能使其发挥作用。

【讨论】:

    【解决方案3】:

    在代码的开头,您将 mydateparser 声明为 lambda 函数。 但是 float() 函数只接受字符串或数字。

    我假设您使用日期列作为线性回归模型的一个特征,这没有意义。

    相反,您可以派生新特征,例如月、年、日期、工作日/周末,以用于线性回归。

    如果您希望预测下一个日期的值,您可以查看时间序列预测模型。

    【讨论】:

    • 感谢您的评论。我会研究你的建议。我的问题底部超链接中嵌入的图像显示 x 轴有日期,但线性回归是错误的。为了解决这个问题,我试图将日期列转换为字符串或整数。我想我必须自己进入 .csv 文件并手动执行此操作。
    猜你喜欢
    • 2017-05-06
    • 2018-02-26
    • 2022-01-09
    • 2015-12-03
    • 2013-12-30
    • 2020-04-24
    • 2017-03-01
    • 2020-10-04
    相关资源
    最近更新 更多