質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1512閲覧

python3,エラー,株価予想,ディープラーニング

Mario5226

総合スコア8

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

2クリップ

投稿2020/02/09 04:23

開発環境
jupyter note book
株価予想をする本を読んで書いてみましたが、改善しません。

Python3

1 2# 扱いやすくするためにindexを通常の列に戻す 3temporary_data_excess_returns = data_with_excess_returns.reset_index() 4 5# read financial data 6financial_data = pd.read_pickle(f'{DATA_CHAPTER1}financial_data_all.pickle') 7 8# 利用しない列を削除 9financial_data.drop( 10 columns=['発行済株式数', '日時'], 11 inplace=True 12) 13 14# 決算発表当日の株価データとマージできるように、株価データに決算発表日を張る 15group_by_security = temporary_data_excess_returns.groupby('SC') 16 17temporary_list = [] 18for security, values in tqdm(group_by_security): 19 # 財務データから決算発表日を取得 20 # 例: array( 21 # ['2016-05-11T00:00:00.000000000', 22 # '2017-05-11T00:00:00.000000000'], 23 # dtype='datetime64[ns]' 24 # ) 25 announcement_dates = financial_data[ 26 '決算発表日(本決算)' 27 ][ 28 financial_data.SC == security 29 ].dropna().unique() 30 # 古い順にソートしてnp.arrayに戻す 31 announcement_dates = pd.Series(announcement_dates).sort_values().values 32 33 # 収益率データの「日時」が含まれる決算期を意味するカテゴリカル変数を作る。 34 # 例: 「日時」が2016-05-11より前 → 欠損値、 35 # 「日時」が2016-05-11~2017-05-10 → 2016-05-11、など 36 37temporary_data_excess_returns = pd.concat(temporary_list) 38temporary_data_excess_returns.rename( 39 columns={'announcement_date':'決算発表日(日時)'}, 40 inplace=True 41) 42del temporary_list 43 44# 財務データを決算発表日について一意にする 45financial_data = financial_data.groupby( 46 ['SC', '決算発表日(本決算)'] 47).first().reset_index() 48 49excess_returns_with_financial_data = pd.merge( 50 temporary_data_excess_returns, 51 financial_data, 52 left_on=['SC','名称', '決算発表日(日時)'], 53 right_on=['SC','名称', '決算発表日(本決算)'], 54 how='left' 55) 56excess_returns_with_financial_data.set_index( 57 ['SC', '日時'], 58 inplace=True, 59 verify_integrity=True 60) 61 62del temporary_data_excess_returns

このコードを実行すると

python3

1--------------------------------------------------------------------------- 2ValueError Traceback (most recent call last) 3<ipython-input-46-089790d4229f> in <module> 4 34 # 「日時」が2016-05-11~2017-05-10 → 2016-05-11、など 5 35 6---> 36 temporary_data_excess_returns = pd.concat(temporary_list) 7 37 temporary_data_excess_returns.rename( 8 38 columns={'announcement_date':'決算発表日(日時)'}, 9 10~\Anaconda3\lib\site-packages\pandas\core\reshape\concat.py in concat(objs, axis, join, join_axes, ignore_index, keys, levels, names, verify_integrity, sort, copy) 11 253 verify_integrity=verify_integrity, 12 254 copy=copy, 13--> 255 sort=sort, 14 256 ) 15 257 16 17~\Anaconda3\lib\site-packages\pandas\core\reshape\concat.py in __init__(self, objs, axis, join, join_axes, keys, levels, names, ignore_index, verify_integrity, copy, sort) 18 302 19 303 if len(objs) == 0: 20--> 304 raise ValueError("No objects to concatenate") 21 305 22 306 if keys is None: 23 24ValueError: No objects to concatenate

と、エラーが出てしまい調べてみていろいろとコードを追加しましたが、改善しません。
どなたか原因分かりませんでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2020/02/09 04:34

「temporary_list」に値は入っていますか?
Mario5226

2020/02/09 04:43

ごめんなさい。 私自身、プログラミングの経験がなく本を買って趣味程度にやっていて知識不足なんです。 本を読んでステップに従って実行してきたところ一応ここまでは、エラーが起きずに来てまいりました。 そのため、[temporary_list]に値が入っているのかがわからないんですよね。 どのようにしたら確認できるでしょうか? お早い解答ありがたいです。
meg_

2020/02/09 05:23

print(temporary_list)で表示してみてください。
Mario5226

2020/02/09 06:11

print(temporary_list)と打つと[]との返事が返ってきました。 おそらく確かにtemporary_listの中に何も入っていないんでしょうか。。。
meg_

2020/02/09 06:53

ここ(temporary_list = [])で変数を定義した後、問題の箇所(temporary_data_excess_returns = pd.concat(temporary_list))までの間に、temporary_listに値を追加する処理が必要です。 本を参考にされているとのことですので、何か抜けているコードがあるように思います。
Mario5226

2020/02/09 07:12 編集

