前回の記事の続きです。
blog.gelehrte.com
やりたいことは、私のやっているゲームFF14の各ワールドの嗜好品(ピュアホワイト・ジェットブラック)の価格変動を、株価変動の表のように移動平均線で出したいということです。
このようになりました。
移動平均線で5日線と10日線を出しましたが、どうやらどちらにしても価格上昇を表していますね。
移動平均線の読み方についてはここでは割愛するとして、ソースコードの解説をします。
ソースコード
CSV
連日、嗜好品の価格を調べています。
上記のグラフは執筆時2019年8月2日までの記録を使っていますが、リンク先のスプレッドシートはもっと先まで記述しているかもです。
docs.google.com
Jupyter Notebookでのソースコード
ソースコードをまずはぺたり。少し解説を加えます。
%matplotlib inline import pandas as pd import matplotlib.pyplot as plt SERVICE_NUM = 10 # エレメンタルDCのワールド数 ITEM_NUM = 2 # 分析対象の商品の個数(ピュアホワイトとジェットブラック) # グラフのサイズ設定 plt.figure(figsize=(15, 18)) # csv読み込み、1列目は日付型で読み込み、インデックスとする # ピュアホワイト df_white = pd.read_csv('20190802.csv', index_col=0, parse_dates=True,usecols=['date', 'Aegis_white','Atomos_white','Carbuncle_white','Garuda_white','Gungnir_white','Kujata_white','Ramuh_white','Tonberry_white','Typhon_white','Unicorn_white']) # ジェットブラック df_black = pd.read_csv('20190802.csv', index_col=0, parse_dates=True,usecols=['date', 'Aegis_black','Atomos_black','Carbuncle_black','Garuda_black','Gungnir_black','Kujata_black','Ramuh_black','Tonberry_black','Typhon_black','Unicorn_black']) # 説明変数設定 X_white = df_white.index.to_frame() X_black = df_black.index.to_frame() # 全日の各ワールドの平均 Y_white = df_white.mean(axis='columns').to_frame() Y_black = df_black.mean(axis='columns').to_frame() # 移動平均線 5日 Y_white_5 = pd.Series(df_white.mean(axis='columns')).rolling(5).mean().to_frame() Y_black_5 = pd.Series(df_black.mean(axis='columns')).rolling(5).mean().to_frame() # 移動平均線 10日 Y_white_10 = pd.Series(df_white.mean(axis='columns')).rolling(10).mean().to_frame() Y_black_10 = pd.Series(df_black.mean(axis='columns')).rolling(10).mean().to_frame() plt.subplot(ITEM_NUM, 1,1) plt.title('white') plt.plot(X_white, Y_white, label="average") plt.plot(X_white, Y_white_5, label="5days moving average") plt.plot(X_white, Y_white_10, label="10days moving average") plt.legend() plt.subplot(ITEM_NUM, 1,2) plt.title('black') plt.plot(X_black, Y_black, label="average") plt.plot(X_black, Y_black_5, label="5days moving average") plt.plot(X_black, Y_black_10, label="10days moving average") #凡例 plt.legend() plt.show()
pythonソースコード解説
read_csv
# ピュアホワイト df_white = pd.read_csv('20190802.csv', index_col=0, parse_dates=True,usecols=['date', 'Aegis_white','Atomos_white','Carbuncle_white','Garuda_white','Gungnir_white','Kujata_white','Ramuh_white','Tonberry_white','Typhon_white','Unicorn_white'])
pandasのread_csvで読むのですが、
1列目を日付として読む
index_col=0, parse_dates=True 部分です。0番目=1列目をindexとし、parse_datesを有効にして日付として読みます。
usecolsで読みたい列を指定
スプレッドシートでは読みたい列(ここでは嗜好品:ピュアホワイト)の各ワールドの情報が混ざっているので、列名を指定して読み込んでいます。
to_frame()でDataFrame型に変換
プロットの前に型を合わせます。X軸はこちら
X_white = df_white.index.to_frame()
Y軸も同じようにto_frame()で合わせます。
Y_white = df_white.mean(axis='columns').to_frame()
meanで平均を計算
引数なしだと、列での平均を計算するmean()関数。
ここでは行あたり(同じ日付での各ワールドの平均)を計算したいので、axis='columns'と指定します
pandas.Series.rolling()で移動平均線を計算
ソースコードではこちら
Y_white_5 = pd.Series(df_white.mean(axis='columns')).rolling(5).mean().to_frame()
df_white.mean(axis='columns')で日付ごとの平均を出しているので、その日数のうち5日をrollingで丸めます。
そのあと .mean()を使うことで5日分の平均を出します。
例えば .sum()などを使えば合計値などを出せます。
その他プロットについて
それ以外については以前の記事を参考にしてください。
blog.gelehrte.com