こんにちは。TATです。
今日のテーマは「【Pythonコード解説】Plotlyで株価チャートにアニメーションをつけてみる」です。
タイトルの通り、PythonのPlotlyを使って株価チャートにアニメーションをつける方法について解説していきます。
Plotlyにはアニメーション機能が備わっていて、簡単にアニメーションをつけることができます。
異なる銘柄の比較とかをする際にはアニメーションをつけるとわかりやすくなります。
あと、無駄にかっこよくなるので、仕事とかで人に見せる時にちょっとだけドヤ顔できるかもですw
目次
公式ドキュメントを確認してみる
まずは公式ドキュメントを見てみます。
「Plotly Animation」とかでググるとこのページが出てきます。
→ Intro to animations in Python - Plotly
一番上にサンプルコードがあるので、丸パクリして実行してみます。
import plotly.express as px df = px.data.gapminder() px.scatter(df, x="gdpPercap", y="lifeExp", animation_frame="year", animation_group="country", size="pop", color="continent", hover_name="country", log_x=True, size_max=55, range_x=[100,100000], range_y=[25,90])
animation_frameとanimation_groupを使えばアニメーションを使うことができるようです。
また、range_xとrange_yを指定して、全体のデータが含まれるように設定しておくこともポイントになります。
基本的に、animation_frameさえ指定すればアニメーションになります。
こんな感じの動くチャートを株価チャートに適用してみようとおもいます。
【Pythonコード解説】Plotlyで株価チャートにアニメーションをつけてみる【無駄にかっこいいw】
ここからが本題です。
株価チャートにアニメーションをつけてみます。
1銘柄だけでアニメーションをつけてもあまり意味ないので、複数銘柄を取得してアニメーションをつけ、その推移を視覚的にみてみようとおもいます。
Plotlyのフォーマットに合わせるため、少しだけデータの準備に手間がかかります。
準備の方法についてもバッチリ解説していきます。
株価データの準備
まず株価データの準備です。
pandas_datareaderで株価データを取得
株価データはpandas_datareaderを使うと簡単に取得できます。
今回は複数銘柄を比較するということで、日経平均株価に日本の代表的な銘柄を僕の勝手な判断で選びました。
期間は適当に2020年1月1日〜2022年6月30日とします。
ピックアップした銘柄はこちらです。
ポイント
- ^N225:日経平均株価
- 7203:トヨタ自動車
- 6758:ソニー
- 8058:三菱商事
- 9432:NTT
- 9101:日本郵船
from pandas_datareader import data df = data.DataReader( ["^N225", "7203.T", "6758.T", "8058.T", "9432.T", "9101.T"], "yahoo", start="2020-01-01", end="2022-06-30" ) df.head()
きちんとデータがとれていることがわかります。
今回は終値だけで比較していこうと思うので、Adj Closeだけ取り出します。
df = df["Adj Close"] df.head()
これでデータの準備は完了です。
【日本株対応】Pythonで株価のローソク足データを取得する方法まとめ【CSV、ライブラリ、スクレイピング】
続きを見る
とりあえず可視化してみる
株価データが準備できたのでとりあえず可視化してみましょう。
plot関数でサクッとみてみます。
%matplotlib inline df.plot()
一応可視化はできましたが、それぞれ株価に大きな違いがあるのでわかりにくいですね。
特に株価の低いトヨタとかは変化が見えにくいです。
異なる株価データを比較するには少し工夫が必要です。
異なる株価データを横並びで比較するには?
株価の値が違いすぎると、そのまま横並びで比較するのは難しいです。
ゆえに少し工夫して相対値で出してみます。
よくニュースとかでもみる「○○○○年○月○○日を100とした場合の株価推移」みたいな感じです。
過去記事でも詳しく解説しています。
【コード解説】Pythonで異なる株価データを横並びで比較する
続きを見る
最初の行を100として相対値をだす
相対値を出すのは簡単です。
最初の行の数値で全体を割って100をかければOKです。
1行で完了します。
df = df / df.iloc[0] * 100 df.head()
iloc関数を使って最初の1行を抜き出します。
あとはそれで全体を割って100をかけたらOKです。
簡単ですね。
可視化してみる
相対値に変換出来たのでもう一度可視化してみます。
先ほどとは雲泥の差ですね。
全銘柄が100からスタートして、そこからの相対値が表示されています。
これなら異なる株価でも横並びで比較することができますね。
とりあえず、コロナ禍の日本郵船がすごいですね。
次に、いよいよこのデータにアニメーションをつけていきます。
Plotlyでアニメーションをつけるための下準備
Plotlyでアニメーションをつけるには、animation_frameを指定すればOKでした。
あとはデータ全体が表示されるようにrange_xとrange_yも指定しておく必要があります。
折れ線グラフにアニメーションをつけるには少し癖がある
まず、Plotlyで折れ線グラフにアニメーションをつけるポイントについて解説しておきます。
結論、今のデータをそのまま使うと事故ります。
理由は、時系列ごとのデータで見ると点でしかないからです。
animation_frameは、指定したカラムの値ごとにデータをチャートに表示して、それを連続的に変化させていきます。
なめらかに繋がったパラパラ漫画みたいなイメージです。
折れ線グラフの場合、例えば2018-01-04のデータを抽出すると、この日のデータしかありません。
どの日付で抽出してもその日のデータしかありません。
アニメーションで表示するには、2018-01-04には2018-01-04のデータ、2018-01-05のデータには2018-01-04〜2018-01-05のデータ、2018-01-09のデータには2018-01-04〜2018-01-09のデータ、以降繰り返し、のように表示していく必要があります。
アニメーション用にデータを変形する
したがって、アニメーション表示するためにデータを少し変形します。
数行で完了します。
df_list = [] for i in range(len(df)): df_tmp = df.iloc[:i+1] df_tmp["delay"] = i df_list.append(df_tmp) df_concat = pd.concat(df_list) df_concat.head(10)
delayというカラムを作り、ここにanimation_framの順番をつけました。
0なら2018-01-04のデータ、1なら2018-01-04〜2018-01-05のデータ、2なら2018-01-04〜2018-01-09のデータといった具合です。
これを順番に表示していくと、折れ線グラフがニョキニョキと伸びているように見えます。
Plotlyのデータ形式に合わせるため、ちょっとデータを変形します
次にPlotlyのデータ形式に合わせたデータ整形です。
先ほどのPlot関数とPlotlyでは、データを表示する際のデータ形式が異なります。
Plot関数は、複数行のデータをまとめて可視化できるので便利ですが、Plotlyでは整然データに変換する必要があります。(参照Wikipedia)
イメージこんな感じです↓
引用元:https://ja.wikipedia.org/wiki/Tidy_data
この雑然データの各カラムが、今でいうところの銘柄です。
株価データは銘柄ごとにカラムが異なっています。
整然データにするには、株価データを1つのカラムにまとめて、銘柄名を確認できるカラムを追加すればOKです。
melt関数で一瞬で整然データに変換する
整然データを作るとなると大変そうなイメージを持たれるかもしれませんが、Pythonなら一瞬です。
Pandasには、melt関数というものが用意されていて、これで整然データに簡単に変形することができます。
df_concat.reset_index("Date", inplace=True) df_melt = df_concat.melt(id_vars=["Date", "delay"]) df_melt.head()
id_varsで残したいカラムを指定することができます。
ここにDateを指定するために、まずはreset_index()でindexをDateカラムに加えます。
そしてmelt関数でid_varsにDateとdelayを指定すればOKです。
残りのカラムは整然データに変換されます。
これで準備OKです。
きちんと整然データに変換されていることが確認できます。
これで全ての準備が整いました。
Plotlyでアニメーションをつける
いよいよアニメーションをつけます。
アニメーションをつけるには、animation_frameを指定する必要があります。
ここで先ほど作ったdelayを使います。
また、全体のデータが表示されるように、range_xとrange_yを指定することも必要です。
とりあえず可視化してみる
まずは素直にそのままアニメーションをつけて可視化してみます。
データが重いので表示に時間かかります。
2つの銘柄だけとか、期間を狭くするとか工夫しないと大変なことになりそうですw
fig = px.line( data_frame=df_melt, x="Date", y="value", color="Symbols", animation_frame="delay", range_x=[df_melt["Date"].min(), df_melt["Date"].max()], range_y=[df_melt["value"].min(), df_melt["value"].max()] ) fig.show()
ちょっとファイルでかすぎたので動画とりました。
とりあえずスピードがめちゃ遅いことだけわかっていただけるかとおもいますw
データが多いと、そのままの表示ではアニメーションがめちゃくちゃ遅くなります。
表示スピードを変える
そのままチャートを作ると表示スピードが遅すぎたので、ここを変更してみます。
スピードを変えるには、frameとtransitionのdurationを変更すればOKです。
単位はms(ミリ秒)です。
fig = px.line( data_frame=df_melt, x="Date", y="value", color="Symbols", animation_frame="delay", range_x=[df_melt["Date"].min(), df_melt["Date"].max()], range_y=[df_melt["value"].min(), df_melt["value"].max()] ) fig.layout.updatemenus[0].buttons[0].args[1]['frame']['duration'] = 1 fig.layout.updatemenus[0].buttons[0].args[1]['transition']['duration'] = 1 fig.show()
これでいい感じに表示されるようになりました。
日本郵船のコロナ禍の爆上げがよくわかりますね。
これでアニメーションがいい感じに表示できました。
全コードをまとめて公開
最後に、ここまで解説してきたコードをまとめてご紹介します。
銘柄とか期間とかを自由に弄りながら使っていただければとおもいます。
修正しやすいように、ところどころ変数に書き換えました。
データ数が増えると表示に時間がかかるのでお気をつけください。
ここでご紹介したデータでも結構重いです。
銘柄数を減らすか、期間を短くするとかの工夫が必要です。
それではコードをまとめてどうぞ。
なるべくコメントも多くつけました。
import plotly.express as px from pandas_datareader import data import pandas as pd # 期間設定 start = "2020-01-01" end = "2022-06-30" # 銘柄設定 日本株の場合は{証券コード.T}になります tickers = ["^N225", "7203.T", "6758.T", "8058.T", "9432.T", "9101.T"] df = data.DataReader( tickers, "yahoo", start=start, end=end ) # Adj Closeだけを抽出 df = df["Adj Close"] # 相対値に変換 df = df / df.iloc[0] * 100 # アニメーション用にデータを変形 df_list = [] for i in range(len(df)): df_tmp = df.iloc[:i+1] df_tmp["delay"] = i df_list.append(df_tmp) df_concat = pd.concat(df_list) # 整然データに変換 df_concat.reset_index("Date", inplace=True) df_melt = df_concat.melt(id_vars=["Date", "delay"]) # plotlyで可視化 fig = px.line( data_frame=df_melt, x="Date", y="value", color="Symbols", animation_frame="delay", range_x=[df_melt["Date"].min(), df_melt["Date"].max()], range_y=[df_melt["value"].min(), df_melt["value"].max()] ) # アニメーションも表示スピードを変更 fig.layout.updatemenus[0].buttons[0].args[1]['frame']['duration'] = 1 fig.layout.updatemenus[0].buttons[0].args[1]['transition']['duration'] = 1 # チャートを表示 fig.show()
こちらのコードは自由にコピっていただいて大丈夫です。
まとめ
本記事では、「【Pythonコード解説】Plotlyで株価チャートにアニメーションをつけてみる」というテーマで、Plotlyを使ったアニメーション機能を株価チャートにつけてみました。
折れ線グラフにアニメーションをつけるには少しデータの変形が必要になります。
Plotlyのデータ形式に合わせるためのデータ変形も必要です。
準備が少し手間がかかりますが、データの変形は数行できてしまうので、慣れれば問題ないかとおもいます。
アニメーションをつけるのは、ほぼ自己満な感じはありますが、とりあえず無駄にかっこよくなりますw
仕事とかでチラッと見せたらちょっとドヤ顔できるかもですね。
本記事では折れ線グラフにアニメーションをつけましたが、今後は別のいろいろなチャートにもつけてみたいですね。
とりあえず今日はここまでにします。
ここまで読んでくださり、ありがとうございました。