確かに言われてみて確認をしてみました。すると数行抜けている場所があり修正してみたところ。また新たなエラーが発生してしまいました。 以下コード # 扱いやすくするためにindexを通常の列に戻す temporary_data_excess_returns = data_with_excess_returns.reset_index() # read financial data financial_data = pd.read_pickle(f'{DATA_CHAPTER1}financial_data_all.pickle') # 利用しない列を削除 financial_data.drop( columns=['発行済株式数', '日時'], inplace=True ) # 決算発表当日の株価データとマージできるように、株価データに決算発表日を張る group_by_security = temporary_data_excess_returns.groupby('SC') temporary_list = [] for security, values in tqdm(group_by_security): # 財務データから決算発表日を取得 # 例: array( # ['2016-05-11T00:00:00.000000000', # '2017-05-11T00:00:00.000000000'], # dtype='datetime64[ns]' # ) announcement_dates = financial_data[ '決算発表日(本決算)' ][ financial_data.SC == security ].dropna().unique() # 古い順にソートしてnp.arrayに戻す announcement_dates = pd.Series(announcement_dates).sort_values().values # 収益率データの「日時」が含まれる決算期を意味するカテゴリカル変数を作る。 # 例: 「日時」が2016-05-11より前 → 欠損値、 # 「日時」が2016-05-11~2017-05-10 → 2016-05-11、など temporary_list.append(aligned) temporary_list.append(aligned) aligned = values.assign( announcement_date=lambda x: pd.cut( x['日時'], ( list(announcement_dates) ) + [np.datetime64(values['日時'].max() + pd.offsets.Day())], labels=announcement_dates, right=False ).astype( np.datetime64 ) ) temporary_data_excess_returns = pd.concat(temporary_list) temporary_data_excess_returns.rename( columns={'announcement_date':'決算発表日(日時)'}, inplace=True ) del temporary_list # 財務データを決算発表日について一意にする financial_data = financial_data.groupby( ['SC', '決算発表日(本決算)'] ).first().reset_index() excess_returns_with_financial_data = pd.merge( temporary_data_excess_returns, financial_data, left_on=['SC','名称', '決算発表日(日時)'], right_on=['SC','名称', '決算発表日(本決算)'], how='left' ) excess_returns_with_financial_data.set_index( ['SC', '日時'], inplace=True, verify_integrity=True ) del temporary_data_excess_returns エラーコード --------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-14-f40e00edb24f> in <module> 44 # 例: 「日時」が2016-05-11より前 → 欠損値、 45 # 「日時」が2016-05-11~2017-05-10 → 2016-05-11、など ---> 46 temporary_list.append(aligned) 47 temporary_list.append(aligned) 48 aligned = values.assign( NameError: name 'aligned' is not defined となってしまいました。 またまた、アドバイスが欲しいです。
meg_

2020/02/09 07:16

alignedという変数が未定義のまま使用されているのでエラーが出ます。 本通りのコードであればバグですね。本当にこの順番でコードが掲載されているのであれば、書籍の訂正が出ていないか確認した方が良いでしょう。
Mario5226

2020/02/09 07:27

その前のプログラムやいろいろと送りますが、改善できるようなプログラムを書いていただくようなことは難しいでしょうか。私は知識不足で2週間ほどずっと同じ内容でエラーが起きていて進展がありません。 面倒だったりお時間がないようでしたら結構ですが、できればお願いしたいのですが。
guest

回答1

0

ベストアンサー

TensorFlowではじめる 株式投資のためのディープラーニング ですね。(p.92)
本の通りにやったらできましたよ。以下のコードが欠損してますが大丈夫ですか?

python3

1 aligned = values.assign( 2 announcement_date = lambda x: pd.cut( 3 x['日時'], 4 ( 5 list(announcement_dates) 6 ) + [np.datetime64(values['日時'].max() + pd.offsets.Day())], 7 labels = announcement_dates, 8 right=False 9 ).astype( 10 np.datetime64 11 ) 12 ) 13 temporary_list.append(aligned)

Notebook を再起動したときは各ブロックのimport したライブラリを、[run] ボタンでリロードしてますか。一応、写経したコードを貼っておきます。
追記)
エラーが出た箇所の、tqdm, datetime のインポート表記を変更・追加をしました。

Python3

