Я пытаюсь получить 1 строку на 1 строку для кадра данных панды, но получаю ошибку. Фрейм данных - это данные о ценах на акции, включая ежедневные данные открытия, закрытия, максимума, минимума цены и объема.
Ниже приведен мой код. Этот класс будет получать данные из базы данных MySQL
class HistoricMySQLDataHandler(DataHandler):
def __init__(self, events, symbol_list):
"""
Initialises the historic data handler by requesting
a list of symbols.
Parameters:
events - The Event Queue.
symbol_list - A list of symbol strings.
"""
self.events = events
self.symbol_list = symbol_list
self.symbol_data = {}
self.latest_symbol_data = {}
self.continue_backtest = True
self._connect_MySQL()
def _connect_MySQL(self): #get stock price for symbol s
db_host = 'localhost'
db_user = 'sec_user'
db_pass = 'XXX'
db_name = 'securities_master'
con = mdb.connect(db_host, db_user, db_pass, db_name)
for s in self.symbol_list:
sql="SELECT * FROM daily_price where symbol= s
self.symbol_data[s] = pd.read_sql(sql, con=con, index_col='price_date')"
def _get_new_bar(self, symbol):
"""
Returns the latest bar from the data feed as a tuple of
(sybmbol, datetime, open, low, high, close, volume).
"""
for row in self.symbol_data[symbol].itertuples():
yield tuple(symbol, datetime.datetime.strptime(row[0],'%Y-%m-%d %H:%M:%S'),
row[15], row[17], row[16], row[18],row[20])
def update_bars(self):
"""
Pushes the latest bar to the latest_symbol_data structure
for all symbols in the symbol list.
"""
for s in self.symbol_list:
try:
bar = self._get_new_bar(s).__next__()
except StopIteration:
self.continue_backtest = False
В основной функции:
# Declare the components with respective parameters
symbol_list=["GOOG"]
events=queue.Queue()
bars = HistoricMySQLDataHandler(events,symbol_list)
while True:
# Update the bars (specific backtest code, as opposed to live trading)
if bars.continue_backtest == True:
bars.update_bars()
else:
break
time.sleep(1)
Пример данных:
symbol_data["GOOG"] =
price_date id exchange_id ticker instrument name ... high_price low_price close_price adj_close_price volume
2014-03-27 29 None GOOG stock Alphabet Inc Class C ... 568.0000 552.9200 558.46 558.46 13100
Функция update_bars
вызовет _get_new_bar
для перехода к следующему ряду (цена на следующий день)
Моя цель состоит в том, чтобы получать цену акций изо дня в день (перебирать строки информационного кадра), но self.symbol_data[s]
в _connect_MySQL
- это информационный кадр, а в _get_new_bar
- генератор, поэтому я получаю эту ошибку
AttributeError: 'generator'
объект не имеет атрибута 'itertuples'
У кого-нибудь есть идеи?
Я использую Python 3.6. Спасибо
self.symbol_data
- это dict
, symbol
- это строковый ключ для получения кадра данных. данные являются данными о цене акций. Например, self.symbol_data["GOOG"]
возвращает фрейм данных с ежедневным информационным индексом цены акций Google по дате, в каждой строке указывается цена открытия, минимума, максимума, цены закрытия и объем. Моя цель состоит в том, чтобы повторять эти ценовые данные день за днем, используя yield
.
_connect_MySQL
получит данные из базы данных
В этом примере s = "GOOG" в функции