98 votes

python-des pandas et des bases de données comme mysql

La documentation pour les Pandas a de nombreux exemples de bonnes pratiques pour travailler avec les données stockées dans différents formats.

Cependant, je suis incapable de trouver toutes les bonnes pratiques pour travailler avec des bases de données comme MySQL par exemple.

Quelqu'un peut-il m'indiquer des liens ou donner quelques extraits de code de comment faire pour convertir les résultats de la requête à l'aide de mysql-python à des blocs de données de Panda efficacement ?

103voto

Keith C Campbell Points 326

Comme Wes dit, io/sql read_frame va le faire, une fois que vous avez obtenu une connexion de base de données à l'aide d'un DBI compatible bibliothèque. Voici un court exemple d'utilisation de la MySQLdb et cx_Oracle bibliothèques pour se connecter à Oracle et MySQL et d'interroger leurs dictionnaires de données:

import pandas.io.sql as psql
import cx_Oracle

ora_conn = cx_Oracle.connect('your_connection_string')
df_ora = psql.frame_query('select * from user_objects', con=ora_conn)    
print 'loaded dataframe from Oracle. # Records: ', len(df_ora)
ora_conn.close()


import MySQLdb
mysql_cn= MySQLdb.connect(host='myhost', 
                port=3306,user='myusername', passwd='mypassword', 
                db='information_schema')
df_mysql = psql.frame_query('select * from VIEWS;', con=mysql_cn)    
print 'loaded dataframe from MySQL. records:', len(df_mysql)
mysql_cn.close()

58voto

Korem Points 2734

Pour ces dernières, les lecteurs de cette question: les pandas ont l'avertissement suivant dans leurs docs pour la version 14.0:

Avertissement: Certaines de ces fonctions ou de la fonction alias ont été obsolète et sera supprimée dans une future version. Cela comprend: tquery, uquery, read_frame, frame_query, write_frame.

Et:

Avertissement: le soutien à La ‘mysql' saveur lors de l'utilisation de DBAPI objets de connexion a été désapprouvée. MySQL sera plus pris en charge avec SQLAlchemy moteurs (GH6900).

Cela fait beaucoup de réponses ici dépassée. Vous devez utiliser sqlalchemy:

from sqlalchemy import create_engine
import pandas as pd
engine = create_engine('dialect://user:pass@host:port/schema', echo=False)
f = pd.read_sql_query('SELECT * FROM mytable', engine, index_col = 'ID')

23voto

mbatchkarov Points 5090

Pour mémoire, voici un exemple à l'aide d'une base de données sqlite:

import pandas.io.sql as psql
import sqlite3 as lite
con = lite.connect("whatever.sqlite")
with con:
    sql = "SELECT * FROM table_name"
    df = psql.frame_query(sql, con)
    print df.shape

21voto

dmvianna Points 1671

Je préfère créer des requêtes avec SQLAlchemy, et ensuite faire un DataFrame. SQLAlchemy rend plus facile à combiner SQL conditions Pythonically si vous avez l'intention de mélanger les choses.

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Table
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from pandas import DataFrame
import datetime

# We are connecting to an existing service
engine = create_engine('dialect://user:pwd@host:port/db', echo=False)
Session = sessionmaker(bind=engine)
session = Session()
Base = declarative_base()

# And we want to query an existing table
tablename = Table('tablename', 
    Base.metadata, 
    autoload=True, 
    autoload_with=engine, 
    schema='ownername')

# These are the "Where" parameters, but I could as easily 
# create joins and limit results
us = tablename.c.country_code.in_(['US','MX'])
dc = tablename.c.locn_name.like('%DC%')
dt = tablename.c.arr_date >= datetime.date.today() # Give me convenience or...

q = session.query(tablename).\
            filter(us & dc & dt) # That's where the magic happens!!!

def querydb(query):
    """
    Function to execute query and return DataFrame.
    """
    df = DataFrame(query.all());
    df.columns = [x['name'] for x in query.column_descriptions]
    return df

querydb(q)

8voto

hedgcutter Points 61

La même syntaxe fonctionne pour Ms SQL server à l'aide de podbc aussi.

import pyodbc
import pandas.io.sql as psql

cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=servername;DATABASE=mydb;UID=username;PWD=password') 
cursor = cnxn.cursor()
sql = ("""select * from mytable""")

df = psql.frame_query(sql, cnxn)
cnxn.close()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X