隗より始めよ

今後はいろいろ考え始めます。

季節性グラフに関して(2)

ちょっと前にSBIのデータを使って季節性グラフの作成を試みましたが、途中の部分でちょっとモジュール化が苦しい部分がありました。

www.mazarimono.net

何が苦しかったかというと、何年分のデータでも入ってきたらそれをチャート化する部分で、各年のデータを一旦、オブジェクトでバラバラに作って、もう一回くっつけるということをやっていたからでした。

私はそんな問題、とうに頭から抜けていたのですが、賢い栗さんが覚えておいてくれており、勉強会で取り上げてくれました。栗さんありがとうございました。

そこで提案されたのは、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ちなみに下はアサヒのものです。

f:id:mazarimono:20180903222759p:plain

現在のところのコードは以下のような感じになっています。数値データはstooqから取ることで、データをわざわざSBIから取ってこなくても良くなりました。

今後は、指数と割ったデータを作ることにより、指数の上げ下げの影響を取り除いた、季節性がみられるようにする部分を作って使えること、それ以外に長期の、指数の上げ下げの影響を取り除いたその銘柄の長期的なアルファがみられるようにしたいと思います。

あと、前回取り上げたkanichartで描画するようになれば結構使い勝手がでてくるような気がしています。

www.mazarimono.net

これをみてなにか良いアイデアが浮かべばなぁと思っております。

2版出たし買わないとなぁ・・・・

Pythonによるデータ分析入門 第2版 ―NumPy、pandasを使ったデータ処理

Pythonによるデータ分析入門 第2版 ―NumPy、pandasを使ったデータ処理

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()