ちょっと前にSBIのデータを使って季節性グラフの作成を試みましたが、途中の部分でちょっとモジュール化が苦しい部分がありました。
何が苦しかったかというと、何年分のデータでも入ってきたらそれをチャート化する部分で、各年のデータを一旦、オブジェクトでバラバラに作って、もう一回くっつけるということをやっていたからでした。
私はそんな問題、とうに頭から抜けていたのですが、賢い栗さんが覚えておいてくれており、勉強会で取り上げてくれました。栗さんありがとうございました。
そこで提案されたのは、Groupbyを使う方法と別に普通にforでやったら良いのではないかという感じのことでした。
かっこよくgroupbyとか使ってみたかったのですが、pandasのドキュメントを読んでもどう動くのかわからなかったので、普通に年のリストを作って、それを使って、日付の差分と、価格の指数を行いました。
pandas.DataFrame.groupby — pandas 0.23.4 documentation
わざわざ、元々あったデータフレームを、年別にしてデータフレームにして価格と、日付のカウントのデータを作って、再びデータフレームとしてくっつけるということをしなくても、できるというとがわかりました。
皆さんに色々話を聞いたら簡単にできたし良かったです。
今回ちょっと手こずったのは新たなコラムを加えるところでした。
data_Frame['add'] = np.array([1, 2, 3, 4, 5])
上記のようにすると普段は大丈夫なのですが、モジュール内でやると、なぜかエラーが出てきたのでした。
ウェブ上で調べると、そういう事はあるようで、そのような際にはassign()というモジュールを使えばよいということでした。上記の例であれば、
data_Frame = data_Frame(add = np.array([1, 2, 3, 4, 5]))
という風に書いたら、エラーは出なくなりました。エラーが出てもグラフは一応でてくるのですが、そうするとなんかjupyter notebookだとグラフが小さくなったのです。
そんなこんなで悩んでいた季節性グラフはモジュール化に一歩前進しました。皆様ありがとうございました。困ったことは今後もブログに書いておこう。そうするとくりさんが覚えておいてくれるからwちなみに下はアサヒのものです。
現在のところのコードは以下のような感じになっています。数値データはstooqから取ることで、データをわざわざSBIから取ってこなくても良くなりました。
今後は、指数と割ったデータを作ることにより、指数の上げ下げの影響を取り除いた、季節性がみられるようにする部分を作って使えること、それ以外に長期の、指数の上げ下げの影響を取り除いたその銘柄の長期的なアルファがみられるようにしたいと思います。
あと、前回取り上げたkanichartで描画するようになれば結構使い勝手がでてくるような気がしています。
これをみてなにか良いアイデアが浮かべばなぁと思っております。
2版出たし買わないとなぁ・・・・

Pythonによるデータ分析入門 第2版 ―NumPy、pandasを使ったデータ処理
- 作者: Wes McKinney,瀬戸山雅人,小林儀匡,滝口開資
- 出版社/メーカー: オライリージャパン
- 発売日: 2018/07/26
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
import pandas as pd import pandas_datareader.data as web import matplotlib.pyplot as plt %matplotlib inline def get_data(code='2502', name='ASAHI'): df = web.DataReader('{}.JP'.format(code), 'stooq') df = df.sort_index().copy() df_i = web.DataReader('^TPX', 'stooq') df_i = df_i.sort_index().copy() df2 = pd.concat([df['Close'], df_i['Close']], axis=1, join='inner') df2.index = pd.to_datetime(df2.index) df2.columns = ['{}'.format(name), 'TOPIX'] return df2 def get_year(df): year_uniq = [] for x in df.index.year: if x not in year_uniq: year_uniq.append(x) return year_uniq def make_data(df): year_list = get_year(df) df = df['{}'.format(year_list[1]): ] day_count = [] c_price_index = [] t_price_index = [] for year in year_list[1:]: for day in df['{}'.format(year)].index: data_Frame = df['{}'.format(year)] day_count.append((day - data_Frame.index[0]).days) c_price_index.append(data_Frame.loc[day, data_Frame.columns[0]] / data_Frame.loc[data_Frame.index[0], data_Frame.columns[0]] * 100) t_price_index.append(data_Frame.loc[day, data_Frame.columns[1]] / data_Frame.loc[data_Frame.index[0], data_Frame.columns[1]] * 100) df = pd.assign(days = pd.Series(day_count).values) df = df.assign(company_index = pd.Series(c_price_index).values) df = df.assign(topix_index = pd.Series(t_price_index).values) return df def make_season_g(df): df = make_data(df) year_uniq = get_year(df) fig = plt.figure(figsize=(12, 7)) for year in year_uniq: plt.plot(df['{}'.format(year)].loc[:,'days'], df['{}'.format(year)].loc[:, 'company_index'], label='{}'.format(year)) plt.legend(loc='upper left', bbox_to_anchor=(1,1)) plt.grid() plt.show()