使用Sqlite3的数据库

时间:2018-04-23 12:56:30

标签: python database python-3.x pandas sqlite

我正在使用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()

2 个答案:

答案 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中稍微重新排列列顺序,但这是一个非常方便的功能。