コード全文を記載しますが、
FileNotFoundError: [Errno 2] No such file or directory: 'eqall2.csv'というエラー文がでています。
これは単に空の「eqall2.csv」を事前に用意しておけば良いのでしょうか?
import pandas as pd
pd.options.display.max_columns = None
pd.options.display.max_rows = None
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
import seaborn as sns
sns.set()
sns.set(font=["Yu Gothic", "Hiragino Maru Gothic Pro"])
import warnings
warnings.filterwarnings("ignore")
from sklearn.model_selection import train_test_split
from dateutil.relativedelta import relativedelta
import os
import glob
from datetime import datetime
os.chdir("/Users/yousukesano/Desktop")
df = pd.DataFrame(columns = [])
for i in glob.glob("地震リスト"):
tmp = pd.read_csv(i)
df = pd.concat([df, tmp])
df.sample(100)
df = df.reset_index(drop = True)
df.head()
df.shape
df1 = df.dropna()
df1.shape
df1.to_csv("eqall.csv")
df1 = pd.read_csv("eqall2.csv",parse_dates=True, index_col=0)
df1.head()
df1.shape
df1["地震の発生日"][0]
df1["地震の発生時刻"][0]
まずは文字列としてdateとtimeを結合
date = df1["地震の発生日"][0]
time = df1["地震の発生時刻"][0]
str_datetime = f"{date} {time}"
str_datetime
datetime型に変換する
from datetime import datetime as dt
datetime = dt.strptime(str_datetime, "%Y/%m/%d %H:%M:%S")
datetime
datetimes = []
for index, datum in df1.iterrows():
date = datum["地震の発生日"]
time = datum["地震の発生時刻"]
str_datetime = f"{date} {time}"
datetime = dt.strptime(str_datetime, "%Y/%m/%d %H:%M:%S")
datetimes.append(datetime) # datetimesというリストに格納する
datetimes[:3]
df1["ds"] = datetimes # 新しいdsというカラムに格納する
df1.head()
df2 = df1.rename(columns={'深さ.1': '深さ', '最大震度.2':'最大震度'})
df2.head()
目的変数をyというカラムに変更する必要がある
df3 = df2.rename(columns={"M":"y"})
df3.head()
df3.dtypes
#学習データとテストデータに分ける
#2020年〜2021年8月8日までをテストデータとする
df_test = df3[df3['ds'] > dt(2020,1,1,0,0)]
df_test.head()
df_train = df3[df3["ds"] <= dt(2020,1,1,0,0)]
df_train.tail()
print("学習データ:",df_train.shape)
print("テストデータ:",df_test.shape)
df3.isnull().sum()
df3.dtypes
from fbprophet import Prophet
from fbprophet.plot import add_changepoints_to_plot
model = Prophet( growth='linear',
changepoints=None,
n_changepoints=25,
changepoint_range=0.8,
yearly_seasonality='auto',
weekly_seasonality='auto',
daily_seasonality='auto',
holidays=None,
seasonality_mode='multiplicative',
seasonality_prior_scale=20.0,
holidays_prior_scale=10.0,
changepoint_prior_scale=0.05,
mcmc_samples=0,
interval_width=0.8,
uncertainty_samples=1000,
stan_backend=None,)
model.fit(df_train)
将来の予測したいデータを用意する必要がある 箱を用意
future = model.make_future_dataframe(800*24, freq="h")
future.tail()
予測してみる
forecast = model.predict(future)
model.plot(forecast)
plt.xlim(dt(1919,5,1), dt(2021,12,31))
plt.show()
model.plot(forecast)
plt.xlim(dt(2010,5,1), dt(2030,5,31))
plt.show()
model.plot_components(forecast)
plt.show()
テストデータ
df_test = df3[df3['ds'] > dt(2020,1,1,0,0)]
df_test.head()
2020年1月からの予測データを採ってくる
forecast.head()
インデックスのリセット
forecast_2020 = forecast[forecast["ds"] >= dt(2020,1,1)].reset_index(drop=True)
forecast_2020["yhat"].head() # yhat = 予測値のこと
結果を入力する空のデータフレームを用意する
results = pd.DataFrame()
実測値
results["t"] = df_test["y"]
予測値
results["y"] = forecast_2020["yhat"]
results["diff"] = results["t"]-results["y"]
results.head()
np.mean(abs((results["y"]-results["t"])/results["y"])*100)
ここでは約15%はずれていますという評価になる
df3.y.max() # cap予測値の最大値の目安として実測値の最大値を確認してみる
df_train["cap"] = 12 #実測値の最大値から5700程度であれば予測最大値は入るだろうとしている
df_train.head()
model2 = Prophet(
growth = "logistic",
yearly_seasonality=True,
weekly_seasonality=True,
daily_seasonality=True,
changepoints=None,
n_changepoints=25,
changepoint_range=0.8,
holidays=None,
seasonality_mode='multiplicative',
seasonality_prior_scale=20.0,
holidays_prior_scale=10.0,
changepoint_prior_scale=0.05,
mcmc_samples=0,
interval_width=0.8,
uncertainty_samples=1000,
stan_backend=None
) #shift+tabでパラメータの説明があらわれる
model2.fit(df_train)
future["cap"] = 12
future.head()
forecast2 = model2.predict(future)
model2.plot(forecast)
plt.xlim(dt(1919,4,1), dt(2022,8,8))
plt.show()
forecast_2020r = forecast2[forecast2["ds"] >= dt(2020,1,1)].reset_index(drop=True)
forecast_2020r.head()
forecast_2020r["yhat"].head() # yhat = 予測値のこと
結果を入力する空のデータフレームを用意する
results2 = pd.DataFrame()
実測値
results2["t"] = df_test["y"]
予測値
results2["y"] = forecast_2020r["yhat"]
results2["diff"] = results2["t"]-results2["y"]
results2.head()
np.mean(abs((results2["y"]-results2["t"])/results2["y"])*100)
ここでは約14%はずれていますという評価になる。若干精度は向上している
model2.plot_components(forecast)
plt.show()
df4 = df3.set_index("ds",drop=True)
df4.head(2)
import statsmodels.api as sm
plt.rc("figure", figsize = (12,6))
res = sm.graphics.tsa.plot_acf(df4["y"],lags = 3000)
x 軸がどの程度ずらしているかをあらわし、y軸に相関の強さを表している
fig = plt.subplots(figsize = (18,6))
sns.lineplot(data = df4)