0

I am getting the below error message but the code seems to works fine. As far as I can see there is no copy code.

A value is trying to be set on a copy of a slice from a DataFrame.

df['Up Move'] = np.nan
df['Down Move'] = np.nan
df['Average Up'] = np.nan
df['Average Down'] = np.nan
df['RS'] = np.nan
df['RSI'] = np.nan
for x in range(1, len(df)):
# for x in range(1, 300):
    df['Up Move'][x] = 0
    df['Down Move'][x] = 0

    if df['Close'][x] > df['Close'][x-1]:
        df['Up Move'][x] = df['Close'][x] - df['Close'][x-1]

    if df['Close'][x] < df['Close'][x-1]:
        df['Down Move'][x] = abs(df['Close'][x] - df['Close'][x-1])

#Calculate initial Average Up & Down, RS and RSI
# import pdb; pdb.set_trace()
df['Average Up'][14] = df['Up Move'][1:15].mean()
df['Average Down'][14] = df['Down Move'][1:15].mean()
df['RS'][14] = df['Average Up'][14] / df['Average Down'][14]
df['RSI'][14] = 100 - (100/(1+df['RS'][14]))

#Calculate rest of Average Up, Average Down, RS, RSI
for x in range(15, len(df)):
    df['Average Up'][x] = (df['Average Up'][x-1]*13+df['Up Move'][x])/14
    df['Average Down'][x] = (df['Average Down'][x-1]*13+df['Down Move'][x])/14
    df['RS'][x] = df['Average Up'][x] / df['Average Down'][x]
    df['RSI'][x] = 100 - (100/(1+df['RS'][x]))

df.drop(['Up Move', 'Down Move', 'Average Up', 'Average Down'], axis = 1, inplace = True)
Fred
  • 211
  • 2
  • 9
  • I think in your code missing `loc` for selecting/seting values.You can check mainly `cs95` answer and [docs](https://pandas.pydata.org/docs/user_guide/indexing.html#returning-a-view-versus-a-copy) – jezrael Dec 01 '20 at 07:32
  • like not use `df['Up Move'][x]` but use `df.loc[x, 'Up Move']` – jezrael Dec 01 '20 at 07:32

0 Answers0