欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

fbprophet 预言家使用测试

最编程 2024-04-10 22:17:23
...

https://blog.****.net/qq_23860475/article/details/81354467

原博在这里
import pandas as pd
import numpy as np
from fbprophet import Prophet
import matplotlib.pyplot as plt


df = pd.read_excel('example_wp_peyton_manning.xlsx')
df['y'] = np.log(df['y'])
playoffs = pd.DataFrame({
  'holiday': 'playoff',
  'ds': pd.to_datetime(['2008-01-13', '2009-01-03', '2010-01-16',
                        '2010-01-24', '2010-02-07', '2011-01-08',
                        '2013-01-12', '2014-01-12', '2014-01-19',
                        '2014-02-02', '2015-01-11', '2016-01-17',
                        '2016-01-24', '2016-02-07']),
  'lower_window': 0,
  'upper_window': 1,
})
superbowls = pd.DataFrame({
  'holiday': 'superbowl',
  'ds': pd.to_datetime(['2010-02-07', '2014-02-02', '2016-02-07']),
  'lower_window': 0,
  'upper_window': 1,
})
holidays = pd.concat((playoffs, superbowls))  # 季后赛和超级碗比赛特别日期
m = Prophet(holidays=holidays)  # 指定节假日参数,其它参数以默认值进行训练
m.fit(df)  # 对过去数据进行训练
future = m.make_future_dataframe(freq='D',periods=365)  # 建立数据预测框架,数据粒度为天,预测步长为一年
forecast =m.predict(future)
m.plot(forecast)  # 绘制预测效果图
plt.show()
m.plot_components(forecast)  # 绘制成分趋势图
plt.show()

原博上的代码,我这里用来测试一下功能。
因为图片不能显示,闪退,我改了一点代码
运行结果如下

Initial log joint probability = -8.22805
    Iter      log prob        ||dx||      ||grad||       alpha      alpha0  # evals  Notes 
      99       9754.87    0.00578108       1381.96           1           1      122   
    Iter      log prob        ||dx||      ||grad||       alpha      alpha0  # evals  Notes 
     199       9782.15    0.00377384       666.677           1           1      229   
    Iter      log prob        ||dx||      ||grad||       alpha      alpha0  # evals  Notes 
     299       9787.99   0.000453574        230.12      0.4708           1      341   
    Iter      log prob        ||dx||      ||grad||       alpha      alpha0  # evals  Notes 
     399       9792.73    0.00082002        441.99      0.7395      0.7395      460   
    Iter      log prob        ||dx||      ||grad||       alpha      alpha0  # evals  Notes 
     499        9796.1    0.00110105       162.415           1           1      575   
    Iter      log prob        ||dx||      ||grad||       alpha      alpha0  # evals  Notes 
     576       9798.58   1.47631e-05       163.594   8.109e-08       0.001      716  LS failed, Hessian reset 
     599       9799.37    0.00529958       698.865           1           1      740   
    Iter      log prob        ||dx||      ||grad||       alpha      alpha0  # evals  Notes 
     699       9801.22   2.23812e-05       63.8531           1           1      855   
    Iter      log prob        ||dx||      ||grad||       alpha      alpha0  # evals  Notes 
     799       9801.78    0.00237766       463.774           1           1      972   
    Iter      log prob        ||dx||      ||grad||       alpha      alpha0  # evals  Notes 
     831       9801.93   5.75156e-06       66.1005   6.997e-08       0.001     1053  LS failed, Hessian reset 
     899       9802.31   0.000111814       185.348     0.06377      0.6098     1134   
    Iter      log prob        ||dx||      ||grad||       alpha      alpha0  # evals  Notes 
     926       9802.53   1.17466e-05       121.538   6.346e-08       0.001     1215  LS failed, Hessian reset 
     959       9802.76   8.95068e-06         96.06   7.093e-08       0.001     1304  LS failed, Hessian reset 
     999       9802.82   2.78071e-05       108.203     0.04923      0.9352     1355   
    Iter      log prob        ||dx||      ||grad||       alpha      alpha0  # evals  Notes 
    1099       9803.99    0.00139863       302.943           1           1     1466   
    Iter      log prob        ||dx||      ||grad||       alpha      alpha0  # evals  Notes 
    1199        9804.9   0.000434855       145.147           1           1     1589   
    Iter      log prob        ||dx||      ||grad||       alpha      alpha0  # evals  Notes 
    1278       9805.48   1.79259e-05       173.491   1.337e-07       0.001     1711  LS failed, Hessian reset 
    1299       9805.66    0.00045454       147.286           1           1     1738   
    Iter      log prob        ||dx||      ||grad||       alpha      alpha0  # evals  Notes 
    1399       9805.93   6.79296e-05       98.3221           1           1     1866   
    Iter      log prob        ||dx||      ||grad||       alpha      alpha0  # evals  Notes 
    1473       9806.04   2.18264e-05       182.704   1.669e-07       0.001     1993  LS failed, Hessian reset 
    1499       9806.05   0.000101355       111.128      0.5452           1     2030   
    Iter      log prob        ||dx||      ||grad||       alpha      alpha0  # evals  Notes 
    1508       9806.06   5.64245e-06        75.287   6.175e-08       0.001     2084  LS failed, Hessian reset 
    1522       9806.06   7.78665e-07       52.5976      0.9696      0.2839     2107   
