【发布时间】: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_data 是dict,symbol 是获取数据帧的字符串键。数据为股价数据。例如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