1from IPython.core.display import display 2 3from os import path 4import re 5import pandas as pd 6import numpy as np 7from tqdm.notebook import tqdm 8import datetime 9 10# データの保存場所を指定 11# この場合は、C:/Users/hoge/Anaconda3/linear_regression/ を読み書きする 12 13WORK_DIR = 'C:/Users/hoge/Anaconda3/linear_regression/' 14DATA_DIR = 'C:/Users/hoge/Anaconda3/linear_regression/data/' 15DATA_CHAPTER1 = 'C:/Users/hoge/Anaconda3/data/download_data/' 16 17daily_data = pd.read_pickle(f"{DATA_CHAPTER1}daily_data.pickle") 18 19# 銘柄ごとに計算するため、証券コード(SC)で集計する 20groups = daily_data.groupby('SC') 21 22data_set = [] 23for security, values in tqdm(groups): 24 # 全体の10%以上の取引日で取引のない銘柄は無視する 25 if values['株価'].isnull().sum() > values.shape[0]*0.1: 26 continue 27 28 # 一時的に market_value 列を作って計算する 29 # 証券コード(SC)1、2 は株価指数を表しているので、単純に指数値を入れる 30 if security in {1, 2}: 31 values = values.assign(market_value = lambda x: x['株価']) 32 else: 33 values = values.assign(market_value = lambda x: x['時価総額(百万円)']) 34 35 # calculation return 36 values = values.sort_values('日時') # 時系列でソート 37 values['収益率'] = values['market_value'].pct_change() # 変化率の計算 38 values.drop(columns = ['market_value']) # 一時的な列を削除 39 data_set.append(values) 40 41daily_data_adj = pd.concat(data_set) # 銘柄ごとに計算したものを結合 42 43# 極端な値を外れ値として削除。ここでは上下 0.1% を外れ値とする 44threshold = 0.001 45 46lower = daily_data_adj['収益率'].quantile(threshold) 47upper = daily_data_adj['収益率'].quantile(1-threshold) 48 49daily_data_adj = daily_data_adj[ 50 (lower < daily_data_adj['収益率']) & (daily_data_adj['収益率'] < upper) 51].copy() 52 53############################################################# 54 55jgb_path = f'{DATA_DIR}risk_free_rate/jgbcm_all.csv' 56risk_free_rate = pd.read_csv( 57 jgb_path, 58 skiprows=1, 59 usecols=['基準日', '10年'], 60 parse_dates=['基準日'], 61 encoding='sjis', 62 index_col=['基準日'], 63 na_values='-' 64) 65 66risk_free_rate = risk_free_rate['10年'].apply( 67 # 半年複利(%表記)を日時対数収益率に変換 68 lambda x: np.log(1 + 0.01 * 0.5 * x) / 125 69).apply( 70 # 単利へ変換 71 lambda x: np.exp(x) -1 72) 73risk_free_rate.rename('安全資産利子率', inplace=True) 74risk_free_rate.index.rename('日時', inplace=True) 75 76risk_free_rate = pd.DataFrame(risk_free_rate) 77 78# 出力して結果を確認 79display(risk_free_rate.dropna().head()) 80 81############################################################ 82 83stock_return_and_risk_free_return = pd.merge( 84 daily_data_adj[daily_data_adj['SC'] > 2], 85 risk_free_rate, on='日時' 86) 87 88# SC と日時を index にする 89stock_return_and_risk_free_return.set_index( 90 ['SC', '日時'], 91 verify_integrity=True, 92 inplace=True 93) 94# 出力して結果を確認 95display(stock_return_and_risk_free_return.head()) 96 97############################################################ 98 99# 日時で集計 100group_by_date = stock_return_and_risk_free_return.groupby('日時') 101 102data_with_market_returns = [] 103for date, values in tqdm(group_by_date): 104 sum_of_market_capital = values['時価総額(百万円)'].sum() 105 values = values.assign( 106 # retuen がすべて null なら null にする 107 市場収益率 = lambda x: ( 108 x['収益率'] * (x['時価総額(百万円)'] / sum_of_market_capital) 109 ).sum( 110 min_count=1 111 ) 112 ) 113 data_with_market_returns.append(values) 114 115data_with_market_returns = pd.concat(data_with_market_returns) 116 117display(data_with_market_returns.head()) 118 119############################################################ 120data_with_excess_returns = data_with_market_returns.assign( 121 超過収益率 = lambda x: x['収益率'] -x['安全資産利子率'], 122 市場超過収益率 = lambda x: x['市場収益率'] -x['安全資産利子率'] 123) 124 125########################################################### 126# 扱いやすくするために index を通常の列に戻す 127temporary_data_excess_returns = data_with_excess_returns.reset_index() 128 129# read financial data 130financial_data = pd.read_pickle( 131 f'{DATA_CHAPTER1}financial_data_all.pickle' 132) 133 134# 利用しない列を削除 135financial_data.drop( 136 columns=['発行済株式数', '日時'], 137 inplace=True 138) 139 140# 決算発表日の株価データとマージできるように、株価データに決算発表日を張る 141group_by_security = temporary_data_excess_returns.groupby('SC') 142 143temporary_list = [] 144for security, values in tqdm(group_by_security): 145 146 # 財務データから決算発表日を取得 147 # 例: array( 148 # ['2016-05-11T00:00:00.000000000', '2017-05-T00:00:00.000000000'], 149 # dtype='datetime64[ns]' 150 # ) 151 announcement_dates = financial_data[ 152 '決算発表日(本決算)' 153 ][ 154 financial_data.SC == security 155 ].dropna().unique() 156 157 # 古いソートにして np.array に戻す 158 announcement_dates = pd.Series(announcement_dates).sort_values().values 159 160 # 収益率データの「日時」が含まれる決算期を意味するカテゴリカル変数を作る 161 # 例:「日時」が 2016-05-11 より前 → 欠損値、 162 #   「日時」が 2016-05-11 ~ 2017-05-11 → 2016-05-11、など 163 164 aligned = values.assign( 165 announcement_date = lambda x: pd.cut( 166 x['日時'], 167 ( 168 list(announcement_dates) 169 ) + [np.datetime64(values['日時'].max() + pd.offsets.Day())], 170 labels = announcement_dates, 171 right=False 172 ).astype( 173 np.datetime64 174 ) 175 ) 176 temporary_list.append(aligned) 177 178temporary_data_excess_returns = pd.concat(temporary_list) 179temporary_data_excess_returns.rename( 180 columns = {'announcement_date':'決算発表日(日時)'}, 181 inplace=True 182) 183del temporary_list 184 185# 財務データを決算発表日について一意にする 186financial_data = financial_data.groupby( 187 ['SC', '決算発表日(本決算)'] 188).first().reset_index() 189 190excess_returns_with_financial_data = pd.merge( 191 temporary_data_excess_returns, 192 financial_data, 193 left_on=['SC', '名称', '決算発表日(日時)'], 194 right_on=['SC', '名称', '決算発表日(本決算)'], 195 how='left' 196) 197 198excess_returns_with_financial_data.set_index( 199 ['SC', '日時'], 200 inplace=True, 201 verify_integrity=True 202) 203 204del temporary_data_excess_returns 205 206# データを pickle で保存 207excess_returns_with_financial_data.to_pickle( 208 f'{DATA_DIR}excess_returns_with_financial_data.pickle' 209)