Optimization terminated normally: 
  Convergence detected: relative gradient magnitude is below tolerance

Process finished with exit code 0

效果图如下


image.png

image.png
等过段时间,我缓缓在更新一波参数

我学习这个算法的时候其实是因为我老公忽悠我,说这个算法对时间序列表现优秀,但是我也在一些博客里看到了,只是比别的算法好一点而已,并不是特别优秀,我又在忧虑我公司那种刁钻的数据了,我试一下吧,再来更新一下。
----------------------------分割线--------------------------------------
我发现了一个有用的网址。
https://blog.****.net/wjskeepmaking/article/details/64905745

fbprophet目前仅支持以天为最小的时间粒度,下面这个网址介绍了修改代码,使得最小时间粒度变为小时。
https://blog.****.net/wjskeepmaking/article/details/65626872

----------------------------分割线--------------------------------------
现在是2020年1月20日
到今天为止,最小的时间粒度还是天。
我在2018年5月的时候买了一个新电脑,用Linux系统(Ubuntu18),安装真的很简单,pip就可以
----------------------------分割线--------------------------------------
我自己写了一段代码,用于练习,预测的是天池大赛,资金流的流入流出预测,不构建特征,单纯使用时间序列。

数据和需求见如下网址,用2013年7月1日到2014年8月31日的数据,来预测2014年9月1日到30日的数据(仅买入和赎出的总量)
https://tianchi.aliyun.com/competition/entrance/231573/information

# coding:utf-8

import pandas as pd
from fbprophet import Prophet
import matplotlib.pyplot as plt

data = pd.read_csv("total_ds_y.csv")
# 将时间列重命名为ds,将需要预测的列重命名为y
data = data.rename(columns={'report_date': 'ds', 'total_redeem_amt': 'y'})
ds = data.get('ds')
y = data.get('y')
# 数据有多列仅拼接这两列
train_data = pd.concat((ds, y), axis=1)

holidays = pd.DataFrame({
  #   可以随意命名,这里是因为可以添加多个不一样的holiday
  'holiday': 'holiday',
  #   节假日的日期
  'ds': pd.to_datetime(['2013-09-19', '2013-09-20', '2013-09-21',
                        '2013-10-01', '2013-10-02', '2013-10-03',
                        '2013-10-04', '2013-10-05', '2013-10-06',
                        '2013-10-07', '2014-01-01', '2014-01-31',
                        '2014-02-01', '2014-02-02', '2014-02-03',
                        '2014-02-04', '2014-02-05', '2014-02-06',
                        '2014-04-05', '2014-04-06', '2014-04-07',
                        '2014-05-01', '2014-05-02', '2014-05-03',
                        '2014-05-31', '2014-06-01', '2014-06-02',
                        '2013-11-11']),
    # 最小值为0(不是节假日),最大值为1(是节假日)
    'lower_window': 0,
    'upper_window': 1,
})

m = Prophet(holidays=holidays)
m.fit(data)
# 预测的频率(天D,或者月M),时间长度30,是否包含历史数据
future = m.make_future_dataframe(freq='D', periods=30, include_history=False)  # 建立数据预测框架,数据粒度为天,预测步长为一年
# 预测的结果,包含多种成分,最后一列即yhat列为最终的预测结果
forecast = m.predict(future)
# print(forecast.ds)
m.plot(forecast)  # 绘制预测效果图
plt.show()
m.plot_components(forecast)  # 绘制成分趋势图
plt.show()
# 保存结果
forecast.to_csv("forecast.csv")


image.png

image.png

预测效果一般,仅做练习用。

推荐阅读