Как создать копию действительно большой таблицы в SQLite, используя цикл - PullRequest
0 голосов
/ 25 апреля 2019

Мне нужно создать копию crsp.dsf в SQLite с использованием python. Crsp.dsf - это действительно очень большая таблица, и я настоятельно рекомендую сделать потоковое чтение или написать цикл, который повторяется на crsp.дсф по дате или пермно.В конце я должен убедиться, что у меня есть такое же количество наблюдений, уникальных дат, уникальных фирм и (примерно) сумма (округ (5)).

мой код следующим образом:

# import packages
import pandas as pd
import numpy as np
import mysql.connector
from dplython import (DplyFrame, X, diamonds, select, sift,
  sample_n, sample_frac, head, arrange, mutate, group_by,
  summarize, DelayFunction)


# def functions
def connect(db="crsp"):
    conn = mysql.connector.connect(host="178.128.92.75", 
                           port=3306,user="student_temp_user",
                           passwd="temp_userYxL",
                           db=db)
    return conn

def queryMySQL(x,db='crsp'):
    conn=connect(db=db)
    response = pd.read_sql(x, conn)
    conn.close()
    return response


# write a loop that iterates on crsp.dsf by permno
permnos = queryMySQL('select distinct permno from crsp.msf').loc[:,'permno']
permnos.unique()

i=0
for item in permnos.unique():
    result=queryMySQL('select * ' +
                      'from crsp.msf where permno = ' + str(item) + ' limit 5')
    i=i+1

    if i==1:
        msf=pd.DataFrame(result)
    if(i>1):
        msf = msf.append(pd.DataFrame(result))
    if i==83436:
        break # take long time

msf 


# write my own SQL table
from sqlalchemy import create_engine
engine = create_engine("mysql+pymysql://student_temp_user:temp_userYxL@178.128.92.75/student_temp_user")
msf.to_sql(name='msf_copy',con=engine, if_exists='append', index=False)


# verification
print(queryMySQL('select count(*), count(distinct date), count(distinct permno), sum(round(ret,5)) from student_temp_user.msf_copy')
print(queryMySQL('select count(*), count(distinct date), count(distinct permno), sum(round(ret,5)) from crsp.msf')

в цикле, я более 80 тысяч, наверное, поэтому так долго.как улучшить код?возможно в моем коде что-то не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...