投稿2020/02/09 10:37

編集2020/02/11 03:58
gusachan3

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mario5226

2020/02/09 11:12

はい!そうです! それを指摘されて追加したんですがうまくいきませんでした。 どうしたら良いですかね。 詳しくお話し聞きたいです。
gusachan3

2020/02/09 11:58 編集

第一章で DATA_CHAPTER1 の指定パスに financial_data_all.pickle を保存できたことを前提とするとJupyterNotebook 当該コードのブロック行頭にDATA_CHAPTER1のパスを明記してみてはいかがでしょうか。
Mario5226

2020/02/09 13:06

ごめんなさい。言ってる意味が理解できませんでした。パスとはなんでしょうか。。。プログラミング初心者のため、詳しいこと全くわかってないんですよね。。。
gusachan

2020/02/09 13:18

パスとはファイルの住所アドレスのようなものでファイルの場所を表しています。Windows とLinux mac で表記が違いますので調べてみてください。
Mario5226

2020/02/09 22:19

開発環境はWindowsなのでおそらくおんなじです。また、Cドライブ直下にsampleファイルも作成し、あっていると思うのですが。。。
gusachan3

2020/02/10 05:56

確認したいことがあります。group_by_security オブジェクトをgroupby したものを for key, values in group_by_security: print(group_by_security.get_group(key), "\n\n") で print 出力できますか。
Mario5226

2020/02/10 10:10

はい。実行してみると、 ーーーーーーーーーーーーーーーーーーー SC 日時 名称 市場 業種 株価 前日比 前日比(%) 前日終値 始値 \ 0 1301 2016-12-26 極洋 東証一部 水産・農林 2858.0 6.0 0.21 2852.0 2870.0 3454 1301 2017-07-11 極洋 東証一部 水産・農林 2830.0 -5.0 -0.18 2835.0 2835.0 7090 1301 2017-12-05 極洋 東証一部 水産・農林 2838.0 8.0 0.28 2830.0 2830.0 10728 1301 2018-01-22 極洋 東証一部 水産・農林 2829.0 -9.0 -0.32 2838.0 2847.0 14366 1301 2018-05-01 極洋 東証一部 水産・農林 2849.0 10.0 0.35 2839.0 2841.0 18006 1301 2018-07-11 極洋 東証一部 水産・農林 2875.0 26.0 0.91 2849.0 2865.0 21646 1301 2019-01-08 極洋 東証一部 水産・農林 2903.0 5.0 0.17 2898.0 2892.0 ... 高値日付 年初来高値 安値日付 年初来安値 market_value 収益率 安全資産利子率 \ 0 ... NaT NaN NaT NaN 31233.0 0.096279 2.239689e-06 3454 ... NaT NaN NaT NaN 30927.0 -0.001775 3.719142e-06 7090 ... NaT NaN NaT NaN 31014.0 0.002813 2.119721e-06 10728 ... NaT NaN NaT NaN 30916.0 -0.003160 3.159381e-06 14366 ... NaT NaN NaT NaN 31135.0 0.003546 1.599841e-06 18006 ... NaT NaN NaT NaN 31419.0 0.009122 1.519857e-06 21646 ... NaT NaN NaT NaN 31725.0 0.014324 5.599806e-07 ーーーーーーーーーーーーーーーーーーー と表示されます。
Mario5226

2020/02/10 10:11

実際にはこれがかなりの量ある感じで出てきましたので、一部だけを載せておきました。
Mario5226

2020/02/10 10:25

