【问题标题】:FbProphet model gives TypeError: float() argument must be a string or a number, not 'datetime.datetime'FbProphet 模型给出 TypeError: float() argument must be a string or a number, not 'datetime.datetime'
【发布时间】:2019-12-29 20:21:49
【问题描述】:

您好,我正在尝试使用 python FbProphet 模型生成时间序列预测模型。我在实施过程中遇到以下错误。以下是我收到的错误。

----------------------------------- ---------------------------- TypeError Traceback(最近一次调用 最后)在() 36 f14.set_figheight(5) 37 f14.set_figwidth(15) ---> 38 fig = model_prop.plot(forecast, ax=ax14)

C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\site-packages\fbprophet\forecaster.py 在情节(自我,fcst,ax,不确定性,plot_cap,xlabel,ylabel)1520 返回图(1521 m=self,fcst=fcst,ax=ax, 不确定性=不确定性, -> 1522 plot_cap=plot_cap,xlabel=xlabel,ylabel=ylabel,1523)1524

C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\site-packages\fbprophet\plot.py 在 绘图(m,fcst,ax,不确定性,plot_cap,xlabel,ylabel,figsize) 68 无花果 = ax.get_figure() 69 fcst_t = fcst['ds'].dt.to_pydatetime() ---> 70 ax.plot(m.history['ds'].dt.to_pydatetime(), m.history['y'], 'k.') 71 ax.plot(fcst_t, fcst['yhat'], ls='-', c='#0072B2') 72 如果 fcst 和 plot_cap 中的“上限”:

C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\site-packages\matplotlib__init__.py 在 内部(斧头,*args,**kwargs)1853“的 Matplotlib 列表!)" % (label_namer, func.name), 1854
运行时警告,堆栈级别 = 2) -> 1855 return func(ax, *args, **kwargs) 1856 1857 inner.doc = _add_data_doc(inner.doc,

C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\site-packages\matplotlib\axes_axes.py in plot(self, *args, **kwargs) 1526 1527 for line in self._get_lines(*args, **kwargs): -> 1528 self.add_line(line) 1529 lines.append(line) 1530

C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\site-packages\matplotlib\axes_base.py 在 add_line(self, line) 1930
line.set_clip_path(self.patch) 1931 -> 1932 self._update_line_limits(line) 1933 如果不是 line.get_label(): 1934 line.set_label('_line%d' % len(self.lines))

C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\site-packages\matplotlib\axes_base.py 在 _update_line_limits(self, line) 1952 中找出 给定行的数据限制,更新 self.dataLim。 1953
""" -> 1954 path = line.get_path() 1955 if path.vertices.size == 0: 1956 返回

C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\site-packages\matplotlib\lines.py 在 获取路径(自我) 第949章 950 如果 self._invalidy 或 self._invalidx: --> 951 self.recache() 第952章 第953章

C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\site-packages\matplotlib\lines.py 在 重新缓存(自我,总是) 650 如果总是或 self._invalidx: 第651章 --> 652 x = _to_unmasked_float_array(xconv).ravel() 653 其他: 654 x = 自我._x

C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\site-packages\matplotlib\cbook__init__.py 在 _to_unmasked_float_array(x) 2048 中返回 np.ma.asarray(x, 浮动)。填充(np.nan)2049其他: -> 2050 返回 np.asarray(x, float) 2051 2052

C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\site-packages\numpy\core\numeric.py 在 asarray(a, dtype, 顺序) 536 第537章 --> 538 返回数组(a,dtype,copy=False,order=order) 539 540

TypeError: float() 参数必须是字符串或数字,而不是 '日期时间.日期时间'

以下是我试过的代码

for i in Brokers:
    series2=TimeSeriesData[TimeSeriesData.BrokerName == b][['Gross_Premium']]
    series2['ds']=Broker_Clusters.index
    series2['y'] = series2.Gross_Premium
    series2=series2.drop('Gross_Premium',axis=1)
    series2['ds'] = series2['ds'].apply(str)

    #divide into train and validation set
    train = series2[:int(0.7*(len(series2)))]
    test = series2[int(0.7*(len(series2))):]

    model_prop=Prophet() 
    model_prop.fit(train)
    forecast = model_prop.predict(test)
    # Plot the forecast
    f14, ax14 = plt.subplots(1)
    f14.set_figheight(5)
    f14.set_figwidth(15)
    fig = model_prop.plot(forecast, ax=ax14)

以下是我的测试数据集

                             ds             y
Date                                         
2016-03-15  2016-03-15 00:00:00       0.00000
2016-04-15  2016-04-15 00:00:00  180534.47230
2016-05-15  2016-05-15 00:00:00       0.00000
2016-06-15  2016-06-15 00:00:00    2545.12000
2016-07-15  2016-07-15 00:00:00       0.00000
2016-08-15  2016-08-15 00:00:00       0.00000
2016-09-15  2016-09-15 00:00:00       0.00000
2016-10-15  2016-10-15 00:00:00   20637.88000
2016-11-15  2016-11-15 00:00:00       0.00000
2016-12-15  2016-12-15 00:00:00       0.00000
2017-01-15  2017-01-15 00:00:00       0.00000
2017-02-15  2017-02-15 00:00:00       0.00000
2017-03-15  2017-03-15 00:00:00    8878.08000
2017-04-15  2017-04-15 00:00:00  198174.32710
2017-05-15  2017-05-15 00:00:00       0.00000
2017-06-15  2017-06-15 00:00:00    3458.61875
2017-07-15  2017-07-15 00:00:00       0.00000
2017-08-15  2017-08-15 00:00:00       0.00000
2017-09-15  2017-09-15 00:00:00       0.00000
2017-10-15  2017-10-15 00:00:00    5159.47000
2017-11-15  2017-11-15 00:00:00       0.00000
2017-12-15  2017-12-15 00:00:00       0.00000

【问题讨论】:

    标签: python time-series


    【解决方案1】:

    您的问题是您拥有的日期列的type。在您的情况下,它是一个字符串,并且应该是一个时间戳。

    改为:

    series2['ds'] = series2['ds'].apply(str)
    

    用途:

    series2['ds'] = list(map(lambda x: pd.to_datetime(x), series2['ds']))
    

    【讨论】:

      【解决方案2】:

      尝试在plot() 调用之前添加以下内容

      pd.plotting.register_matplotlib_converters()
      

      它对我有用。

      【讨论】:

        猜你喜欢
        • 2022-11-11
        • 2021-12-13
        • 2016-11-13
        • 2022-12-26
        • 2021-02-02
        • 2012-05-15
        • 1970-01-01
        • 2017-03-09
        • 2021-06-25
        相关资源
        最近更新 更多