2019/08/17
時系列データ解析ライブラリProphetを使う(2)
前回は、Facebookの時系列データ解析ライブラリProphetをR環境で使用しましたが、今回はPython環境のお話です。Rに比べ、インストール、プログラム実行で苦労しましたので、その備忘録です。まず、インストールですが、公式サイトの通り、以下のコマンドを実行しましたが、エラーが出てうまく行きませんでした。
pip install fbprophetよく手順を確認すると、Anacondaを使っている場合は、以下のコマンドを実行しなさいということでしたが、これもダメでした。
conda install -c conda-forge fbprophetいろいろ触っているうちに、インストール先のAnacondaの仮想環境py37の動きが変になってしまいました。結局、この仮想環境py37を削除し、再構築することにしました。
また、Prophetがpystanと依存関係があり、先にpystanをインストール必要があることが分かりましたので、最終的に以下の手順で進めました。
①仮想環境py37を再構築
②pystanをAnaconda navigator上でインストール
③py37のターミナルから以下のconda installコマンドを実行
conda install -c conda-forge fbprophetこれでエラーなく、最後まで走りました。苦労しましたが、何とかインストールは成功しました。引き続き、以下のQuick Startのテストコードを実行しました。
import pandas as pd実行すると、以下の通り、上記プログラムの14行目までは正常に動作しましたが、16行目のグラフ表示の所で、エラーにはまりました。
from fbprophet import Prophet
df = pd.read_csv('example_wp_log_peyton_manning.csv')
df.head()
m = Prophet()
m.fit(df)
future = m.make_future_dataframe(periods=365)
future.tail()
forecast = m.predict(future)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()
fig1 = m.plot(forecast)
fig2 = m.plot_components(forecast)
from fbprophet.plot import plot_plotly
import plotly.offline as py
py.init_notebook_mode()
fig = plot_plotly(m, forecast)
py.iplot(fig)
>>> import pandas as pd型の不一致で怒られているようです。ネットに対策が書かれてあるのを見つけました。
>>> from fbprophet import Prophet
>>>
>>> df = pd.read_csv('example_wp_log_peyton_manning.csv')
>>> df.head()
ds y
0 2007-12-10 9.590761
1 2007-12-11 8.519590
2 2007-12-12 8.183677
3 2007-12-13 8.072467
4 2007-12-14 7.893572
>>>
>>> m = Prophet()
>>> m.fit(df)
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
Initial log joint probability = -19.4685
Iter log prob ||dx|| ||grad|| alpha alpha0 # evals Notes
99 7975.65 0.00900645 1590.32 1 1 130
Iter log prob ||dx|| ||grad|| alpha alpha0 # evals Notes
130 7983.57 0.00042495 289.241 2.698e-06 0.001 208 LS failed, Hessian reset
199 7992.52 0.003794 380.212 0.3256 0.3256 290
Iter log prob ||dx|| ||grad|| alpha alpha0 # evals Notes
299 7997.34 0.00112364 349.916 0.137 1 406
Iter log prob ||dx|| ||grad|| alpha alpha0 # evals Notes
361 7998.37 7.8273e-05 175.666 8.691e-07 0.001 526 LS failed, Hessian reset
399 7998.92 5.01025e-05 57.8301 0.3866 0.3866 574
Iter log prob ||dx|| ||grad|| alpha alpha0 # evals Notes
499 8000.66 0.00508482 301.143 1 1 693
Iter log prob ||dx|| ||grad|| alpha alpha0 # evals Notes
543 8001.91 4.57256e-05 148.429 3.757e-07 0.001 792 LS failed, Hessian reset
599 8003.2 0.000312406 190.708 0.3742 1 857
Iter log prob ||dx|| ||grad|| alpha alpha0 # evals Notes
650 8003.61 4.29878e-05 86.7806 1.611e-07 0.001 968 LS failed, Hessian reset
699 8003.7 7.53265e-06 74.7985 0.3554 0.3554 1032
Iter log prob ||dx|| ||grad|| alpha alpha0 # evals Notes
704 8003.71 7.81067e-05 133.635 7.522e-07 0.001 1078 LS failed, Hessian reset
788 8004.16 4.16874e-05 128.25 3.843e-07 0.001 1230 LS failed, Hessian reset
799 8004.29 0.000370995 128.452 0.3408 1 1243
Iter log prob ||dx|| ||grad|| alpha alpha0 # evals Notes
818 8004.44 3.05116e-05 88.0118 1.864e-07 0.001 1310 LS failed, Hessian reset
886 8004.63 6.31442e-05 69.6094 7.392e-07 0.001 1427 LS failed, Hessian reset
899 8004.65 0.000620172 140.283 0.3397 1 1445
Iter log prob ||dx|| ||grad|| alpha alpha0 # evals Notes
931 8004.7 3.38749e-07 72.5032 0.1382 0.6065 1485
Optimization terminated normally:
Convergence detected: relative gradient magnitude is below tolerance
<fbprophet.forecaster.Prophet object at 0x1a1b3967d0>
>>>
>>> future = m.make_future_dataframe(periods=365)
>>> future.tail()
ds
3265 2017-01-15
3266 2017-01-16
3267 2017-01-17
3268 2017-01-18
3269 2017-01-19
>>>
>>> forecast = m.predict(future)
>>> forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()
ds yhat yhat_lower yhat_upper
3265 2017-01-15 8.206497 7.479805 8.904837
3266 2017-01-16 8.531523 7.796942 9.229912
3267 2017-01-17 8.318930 7.577875 9.048126
3268 2017-01-18 8.151543 7.373401 8.875379
3269 2017-01-19 8.163477 7.465614 8.905640
>>>
>>> fig1 = m.plot(forecast)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/..../anaconda3/envs/py37/lib/python3.7/site-packages/fbprophet/forecaster.py", line 1522, in plot
<中略>
File "/Users/..../anaconda3/envs/py37/lib/python3.7/site-packages/numpy/core/numeric.py", line 538, in asarray
return array(a, dtype, copy=False, order=order)
TypeError: float() argument must be a string or a number, not 'datetime.datetime'
最終的に、動作したプログラムは以下の通りです。
import pandas as pd19行目のグラフ表示は以下の通りで、
from fbprophet import Prophet
import matplotlib.pyplot as plt
df = pd.read_csv('example_wp_log_peyton_manning.csv')
df.head()
m = Prophet()
m.fit(df)
future = m.make_future_dataframe(periods=365)
future.tail()
forecast = m.predict(future)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()
pd.plotting.register_matplotlib_converters()
fig1 = m.plot(forecast)
plt.show(fig1)
fig2 = m.plot_components(forecast)
plt.show(fig2)

