Я стремлюсь улучшить свой OOP набор навыков и написал скрипт для извлечения биржевых данных и запуска простой статистики. Я могу запускать и вызывать каждую функцию в классе Evaluation по отдельности (см. Ниже), но у меня возникают проблемы при попытке пролистать список тикеров и добавить статистику в исходный фрейм данных.
import datetime as d
import pandas as pd
import pandas_datareader.data as web
import numpy as np
start = d.datetime(2019, 1, 1)
end = d.datetime(2020, 4, 17)
class Security(object):
def _init__(self, ticker, data_platform, start_date, end_date):
self.ticker = ticker
self.data_platform = data_platform
self.start_date = start_date
self.end_date = end_date
def fetch_stock_data(self, ticker, data_platform, start_date, end_date):
df = web.DataReader(ticker, data_platform, start_date, end_date)
return df
class Evaluation(Security):
def __init__(self, ticker, data_platform, start_date, end_date):
self.df = Security.fetch_stock_data(
self, ticker, data_platform, start_date, end_date)
def simple_moving_average(self, period):
df = self.df
df['SMA-{}'.format(period)] = df['Adj Close'].rolling(period).mean()
return df['SMA-{}'.format(period)]
def exp_moving_average(self, period):
df = self.df
df['EMA_{}'.format(period)] = df['Adj Close'].ewm(span=period).mean()
return df['EMA_{}'.format(period)]
def rsi(self, period):
df = self.df
delta = df['Adj Close'].diff()
up = delta * 0
down = up.copy()
up[delta > 0] = delta[delta > 0]
down[delta < 0] = -delta[delta < 0]
up[up.index[period - 1]] = np.mean(up[:period])
up = up.drop(up.index[:(period - 1)])
down[down.index[period - 1]] = np.mean(down[:period])
down = down.drop(down.index[:(period - 1)])
rs = up.ewm(span=period - 1).mean() / down.ewm(span=period - 1).mean()
rsi_calc = 100 - 100 / (1 + rs)
df['rsi'] = rsi_calc
return df['rsi']
# pypl = Evaluation('PYPL', 'yahoo', start, end)
# print(csgs.df)
# print(csgs.simple_moving_average(50))
# print(csgs.exp_moving_average(26))
# print(csgs.rsi(14))
tickers = ['PYPL', 'TSLA']
for i in tickers:
df = Evaluation(i, 'yahoo', start, end)
df['SMA'] = df.simple_moving_average(50)
df['EMA'] = df.exp_moving_average(26)
df['rsi'] = df.rsi(14)
print(df)
Я получаю ошибку TypeError, которая, по моему мнению, связана со ссылкой на класс Evaluation.
TypeError: 'Evaluation' object does not support item assignment