Panda dataframe error yield - PullRequest
       17

Panda dataframe error yield

0 голосов
/ 27 июня 2018

Я пытаюсь получить 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" в функции

1 Ответ

0 голосов
/ 29 июня 2018

Я нашел ошибку. Мой код в другом месте меняет информационный фрейм на генератор. Глупая ошибка lol

Я не опубликовал эту строку в вопросе, но эта строка изменила тип данных

# Reindex the dataframes
    for s in self.symbol_list:
        self.symbol_data[s] = self.symbol_data[s].reindex(index=comb_index, method='pad').iterrows()
...