程式小專題 – 計算ATR #5 SettingWithCopyWarning 鴕鳥解決法

在本系列的第三篇,我碰到了 SettingWithCopyWarning 這個問題,Google 之後好像滿常見的,似乎跟 pandas 操作時所返回結果是 view 抑或是 copy 有關,這裡面好像又與 chained assignment 牽扯在一起。

對我這個初學者來說,這些太高能了。我只想著要怎麼不讓 Python 回報警告,以下是土法煉鋼的嘗試。那個 copy() 的方法好像在 pandas documentation 裡面有提到應該要避免,但不管它,先讓 Python 閉嘴先。不知道之後會不會有問題呀?

import pandas as pd 
import os

os.chdir('D:\\Project\\ATR') #更改工作目錄到ATR資料夾
 
df = pd.read_csv("SE 日線.csv", usecols = list(range(7)))

df_se = df.tail(23) #用.tail(23)把最後23列挑出來 
df_se.index = range(23) #把index改成0到22

df_se.columns=['Date','Open','High','Low','Close','Change','ChangePct']

PreviousClose = df_se.Close.shift(1).copy() 
df_se.loc[:,'PreviousClose'] = PreviousClose

TrueRange = df_se[['PreviousClose','High']].max(axis=1).copy()-df_se[['PreviousClose','Low']].min(axis=1).copy() #2
df_se.loc[:,'TrueRange']= TrueRange

PreAvgTR = df_se['TrueRange'].rolling(window=21).mean().shift().copy() 
df_se.loc[:,'PreAvgTR'] = PreAvgTR

ATR = (df_se['PreAvgTR'].copy()*(21-1) + df_se['TrueRange'].copy())/21 
df_se.loc[:,'ATR'] = ATR

print(df_se[-1:]['ATR'])

接著,下一篇就要把這段接到 API code 的屁股啦!

發表留言