DATA_CHAPTER1 = 'C:/sample/data/' # 扱いやすくするためにindexを通常の列に戻す temporary_data_excess_returns = data_with_excess_returns.reset_index() # read financial data financial_data = pd.read_pickle(f'{DATA_CHAPTER1}financial_data_all.pickle') # 利用しない列を削除 financial_data.drop( columns=['発行済株式数', '日時'], inplace=True ) # 決算発表当日の株価データとマージできるように、株価データに決算発表日を張る group_by_security = temporary_data_excess_returns.groupby('SC') temporary_list = [] for security, values in tqdm(group_by_security): # 財務データから決算発表日を取得 # 例: array( # ['2016-05-11T00:00:00.000000000', # '2017-05-11T00:00:00.000000000'], # dtype='datetime64[ns]' # ) announcement_dates = financial_data[ '決算発表日(本決算)' ][ financial_data.SC == security ].dropna().unique() # 古い順にソートしてnp.arrayに戻す announcement_dates = pd.Series(announcement_dates).sort_values().values # 収益率データの「日時」が含まれる決算期を意味するカテゴリカル変数を作る。 # 例: 「日時」が2016-05-11より前 → 欠損値、 # 「日時」が2016-05-11~2017-05-10 → 2016-05-11、など aligned = values.assign( announcement_date=lambda x: pd.cut( x['日時'], ( list(announcement_dates) ) + [np.datetime64(values['日時'].max() + pd.offsets.Day())], labels=announcement_dates, right=False ).astype( np.datetime64 ) ) temporary_list.append(aligned) temporary_data_excess_returns = pd.concat(temporary_list) temporary_data_excess_returns.rename( columns={'announcement_date':'決算発表日(日時)'}, inplace=True ) del temporary_list # 財務データを決算発表日について一意にする financial_data = financial_data.groupby( ['SC', '決算発表日(本決算)'] ).first().reset_index() excess_returns_with_financial_data = pd.merge( temporary_data_excess_returns, financial_data, left_on=['SC','名称', '決算発表日(日時)'], right_on=['SC','名称', '決算発表日(本決算)'], how='left' ) excess_returns_with_financial_data.set_index( ['SC', '日時'], inplace=True, verify_integrity=True ) del temporary_data_excess_returns ------------------------------------------------- 言われたと売りにDATA_CHAPTER1のパスも明記してもう一度最初から行ったところ、新種のエラーが起きてしまい困っています。(以下はエラーコード) --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-12-01446027253c> in <module> 35 # 「日時」が2016-05-11~2017-05-10 → 2016-05-11、など 36 aligned = values.assign( ---> 37 announcement_date=lambda x: pd.cut( 38 x['日時'], 39 ( ~\Anaconda3\lib\site-packages\pandas\core\frame.py in assign(self, **kwargs) 3652 if PY36: 3653 for k, v in kwargs.items(): -> 3654 data[k] = com.apply_if_callable(v, data) 3655 else: 3656 # <= 3.5: do all calculations first... ~\Anaconda3\lib\site-packages\pandas\core\common.py in apply_if_callable(maybe_callable, obj, **kwargs) 363 364 if callable(maybe_callable): --> 365 return maybe_callable(obj, **kwargs) 366 367 return maybe_callable <ipython-input-12-01446027253c> in <lambda>(x) 41 ) + [np.datetime64(values['日時'].max() + pd.offsets.Day())], 42 labels=announcement_dates, ---> 43 right=False 44 ).astype( 45 np.datetime64 ~\Anaconda3\lib\site-packages\pandas\core\reshape\tile.py in cut(x, bins, right, labels, retbins, precision, include_lowest, duplicates) 258 # GH 26045: cast to float64 to avoid an overflow 259 if (np.diff(bins.astype("float64")) < 0).any(): --> 260 raise ValueError("bins must increase monotonically.") 261 262 fac, bins = _bins_to_cuts( ValueError: bins must increase monotonically. --------------------------------------------------------
gusachan3

2020/02/10 10:51 編集

p.90,91のコードを実行すると市場収益率、超過収益率、市場超過収益率のインデックスができませんか。 ##### # 日時で集計 group_by_date = stock_return_and_risk_free_return.groupby('日時') data_with_market_returns = [] for date, values in tqdm(group_by_date): sum_of_market_capital = values['時価総額(百万円)'].sum() values = values.assign( # retuen がすべて null なら null にする 市場収益率 = lambda x: ( x['収益率'] * (x['時価総額(百万円)'] / sum_of_market_capital) ).sum( min_count=1 ) ) data_with_market_returns.append(values) data_with_market_returns = pd.concat(data_with_market_returns) display(data_with_market_returns.head()) data_with_excess_returns = data_with_market_returns.assign( 超過収益率 = lambda x: x['収益率'] -x['安全資産利子率'], 市場超過収益率 = lambda x: x['市場収益率'] -x['安全資産利子率'] ) ######### SC 日時 名称 市場 業種 株価 前日比 前日比(%) 前日終値 \ 0 1301 2018-01-05 極洋 東証一部 水産・農林 4340.0 20.0 0.46 4320.0 3440 1301 2018-01-09 極洋 東証一部 水産・農林 4340.0 0.0 0.00 4340.0 6874 1301 2018-01-10 極洋 東証一部 水産・農林 4430.0 90.0 2.07 4340.0 10312 1301 2018-01-11 極洋 東証一部 水産・農林 4350.0 -80.0 -1.81 4430.0 13748 1301 2018-01-12 極洋 東証一部 水産・農林 4270.0 -80.0 -1.84 4350.0 ... ... ... .. ... ... ... ... ... ... 1666122 1301 2019-12-24 極洋 東証一部 水産・農林 2838.0 8.0 0.28 2830.0 1669646 1301 2019-12-25 極洋 東証一部 水産・農林 2829.0 -9.0 -0.32 2838.0 1673178 1301 2019-12-26 極洋 東証一部 水産・農林 2839.0 10.0 0.35 2829.0 1676713 1301 2019-12-27 極洋 東証一部 水産・農林 2849.0 10.0 0.35 2839.0 1680248 1301 2019-12-30 極洋 東証一部 水産・農林 2875.0 26.0 0.91 2849.0 始値 ... 高値日付 年初来高値 安値日付 年初来安値 market_value \ 0 4330.0 ... 2017/12/26 4415.0 2017/1/18 2681.0 47429.0 3440 4340.0 ... 2017/12/26 4415.0 2017/1/18 2681.0 47429.0 6874 4340.0 ... 2018/1/10 4460.0 2017/1/18 2681.0 48412.0 10312 4430.0 ... 2018/1/10 4460.0 2017/1/18 2681.0 47538.0 13748 4345.0 ... 2018/1/10 4460.0 2017/1/18 2681.0 46664.0 ... ... ... ... ... ... ... ... 1666122 2830.0 ... 2019/7/23 3115.0 2019/6/3 2610.0 31014.0 1669646 2847.0 ... 2019/7/23 3115.0 2019/6/3 2610.0 30916.0 1673178 2831.0 ... 2019/7/23 3115.0 2019/6/3 2610.0 31025.0 1676713 2841.0 ... 2019/7/23 3115.0 2019/6/3 2610.0 31135.0 1680248 2865.0 ... 2019/7/23 3115.0 2019/6/3 2610.0 31419.0 収益率 安全資産利子率 市場収益率 超過収益率 市場超過収益率 0 0.004639 2.279678e-06 0.008450 0.004637 0.008447 3440 0.000000 2.679555e-06 0.004862 -0.000003 0.004859 6874 0.020726 3.319317e-06 0.001440 0.020722 0.001437 10312 -0.018053 2.719541e-06 -0.001842 -0.018056 -0.001845 13748 -0.018385 2.919471e-06 -0.005347 -0.018388 -0.005350 ... ... ... ... ... ... 1666122 0.002813 3.199937e-07 -0.000493 0.002813 -0.000493 1669646 -0.003160 -4.400120e-07 -0.003473 -0.003159 -0.003472 1673178 0.003526 -4.800143e-07 0.005645 0.003526 0.005645 1676713 0.003546 -2.800049e-07 0.001354 0.003546 0.001355 1680248 0.009122 -6.000223e-07 -0.006313 0.009122 -0.006312
Mario5226

