Webサイトにサンプルがあった地震予測プログラムを改良して、「地震の発生日」「震央地名」「規模(M)」「震度」だけで予測を行いたいです。以下コードは「地震の発生日」「地震の発生時刻」「震央地名」「緯度」「経度」「規模(M)」「震度」がある場合のサンプルプログラム(Webサイトで発見したもの)となります。Prophetライブラリを使って予測をしているみたいです。
このプログラムをどのようにして改良すればよいか、アドバイスを下さい。
#インポートするライブラリ
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"])
%matplotlib inline
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(r"/Users/yousukesano/Desktop/T18115_Data/02_4年後期/卒業研究/eq_list_test")#csv読み込み
df = pd.DataFrame(columns = [])
for i in glob.glob("地震リスト"): #ディレクトリから「地震リスト」がつくファイル読み込む
tmp = pd.read_csv(i)
df = pd.concat([df, tmp])
df = df.reset_index(drop = True)
df.head()
df1 = df.dropna()
df1.shape
df1.to_csv("eqall3.csv")
df1 = pd.read_csv("eqall3.csv",parse_dates=True, index_col=0)
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というリストに格納する
df1["ds"] = datetimes # 新しいdsというカラムに格納する
df2 = df1.rename(columns={'深さ.1': '深さ', '最大震度.2':'最大震度'})
df2.head()
目的変数をyというカラムに変更する必要がある
df3 = df2.rename(columns={"M":"y"})
df3.head()
df3.dtypes
#学習データとテストデータに分ける
df_test = df3[df3['ds'] > dt(2000,1,1,0,0)] #2000年から2007年までをテストデータとする。
df_test.head()
df_train = df3[df3["ds"] <= dt(2021,1,1,0,0)]
df_train.tail()
print("学習データ:",df_train.shape)#学習データの総数を表示する
print("テストデータ:",df_test.shape) #テストデータの総数を表示する
df3.isnull().sum()
df3.dtypes
Prophetを利用した予測
from fbprophet import Prophet
from fbprophet.plot import add_changepoints_to_plot
#Prophetで予測するためには、目的変数としてy(マグニチュード)、時間データとしてds(年月日時間)を設定する必要がある。
#過去からの経緯で予測を行う。
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(24*7200, freq="h") #24(時間)*800(日数)
future.tail()
予測してみる
forecast = model.predict(future)
model.plot(forecast)
plt.xlim(dt(1919,5,1), dt(2020,12,31))
plt.show()