【发布时间】:2019-07-08 23:07:45
【问题描述】:
这是我的情况。我正在尝试建立一个庞大的数据库,其中包含纽约证券交易所和纳斯达克股票及其指标的所有历史数据(2017 年 1 月 1 日至 2019 年 6 月 30 日)。
所有 4000 多只股票都存储在一个名为“ALLSTOCKS”的表中。该表每天使用我的 csv 上传更新。
csv 下载包含每只股票的开盘价、最高价、最低价和收盘价,这些股票将从各自的列中存储。根据这些数字,我的 python 代码将自动执行计算。这些计算的一个很好的例子是获得 9、20、50 和 100 天的收盘平均值。
为此,我提取每只股票的最后 9、20、50 和 CLOSE 天,并执行一个简单的 mysql AVG() 函数并将其存储到“ALLSTOCK”数据库中的指定列 (MA9)。
我提到股票总共有 4000+ 对吗?因此,我决定将平均公式包含在 FOR LOOP 中。
这是我的一些代码:
for ticker in tickers:
mycursor.execute("SELECT format(AVG(Close),4) from (select Close from _PSEI where stock = '" + ticker + "' ORDER BY ID DESC LIMIT 0,9) _PSEI")
manine = mycursor.fetchone()[0]
mycursor.execute("SELECT format(AVG(Close),4) from (select Close from _PSEI where stock = '" + ticker + "' ORDER BY ID DESC LIMIT 0,20) _PSEI")
matwenty = mycursor.fetchone()[0]
无论如何,问题在于这是一个 for 循环,其中包含一个包含 4000 多个项目的变量数组。我的结果很慢。这意味着,我的代码每只股票执行大约 0.3 到 0.5 秒,并且在完成整个循环之前最多需要 2000 秒。
这是变量数组的(部分):
ticker = ["CHK","BAC","GE","VALE","T","F","PFE","GGB","ECA","SWN","BBD","GME","RRC","FCX","AUY","AVP","APC","KGC","PBR","WFC","S","NBR","DB","C","SAN","KO","PG","RIG","HAL","MRK","X","NOK","APA","DNR","JPM","NLY","MRO","GFI","VZ","RF","XOM","NEM","NKE","HPQ","MS","CLF","DAL","SLB","M","ESV","V","KR","CTL","KEY","JCP","OXY","DIS","BP","CIG","EOG","IAG","MO","GM","RIO","EQT","GOL","HMY","ABB","DVN","MGM"]
有没有办法让它更快?您可以建议任何快速的方法吗?如果遇到这种情况,你会怎么做?
【问题讨论】:
-
是否可以假设每个代码的处理不依赖于任何其他票据的处理结果?即这些可以并行完成吗?
-
您可以使用 SQL 方法解决此问题:按股票代码分组,而不是对每个股票代码的值进行一次查询
-
我不确定我是否做对了,但我想开始。您是否将数据读取为 pandas DataFrame?因为有一种使用 pandas 获取列的更快方法,给定一组值用作您想要获取的列的“标准”。
-
@Joe No. 我没有使用熊猫。