2020/02/10 10:56

それはできました。 そして書いているうちに、元あったエラーに逆戻りしてしまい、p92,p93を打ち込むと、 ----------------------------------- --------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-19-7a749d6ee109> in <module> 35 # 例: 「日時」が2016-05-11より前 → 欠損値、 36 # 「日時」が2016-05-11~2017-05-10 → 2016-05-11、など ---> 37 temporary_list.append(aligned) 38 aligned = values.assign( 39 announcement_date=lambda x: pd.cut( NameError: name 'aligned' is not defined ------------------------------------------------ と表示されてしまい、訳が分かりません。alignedを定義しようとしましたが、もともとそこにどのようなデータが入っているのかがわからず定義のしようがありません。どうしたらよろしいでしょうか。?
gusachan3

2020/02/10 11:11

分かりました。aligned が定義されていないエラーですよね。 temporary_list.append(aligned) の行を ################## # 収益率データの「日時」が含まれる決算期を意味するカテゴリカル変数を作る # 例:「日時」が 2016-05-11 より前 → 欠損値、 #   「日時」が 2016-05-11 ~ 2017-05-11 → 2016-05-11、など aligned = values.assign( announcement_date = lambda x: pd.cut( x['日時'], ( list(announcement_dates) ) + [np.datetime64(values['日時'].max() + pd.offsets.Day())], labels = announcement_dates, right=False ).astype( np.datetime64 ) ) temporary_list.append(aligned) とaligned = ・・・と定義されている部分の最後に入れ替えたらどうなりますか。多分、印刷ミスです。
Mario5226

2020/02/11 02:53

分かりました。そんなことあるんですかね。 言われた通りにコードを書き換えましたが、新たなエラーが起きてしまいました。たびたび申し訳ありません。 ------------------------------------------ --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-25-0b704899ff50> in <module> 36 # 「日時」が2016-05-11~2017-05-10 → 2016-05-11、など 37 aligned = values.assign( ---> 38 announcement_date=lambda x: pd.cut( 39 x['日時'], 40 ( ~\Anaconda3\lib\site-packages\pandas\core\frame.py in assign(self, **kwargs) 3652 if PY36: 3653 for k, v in kwargs.items(): -> 3654 data[k] = com.apply_if_callable(v, data) 3655 else: 3656 # <= 3.5: do all calculations first... ~\Anaconda3\lib\site-packages\pandas\core\common.py in apply_if_callable(maybe_callable, obj, **kwargs) 363 364 if callable(maybe_callable): --> 365 return maybe_callable(obj, **kwargs) 366 367 return maybe_callable <ipython-input-25-0b704899ff50> in <lambda>(x) 42 ) + [np.datetime64(values['日時'].max() + pd.offsets.Day())], 43 labels=announcement_dates, ---> 44 right=False 45 ).astype( 46 np.datetime64 ~\Anaconda3\lib\site-packages\pandas\core\reshape\tile.py in cut(x, bins, right, labels, retbins, precision, include_lowest, duplicates) 258 # GH 26045: cast to float64 to avoid an overflow 259 if (np.diff(bins.astype("float64")) < 0).any(): --> 260 raise ValueError("bins must increase monotonically.") 261 262 fac, bins = _bins_to_cuts( ValueError: bins must increase monotonically. ------------------------------------------------------- 返信お待ちしております。
gusachan3

2020/02/11 04:07 編集

そのエラーは初めて見ました。ググるとPandas のcut メソッドが時間列の処理に失敗したみたいですね。 具体的な対処法が思いつかないのですが私の環境ではimport datetime したら解消した記憶があります。 追記)あと思いつくことは財務省のHPからダウンロードした国債金利データ jgbcm_all.csv の日付フォーマットが和暦だったのでExcel で開いて西暦に変換する手間が必要ではなかったですか。
Mario5226

2020/02/11 07:34

また、財務省のページが開けずおそらくデータの名前はあっているので正しいとは思いますが、念のためダウンロードに使用したURLを教えていただけると幸いです。
gusachan3

