開発環境
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
と、エラーが出てしまい調べてみていろいろとコードを追加しましたが、改善しません。
どなたか原因分かりませんでしょうか。
「temporary_list」に値は入っていますか?
ごめんなさい。
私自身、プログラミングの経験がなく本を買って趣味程度にやっていて知識不足なんです。
本を読んでステップに従って実行してきたところ一応ここまでは、エラーが起きずに来てまいりました。
そのため、[temporary_list]に値が入っているのかがわからないんですよね。
どのようにしたら確認できるでしょうか?
お早い解答ありがたいです。
print(temporary_list)で表示してみてください。
print(temporary_list)と打つと[]との返事が返ってきました。
おそらく確かにtemporary_listの中に何も入っていないんでしょうか。。。
ここ(temporary_list = [])で変数を定義した後、問題の箇所(temporary_data_excess_returns = pd.concat(temporary_list))までの間に、temporary_listに値を追加する処理が必要です。
本を参考にされているとのことですので、何か抜けているコードがあるように思います。
確かに言われてみて確認をしてみました。すると数行抜けている場所があり修正してみたところ。また新たなエラーが発生してしまいました。
以下コード
# 扱いやすくするために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
となってしまいました。
またまた、アドバイスが欲しいです。
alignedという変数が未定義のまま使用されているのでエラーが出ます。
本通りのコードであればバグですね。本当にこの順番でコードが掲載されているのであれば、書籍の訂正が出ていないか確認した方が良いでしょう。
その前のプログラムやいろいろと送りますが、改善できるようなプログラムを書いていただくようなことは難しいでしょうか。私は知識不足で2週間ほどずっと同じ内容でエラーが起きていて進展がありません。
面倒だったりお時間がないようでしたら結構ですが、できればお願いしたいのですが。
回答1件
あなたの回答
tips
プレビュー