前提・実現したいこと
下記図のように、price_df(株価のデータフレーム,sqlite3から取得)と、stock_df(画像右,登録日付、銘柄コードなどが記載)のデータフレームより、登録日付以降の各銘柄コードより、購入日以降のドローダウン値、最大損失値を出したいとかんがえています。
その前段階で、購入日を下記ルールで算出しようとしました。
① 公開日のつぎの日の寄り付き値を求める(購入価格)
②「購入日」、「購入価格列」を追加して、①の値段をこの列の全行に入れる
③②とLowの差を出して、その結果を列として追加(別ファイルでもよい)
④③が入ったDFを日時で切り出して可視化する
このとき、次の日に寄り付かないことも銘柄によってはあるため、high-lowという列も追加しました。
この値がゼロの時は、寄り付いていないと判断し、「次の日の寄り付き」を出すために、df_queryで
high-low列が0でないものを分離しようと考えました。
その際、下記のようなコードを書いてみたのですが、エラーが出てしまいました。
発生している問題・エラーメッセージ
エラーメッセージ ----> stock_df["購入日"] = stock_df.apply(get_parchase_day, df=price_df, code=stock_df["銘柄コード"], date=stock_df["登録日付"], column_str="open", axis=1) C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py in apply(self, func, axis, raw, result_type, args, **kwds) 6876 kwds=kwds, 6877 ) -> 6878 return op.get_result() 6879 6880 def applymap(self, func) -> "DataFrame": C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\apply.py in get_result(self) 184 return self.apply_raw() 185 --> 186 return self.apply_standard() 187 188 def apply_empty_result(self): C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\apply.py in apply_standard(self) 294 try: 295 result = libreduction.compute_reduction( --> 296 values, self.f, axis=self.axis, dummy=dummy, labels=labels 297 ) 298 except ValueError as err: pandas\_libs\reduction.pyx in pandas._libs.reduction.compute_reduction() pandas\_libs\reduction.pyx in pandas._libs.reduction.Reducer.get_result() C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\apply.py in f(x) 111 112 def f(x): --> 113 return func(x, *args, **kwds) 114 115 else: TypeError: get_parchase_day() got multiple values for argument 'df'
該当のソースコード
import sqlite3 import pandas as pd from datetime import datetime from datetime import timedelta import pandas.tseries.offsets as offsets # pandas日付データのオフセット(offsets.Day())に使う。 def get_partical_df(df, code, date): ret_df = df.query("code == @code & date > @date & high-low != 0") return ret_df # 購入日を求める関数(applyに渡す用) def get_parchase_day(df, code, date, column_str): # tmp_df = get_partical_df(df, code, date) # return tmp_df[column_str].iloc[0] tmp_df = df.query("code == @code & date > @date & high-low != 0")[0] print(tmp_df) return tmp_df[column_str] stock_df["購入日"] = stock_df.apply(get_parchase_day, df=price_df, code=stock_df["銘柄コード"], date=stock_df["登録日付"], column_str="open", axis=1)
試したこと
速度の関係上、できればforで回したくなかったのですが、いろいろ試しても動かないので、下記のようにforで回すパターンも作ろうとしてみました。(しかし、エラーは出なくなったが、すべて同じ購入日が帰ってきてしまう。)
for st_code, st_date in zip(stock_df["銘柄コード"], stock_df["登録日付"]):
print(st_code, st_date)
tmp_df = get_partical_df(price_df, str(st_code), st_date)
if tmp_df.empty: continue print(tmp_df["low"].iloc[0]) stock_df["購入日"] = tmp_df["date"].iloc[0] stock_df["購入価格"] = tmp_df["low"].iloc[0]
補足情報(FW/ツールのバージョンなど)
python 3.7.4
pandas 1.0.1
あなたの回答
tips
プレビュー