【问题标题】:Panda dataframe yield error熊猫数据框产量错误
【发布时间】:2023-03-20 17:01:01
【问题描述】:

我正在尝试为熊猫数据框生成 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 移动到下一行(次日价格)

我的目标是每天获取股票价格(迭代数据帧的行),但_connect_MySQL 中的self.symbol_data[s] 是一个数据帧,而_get_new_bar 是一个生成器,因此我收到此错误

AttributeError: 'generator' 对象没有属性 'itertuples'

有人有什么想法吗?

我正在使用 python 3.6。谢谢

self.symbol_datadictsymbol 是获取数据帧的字符串键。数据为股价数据。例如self.symbol_data["GOOG"]返回一个数据框,其中包含按日期排列的google每日股价信息索引,每行包括开盘价、最低价、最高价、收盘价和成交量。我的目标是使用yield 每天迭代这个价格数据。

_connect_MySQL 将从数据库中获取数据 在本例中,函数中的 s = "GOOG"

【问题讨论】:

  • 您希望symbol_data[symbol] 会返回什么?根据错误,它返回一个生成器,而不是 panda 数据帧。
  • 我有一个数据框。 symbol_data[symbol] 是一个数据帧。我希望使用 yield 逐行迭代这个数据帧,以便每次函数返回一个包含该行数据的元组。我能做到吗?
  • 好的。你能发布self.symbol_data 的样子吗?更重要的是,symbol 是什么? Python 说该表达式返回的是一个生成器 - 因此是错误。
  • self.symbol_data 是一个字典,符号是获取数据帧的关键。数据为股价数据。例如 self.symbol_data["GOOG"] 返回一个数据框,其中包含按日期排列的 google 每日股价信息索引,每行包括开盘价、最低价、最高价、收盘价和成交量。我的目标是每天使用收益率迭代这个价格数据
  • 请在您的问题中发布其定义。如果字典的值类似于pd.DataFrame(...),那么我希望您的代码能够正常工作。另外,尝试打印它以查看它的外观

标签: python-3.x pandas dataframe yield-keyword


【解决方案1】:

我发现了错误。 我在其他地方的代码将数据框更改为生成器。 一个愚蠢的错误大声笑

我没有在问题中发布这一行,但这一行改变了数据类型

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 2020-02-10
    • 1970-01-01
    • 2018-11-19
    • 2021-07-25
    相关资源
    最近更新 更多