我正在使用Sqlite3 python库创建股票价格数据库。但是我的代码运行时间很长,不知道为什么它很慢。知道如何加快速度吗?我做错了吗?
我正在使用Python 3.x,Anaconda
import pandas as pd
from googlefinance.client import get_price_data, get_prices_data, get_prices_time_data
import sqlite3
db = sqlite3.connect('database.db')
c = db.cursor()
param = {'q':'MMM', 'i':"86400",'x':"NYSE",'p':"25Y"}
end_of_day = pd.DataFrame(get_price_data(param))
end_of_day['Time']=end_of_day.index
count= len(end_of_day['Time'])
c.execute('CREATE TABLE IF NOT EXISTS MMM(date,open,high,low,close,volume)')
for i in range(0,count):
c.execute('INSERT INTO MMM(date,open,high,low,close,volume) VALUES(?,?,?,?,?,?)',
(str(end_of_day.iloc[i][5]),str(end_of_day.iloc[i][0]),str(end_of_day.iloc[i][1]),
str(end_of_day.iloc[i][2]),str(end_of_day.iloc[i][3]),str(end_of_day.iloc[i][4])))
db.commit()
c.close()
db.close()
答案 0 :(得分:2)
您的代码花费时间是因为您正在为每个插入使用commit并使用execute而对于批量插入,您可以使用executemany()。
尝试绑定元组中的所有数据然后追加到列表然后使用executemany进行快速批量插入:
_list=[]
for i in range(0,count):
_tuple=(str(end_of_day.iloc[i][5]),str(end_of_day.iloc[i][0]),str(end_of_day.iloc[i][1]),
str(end_of_day.iloc[i][2]),str(end_of_day.iloc[i][3]),str(end_of_day.iloc[i][4])))
_list.append(_tuple)
_tuple=()
c.executemany('INSERT INTO MMM(date,open,high,low,close,volume) VALUES(?,?,?,?,?,?)',(_list))
db.commit()
答案 1 :(得分:1)
假设count
很大,那个循环真的会减慢速度。您可以使用executemany()
加快速度。尝试用以下方法替换你的循环:
params = end_of_day.apply(tuple).tolist() # Convert dataframe to list of tuples
c.executemany('INSERT INTO MMM(open,high,low,close,volume,date) VALUES(?,?,?,?,?,?)', params)
db.commit()
有关executemany()
的详细信息,请参阅documentation。
更简单的选择可能是简单地使用内置的Pandas函数to_sql()
:
end_of_day.to_sql('MMM', db)
在执行此操作之前,您可能需要在Pandas中稍微重新排列列顺序,但这是一个非常方便的功能。