FacebookのProphetを使ってダウ工業平均を予測してみた。

[参考リンク：ドキュメント](https://facebook.github.io/prophet/)

# Prophetとは

ProphetはFacebookが開発した時系列データを予測するツールです。速いのと完全自動が売りらしいです。ちょっと使ってみましょう。

# 対象データ
1948年からの日足のダウ工業平均株価を使用します。

# インストール

```
pip install fbprophet
```

```python
import fbprophet
fbprophet.__version__
#'0.6'
```

# データのインポート

形式は、``columns=["ds", "y"]``である必要があります。
<table border="1" class="dataframe">  <thead>    <tr style="text-align: right;">      <th></th>      <th>ds</th>      <th>y</th>    </tr>  </thead>  <tbody>    <tr>      <th>18356</th>      <td>2020-04-23</td>      <td>23515.26</td>    </tr>    <tr>      <th>18357</th>      <td>2020-04-24</td>      <td>23775.27</td>    </tr>    <tr>      <th>18358</th>      <td>2020-04-27</td>      <td>24133.78</td>    </tr>    <tr>      <th>18359</th>      <td>2020-04-28</td>      <td>24101.55</td>    </tr>    <tr>      <th>18360</th>      <td>2020-04-29</td>      <td>24633.86</td>    </tr>    <tr>      <th>18361</th>      <td>2020-04-30</td>      <td>24345.72</td>    </tr>    <tr>      <th>18362</th>      <td>2020-05-01</td>      <td>23723.69</td>    </tr>    <tr>      <th>18363</th>      <td>2020-05-04</td>      <td>23749.76</td>    </tr>    <tr>      <th>18364</th>      <td>2020-05-05</td>      <td>23883.09</td>    </tr>    <tr>      <th>18365</th>      <td>2020-05-06</td>      <td>23664.64</td>    </tr>    <tr>      <th>18366</th>      <td>2020-05-07</td>      <td>23875.89</td>    </tr>    <tr>      <th>18367</th>      <td>2020-05-08</td>      <td>24331.32</td>    </tr>  </tbody></table>

# Prophet objectのインスタンスを作成し、fitさせる。

```python
m = Prophet(daily_seasonality=True)
m.fit(df)
```
時系列データの頻度が一日単位ではなく、一時間単位などであれば ``daily_seasonality=True``にしておく。

# 将来のデータフレームの作成する。

```python
future = m.make_future_dataframe(periods=365)
future.tail()
```
<table border="1" class="dataframe">  <thead>    <tr style="text-align: right;">      <th></th>      <th>ds</th>    </tr>  </thead>  <tbody>    <tr>      <th>18728</th>      <td>2021-05-04</td>    </tr>    <tr>      <th>18729</th>      <td>2021-05-05</td>    </tr>    <tr>      <th>18730</th>      <td>2021-05-06</td>    </tr>    <tr>      <th>18731</th>      <td>2021-05-07</td>    </tr>    <tr>      <th>18732</th>      <td>2021-05-08</td>    </tr>  </tbody></table>

# 予測する。
```python
forecast = m.predict(future)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()
```
<table border="1" class="dataframe">  <thead>    <tr style="text-align: right;">      <th></th>      <th>ds</th>      <th>yhat</th>      <th>yhat_lower</th>      <th>yhat_upper</th>    </tr>  </thead>  <tbody>    <tr>      <th>18728</th>      <td>2021-05-04</td>      <td>25240.993067</td>      <td>23775.034765</td>      <td>26676.954454</td>    </tr>    <tr>      <th>18729</th>      <td>2021-05-05</td>      <td>25241.812462</td>      <td>23873.631394</td>      <td>26743.879477</td>    </tr>    <tr>      <th>18730</th>      <td>2021-05-06</td>      <td>25248.372948</td>      <td>23662.176440</td>      <td>26658.218006</td>    </tr>    <tr>      <th>18731</th>      <td>2021-05-07</td>      <td>25251.123010</td>      <td>23590.352159</td>      <td>26721.447848</td>    </tr>    <tr>      <th>18732</th>      <td>2021-05-08</td>      <td>25258.034603</td>      <td>23780.066094</td>      <td>26742.194673</td>    </tr>  </tbody></table>

ここで、変数の説明をしておくと
- **yhat** : 予測値
- **yhat_lower** : 予測値の誤差の下限
- **yhat_upper** : 予測値の誤差の上限

# プロットする。

```python
fig1 = m.plot(forecast)
```
![plot_with_prophet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562670/ad917255-202f-369f-55aa-1877b96a3f8f.png)

大体誤差の範囲に収まっている。

# 個別要素を見る。

```python
fig2 = m.plot_components(forecast)
```

![plot_components.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562670/4f5a1757-5e00-fab9-448f-8c74b134da78.png)

確か、相場には "Sell in May and go away, and come on back on St. Leger's Day."(5月に株を売って、そしてセントレジャー・デー(9月中旬)まで戻って来るな)という格言があります。これはなんかありそうですね（笑）

こちらが基本的な使い方でより詳細はドキュメントの方をご覧ください。