2020/02/11 08:50

コードのダウンロードページがあるとは知りませんでした(^^; 第1章からすべて手打ちです。 第1章P.68 はimport pathlib を追加しました。 tqdm インポートは、from tqdm.notebook import tqdm としました。 file_list = list(Path(PRICE_DIR).glob('*.csv')) は file_list = list(pathlib.Path(PRICE_DIR).glob('*.csv')) としました。 P.69 の file_list = list(Path(STOCK_DATA_DIR).glob('*.csv')) も同様です。 そうしてKABU+のcsvデータを結合できたら第2章で 財務省のHP(https://www.mof.go.jp/jgbs/reference/interest_rate/)の [過去の金利情報(昭和49年(1974年)~)]をクリックして jgbcm_all.csv をダウンロード。 Excel でcsv を開いてインデックス基準日の最初のセルを選択、[Shift]+[Ctrl]+[↓]で列選択して[Ctrl]+[1]で[セルの書式設定]で日付データがユーザー定義[和暦]になっているので[日付]の[2012-03-14]を選択して[OK]→[risk_free_rate]フォルダを作って保存します。 P.88 のコードでread_csvして読み込み、P.89のコードで株式データとmerge結合しました。 とアナログなやり方でお恥ずかしいですがご参考になるでしょうか。
Mario5226

2020/02/11 09:11

詳しく丁寧な対応ありがたいです。 しかし、やはりp92,p93のところでエラーが起きてしまいます。 -------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-15-4135c7fd37a7> in <module> 34 # 「日時」が2016-05-11~2017-05-10 → 2016-05-11、など 35 aligned = values.assign( ---> 36 announcement_date=lambda x: pd.cut( 37 x['日時'], 38 ( ~\Anaconda3\lib\site-packages\pandas\core\frame.py in assign(self, **kwargs) 3652 if PY36: 3653 for k, v in kwargs.items(): -> 3654 data[k] = com.apply_if_callable(v, data) 3655 else: 3656 # <= 3.5: do all calculations first... ~\Anaconda3\lib\site-packages\pandas\core\common.py in apply_if_callable(maybe_callable, obj, **kwargs) 363 364 if callable(maybe_callable): --> 365 return maybe_callable(obj, **kwargs) 366 367 return maybe_callable <ipython-input-15-4135c7fd37a7> in <lambda>(x) 40 ) + [np.datetime64(values['日時'].max() + pd.offsets.Day())], 41 labels=announcement_dates, ---> 42 right=False 43 ).astype( 44 np.datetime64 ~\Anaconda3\lib\site-packages\pandas\core\reshape\tile.py in cut(x, bins, right, labels, retbins, precision, include_lowest, duplicates) 258 # GH 26045: cast to float64 to avoid an overflow 259 if (np.diff(bins.astype("float64")) < 0).any(): --> 260 raise ValueError("bins must increase monotonically.") 261 262 fac, bins = _bins_to_cuts( ValueError: bins must increase monotonically. --------------------------------------------------------- となってしまいp94のプログラムでデータを保存することができません。
gusachan3

2020/02/11 09:43 編集

第2章のコードをダウンロードしてローカルで検証しましたが、wareki2datetime関数でcsv の日付データを変換する以外は当方の環境はエラーも出ず動作しましたね。Anacondaの環境でしょうか、原因が分かりません。 追記) 当方の個人ブログでWindows10-Anaconda-TensorFlowの環境構築をまとめています。 https://stuffy.mydns.jp/wordpress/2020/01/25/tensorflow2-1-0-windows10/
Mario5226

2020/02/11 22:41

TensorFlowをもうすでに調べてダウンロードしてあるんですよね。謎ですよね。。。 大変申し訳ないですが、あの本の序盤に書いてあったコードが載っているサイトとgusachan3さんが変更したというコードでエラーが起きずに作業できますでしょうか。できれば確認をしていただきたいのですが…
gusachan3

2020/02/12 00:26 編集

ダウンロードした[2_2_2_変数の準備_part1.ipynb] をJupyternotebook のホームディレクトリC:\Users/hoge にコピーして実行すると jgbcm_all.csv を整形していなかった場合、 -------------------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-8-6fd5ee2f26d2> in <module> 4 stock_return_and_risk_free_return = pd.merge( 5 daily_data_adj[daily_data_adj['SC'] > 2], ----> 6 risk_free_rate, on='日時' 7 ) 8 C:\local\Anaconda3\envs\tensorflow\lib\site-packages\pandas\core\reshape\merge.py in merge(left, right, how, on, left_on, right_on, left_index, right_index, sort, suffixes, copy, indicator, validate) 79 copy=copy, 80 indicator=indicator, ---> 81 validate=validate, 82 ) 83 return op.get_result() C:\local\Anaconda3\envs\tensorflow\lib\site-packages\pandas\core\reshape\merge.py in __init__(self, left, right, how, on, left_on, right_on, axis, left_index, right_index, sort, suffixes, copy, indicator, validate) 628 # validate the merge keys dtypes. We may need to coerce 629 # to avoid incompat dtypes --> 630 self._maybe_coerce_merge_keys() 631 632 # If argument passed to validate, C:\local\Anaconda3\envs\tensorflow\lib\site-packages\pandas\core\reshape\merge.py in _maybe_coerce_merge_keys(self) 1140 # datetimelikes must match exactly 1141 elif is_datetimelike(lk) and not is_datetimelike(rk): -> 1142 raise ValueError(msg) 1143 elif not is_datetimelike(lk) and is_datetimelike(rk): 1144 raise ValueError(msg) ValueError: You are trying to merge on datetime64[ns] and object columns. If you wish to proceed you should use pd.concat ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー のエラーが出ました。日付列を西暦でフォーマットした場合は ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー jgb_path = f'{DATA_DIR}risk_free_rate/jgbcm_all.csv' risk_free_rate = pd.read_csv( jgb_path, skiprows=1, usecols=['基準日', '10年'], parse_dates=['基準日'], #date_parser=wareki2datetime, # ←この部分をコメントアウト encoding='sjis', index_col=['基準日'], na_values='-' ) risk_free_rate = risk_free_rate['10年'].apply( # 半年複利(%表記)を日次対数収益率に変換 lambda x: np.log(1 + .01 * .5 * x) / 125 ).apply( # 単利へ変換 lambda x: np.exp(x) -1 ) risk_free_rate.rename('安全資産利子率', inplace=True) risk_free_rate.index.rename('日時', inplace=True) risk_free_rate = pd.DataFrame(risk_free_rate) # 出力して結果を確認 display(risk_free_rate.dropna().head()) date_parser=wareki2datetime,をコメントアウトして実行した所、エラーが出ませんでした。
Mario5226

