How to add new columns to pandas data frame using .loc

Viewed 256

I am calculating very simple daily stock calculations in data frame ( for e.g. SMA, VWAP, RSI etc). After I upgraded to anaconda 3.0, my code stopped working and gives followed error. I don't have much experience in coding and need some help.

KeyError: "Passing list-likes to .loc or [] with any missing labels is no longer supported. The following labels were missing: Index(['RSI', 'ZONE'], dtype='object'). See https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#deprecate-loc-reindex-listlike"

Followed is the code.

import yfinance as yf
import pandas as pd

def convert_to_dataframe_daily(data):
    
    window = 10
    window20 = 20
    window50 = 50
    window100 = 100
    window200 = 200
    ema_time = 8
    #data = yf.download("googl", period="30d", interval="5m")
    #data = yf.download('TSLA', period='30d', interval='5m')
    
    pd.set_option('display.max_columns', None)
    #calculation for VWAP
    volumeC = data['Volume']
    priceC = data['Close']
    df = data.assign(VWAP=((volumeC * priceC).cumsum() / volumeC.cumsum()).ffill())
    #Convert the timezone to Chicago central
    #df.index = pd.DatetimeIndex(df.index.tz_convert('US/Central')) # aware--> aware
    #reset the dataframe index and separate time
    df.reset_index(inplace=True)
    #df.index.intersection
    #df2 = df[df.index.isin(dts)]

    #df['Date'] = pd.to_datetime(df['Datetime']).dt.date
    #df['Time'] = pd.to_datetime(df['Datetime']).dt.time
    
    # calculate stochastic
    
    df['low5']= df['Low'].rolling(5).min()
    df['high5']= df['High'].rolling(5).max()
    
    #k = 100 * (c - l) / (h - l) 
    df['K'] = (df['Close']-df['low5'])/(df['high5']-df['low5'])
    #s.reindex([1, 2, 3])
    columns = df.columns.values.tolist()
    #df[columns[index]]
    #df = pd.DataFrame(np.random.randn(8, 4),index=dates, columns=['A', 'B', 'C', 'D'])
    df = df.loc[:, ('Date','Open','High','Low', 'Close','Volume','VWAP','K','RSI', 'ZONE')]
    #df = df.reindex(['Date','Open','High','Low', 'Close','Volume','VWAP','K','RSI', 'ZONE'])
    
    df['RSI'] = calculate_rsi(df)
    
    filter_Z1 = df['K'] <=0.1
    filter_Z2 = (df['K'] > 0.1) & (df['K'] <= 0.2)
    filter_Z3 = (df['K'] > 0.2) & (df['K'] <= 0.3)
    filter_Z4 = (df['K'] > 0.3) & (df['K'] <= 0.4)
    filter_Z5 = (df['K'] > 0.4) & (df['K'] <= 0.5)
    filter_Z6 = (df['K'] > 0.5) & (df['K'] <= 0.6)
    filter_Z7 = (df['K'] > 0.6) & (df['K'] <= 0.7)
    filter_Z8 = (df['K'] > 0.7) & (df['K'] <= 0.8)
    filter_Z9 = (df['K'] > 0.8) & (df['K'] <= 0.9)
    filter_Z10 = (df['K'] > 0.9) & (df['K'] <= 1)
    #plug in stochastic zones
    
    
    df['ZONE'].where(-filter_Z1, 'Z1', inplace=True)
    df['ZONE'].where(-filter_Z2, 'Z2', inplace=True)
    df['ZONE'].where(-filter_Z3, 'Z3', inplace=True)
    df['ZONE'].where(-filter_Z4, 'Z4', inplace=True)
    df['ZONE'].where(-filter_Z5, 'Z5', inplace=True)
    df['ZONE'].where(-filter_Z6, 'Z6', inplace=True)
    df['ZONE'].where(-filter_Z7, 'Z7', inplace=True)
    df['ZONE'].where(-filter_Z8, 'Z9', inplace=True)
    df['ZONE'].where(-filter_Z9, 'Z9', inplace=True)
    df['ZONE'].where(-filter_Z10, 'Z10', inplace=True)
    
    df = df['Date','Open','High','Low', 'Close','Volume','VWAP','K','RSI', 'ZONE']
    return df
    
data = yf.download('ba', period='500d', interval='1d')
df = convert_to_dataframe_daily(data)
print(df)
1 Answers

A few lines need to be tweaked

  1. Instead of
df = df.loc[:, ('Date','Open','High','Low', 'Close','Volume','VWAP','K','RSI', 'ZONE')]    

use

df = df[['Date','Open','High','Low', 'Close','Volume','VWAP','K']]
  1. before
df['ZONE'].where(-filter_Z1, 'Z1', inplace=True)
...

put a line

df['ZONE'] = 0
  1. The line before return df should be changed to
df = df[['Date','Open','High','Low', 'Close','Volume','VWAP','K','RSI', 'ZONE']]
Related