pythonで関数を呼び出した際にメインの流れの中にある変数の内の一つに
何故かその関数の返り値と同じ値が代入されています
プログラムは省略してますが関数の部分は下記になります
python
1def sma_slope_average(df_csv, row_A, row_B, n): 2 sma_slope_list={} #行番号をキーにして行番号直近のn個の角度を保存。ロング・ショート両方の行を保存 3 #ゴールデンクロス(ロング)行のn個の角度 4 for row in row_A: 5 for x in range(1,n+1): 6 y = (df_csv["sma01_A"][abs(row)] - df_csv["sma01_A"][abs(row)-x])*100 7 tan = y / x 8 if x == 1: 9 sma_slope_list[row] = [math.degrees(math.atan(tan))] 10 else: 11 sma_slope_list[row].append(math.degrees(math.atan(tan))) 12 13 #デッドクロス(ショート)行のn個の角度 14 for row in row_B: 15 for x in range(1,n+1): 16 y = (df_csv["sma01_B"][abs(row)] - df_csv["sma01_B"][abs(row)-x])*100 17 tan = y / x 18 if x == 1: 19 sma_slope_list[row] = [math.degrees(math.atan(tan))] 20 else: 21 sma_slope_list[row].append(math.degrees(math.atan(tan))) 22 23 24 #上記で求めた各行のn個の角度の平均を求めて辞書に行番号と共に入れる 25 sma_slope_average_list = {} 26 for row, value in sma_slope_list.items(): 27 sma_slope_average_list[row] = [sum(value) / len(value)] 28 29 return sma_slope_average_list 30 31 32#2本の移動平均線の交点付近の時間(行)から上位の時間足(ここでは日足)の直近n個の角度の平均を求める 33#※この関数はsma_slope_average関数から返り値を貰った変数を参照にしているので先にsma_slope_average関数を使う事 34#※上位時間足は日足を使う事を前提に作ってあるので日足以外で使う場合は関数を書き換える必要あり 35def sma_average_add_daily(df_csv, df_joui, sma_slope_list, n): 36 sma_slope_average_daily_list={} #キーに移動平均の交点行、1番目の値に元の移動平均線の平均角度、2番目の値に上位時間足の角度の平均 37 for row, value in sma_slope_list.items(): 38 date = str(df_csv["日時"][abs(row)]).split()[0] #交点行の時間を求める 39 if date[5:] == "01-01": #交点行が1月1日ならポジションを取らない 40 continue 41 date_time = dt.datetime.strptime(date, '%Y-%m-%d') #datetime型に変換 42 43 if date_time.date().strftime("%A") == "Saturday": #交点行が土曜日の場合は上位の時間足の行を1引く。それ以外は普通に参照 44 date_time = date_time + dt.timedelta(days=-1) 45 daily_index = df_joui.index[(df_joui["日時"] == str(date_time.date()))] 46 else: 47 daily_index = df_joui.index[(df_joui["日時"] == str(date_time.date()))] 48 49 50 51 #上位の時間足の角度の平均を求める 52 sma_daily=0 53 try: 54 for x in range(1, n): 55 #print(daily_index) 56 y = (df_joui["sma01_B"][daily_index[0]] - df_joui["sma01_B"][daily_index[0]-x]) * 100 57 #print(y) 58 tan = y / x 59 sma_daily += math.degrees(math.atan(tan)) 60 sma_daily /= n 61 sma_slope_average_daily_list[row] = value #1番目に元の移動平均線の平均角度を入れる 62 sma_slope_average_daily_list[row].append(sma_daily) #2番目に上位時間足の移動平均線の平均角度を入れる 63 except: 64 print("エラー:", row, "行目", df_csv["日時"][abs(row)]) 65 continue 66 67 sma = sma_slope_average_daily_list 68 return sma
この関数をメインの流れの時に↓の様に続けて実行します
sma_slope = sma_slope_average(df_csv, row_A, row_B, 5)
sma_slope2 = sma_average_add_daily(df_csv, df_joui, sma_slope, 5)
そうすると何故か2行目のsma_average_add_daily関数を実行した時
sma_slope2だけでなく1行目のsma_slopeに全く同じ返り値が代入されています
sma_average_add_daily関数を見直してみてもsma_slopeに対して何かをするコードは見当たりません
何故こんな事が起こるのでしょうか?
※
引数は
・df_csv:pandasのデータフレーム
・df_joui:pandasのデータフレーム
・row_A:int型の数字
・row_B:int型の数字
回答1件
あなたの回答
tips
プレビュー