sql >> Base de Datos >  >> RDS >> Mysql

La forma más rápida de cargar datos numéricos en python/pandas/numpy array desde MySQL

El "problema" parece haber sido la conversión de tipo que ocurre del tipo decimal de MySQL al decimal de python. Decimal que MySQLdb, pymysql y pyodbc hacen en los datos. Cambiando el archivo converters.py (en las últimas líneas) en MySQLdb para tener:

conversions[FIELD_TYPE.DECIMAL] = float
conversions[FIELD_TYPE.NEWDECIMAL] = float

en lugar de decimal. Decimal parece resolver completamente el problema y ahora el siguiente código:

import MySQLdb
import numpy
import time

t = time.time()
conn = MySQLdb.connect(host='',...)
curs = conn.cursor()
curs.execute("select x,y from TABLENAME")
data = numpy.array(curs.fetchall(),dtype=float)
print(time.time()-t)

¡Se ejecuta en menos de un segundo! Lo que es gracioso, decimal. El decimal nunca pareció ser el problema en el generador de perfiles.

Una solución similar debería funcionar en el paquete pymysql. pyodbc es más complicado:todo está escrito en C++, por lo que tendría que volver a compilar todo el paquete.

ACTUALIZAR

Aquí hay una solución que no requiere modificar el código fuente de MySQLdb:Python MySQLdb devuelve datetime.date y decimal La solución entonces para cargar datos numéricos en pandas:

import MySQLdb
import pandas.io.sql as psql
from MySQLdb.converters import conversions
from MySQLdb.constants import FIELD_TYPE

conversions[FIELD_TYPE.DECIMAL] = float
conversions[FIELD_TYPE.NEWDECIMAL] = float
conn = MySQLdb.connect(host='',user='',passwd='',db='')
sql = "select * from NUMERICTABLE"
df = psql.read_frame(sql, conn)

Supera a MATLAB por un factor de ~4 al cargar una tabla de 200k x 9.