2020/02/12 02:22

以前に、自身で調べてコメントアウトしてうまくいったのでそれで利用していたんです。しかしながら、その先に進むとすぐにエラーが頻出してしまい全然動かないんです。jupyterで最終的に利用したすべてのコードが知りたいのですが。そのようなことは可能でしょうか。
gusachan3

2020/02/12 06:23 編集

確かめたいことがあるのですが、dataフォルダとjgbcm_all.csv のアクセス権はUsers ユーザーに適切に設定されていますか。 当方の手打ちしたコードはこちらです。 https://stuffy.mydns.jp/wordpress/wp-content/uploads/2020/02/save_stock_data.zip 追記) 先ほど、ダウンロードした[2_2_2_変数の準備_part1.ipynb], [2_2_2_変数の準備_part2.ipynb] を[kernel] から[Restart & Run All]したところ正常動作しました。プロセスを2重に実行すると不具合の元なのでファイルをpickle に書き出すのにはある程度、時間がかかるので30分から1時間くらいは放置していました。
Mario5226

2020/02/12 07:56

ありがとうございます。 アクセス権はわかりません。windowsのOS直下にsampleフォルダを作成して行っています。 あと、そのURLからダウンロードしましたが、どの順番でプログラムを実行すればいいのでしょうか。。。 たびたびの質問になってしまい大変申し訳ございません。
gusachan3

2020/02/12 09:07

アップロードしたコードは [save_stock_data] lambda.ipynb linear_regression..ipynb pandas.ipynb save_stock_data.ipynb seaborn.ipynb statsmodels.ipynb tensorflow_intro.ipynb Untitled.ipynb Untitled1.ipynb でcsv の書き込みに関するものは、save_stock_data.ipynb linear_regression.ipynb の2つです。 パスを読み替えないと実行してもエラーが出るので実行するなら自己責任で閲覧用ということでお願いします。
Mario5226

2020/02/12 22:18

パスを正しく変更してもエラーが起きてしまうのですが。。。 KABU+からデータを取ったと思うのですが、取ったデータの名称を教えていただいてもよろしいですか? また、送られてきたファイルのsave_stock_data.ipynbとlinear_regression..ipynbが本編に使用したコードということでしょうか?
gusachan3

2020/02/13 06:14 編集

KABU+から取得したデータは [data]-[download_data] ├[japan-all-stock-data] - [japan-all-stock-data_2018-01….csv │       ・ ├[japan-all-stock-financial-results] -[japan-all]japan-all-stock-financial-results_2018-01….csv │                                  ・ ├[japan-stock-prices] -japan-stock-prices_2018-01….csv                     ・ です。コードの実行にcsvデータが必要なことは自明です。 コードはsave_stock_data.ipynb が本編第1章で、linear-regressyon.ipynbが本編第2章です。 追記)ダウンロードしたURLを貼っておきます。 https://csvex.com/kabu.plus/csv/
Mario5226

2020/02/13 08:07

ですよね。同じデータをダウンロードしているのですが。できないんですよね。 私がダウンロードしたときに2019年以降のデータしかなかったのですが、p93に書いてある欠損値の作成ができていないとかありますかね。
gusachan3

2020/02/13 09:31 編集

データは2年前までさかのぼってダウンロードできるはずです。 欠損値はisnull()メソッドで例外処理されてるようです。私も詳しくありません。 逆にあまりたくさんのcsv ファイルを一気に処理しようとするとメモリクラッシュすることもあるので考え物です。 追記) P.139 のポートフォリオの予測リターンの今月に入っての急落ぶりには目を疑います。
Mario5226

2020/02/13 10:49

そうなんですね。なんか結局なにもできずに困ってます。 jupyter notebookの更新などをして全てバージョン最新にしたのですが。だめなんですよね。
Mario5226

2020/02/14 21:34

昨日データを新たに買い直して本と全く同じデータでやったらできました。おそらくデータの時系列が違かったことが原因と考えられます。 いままでいろいろとありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問