177 votes

Comment convertir le résultat d'une requête SQL en structure de données PANDAS ?

Toute aide sur ce problème sera grandement appréciée.

En gros, je veux exécuter une requête dans ma base de données SQL et stocker les données renvoyées dans une structure de données Pandas.

J'ai joint le code pour la requête.

Je lis la documentation sur Pandas, mais j'ai du mal à identifier le type de retour de ma requête.

J'ai essayé d'imprimer le résultat de la requête, mais cela ne donne aucune information utile.

Merci !!!!

from sqlalchemy import create_engine

engine2 = create_engine('mysql://THE DATABASE I AM ACCESSING')
connection2 = engine2.connect()
dataid = 1022
resoverall = connection2.execute("
    SELECT 
       sum(BLABLA) AS BLA,
       sum(BLABLABLA2) AS BLABLABLA2,
       sum(SOME_INT) AS SOME_INT,
       sum(SOME_INT2) AS SOME_INT2,
       100*sum(SOME_INT2)/sum(SOME_INT) AS ctr,
       sum(SOME_INT2)/sum(SOME_INT) AS cpc
    FROM daily_report_cooked
    WHERE campaign_id = '%s'",
    %dataid
)

Je veux donc comprendre quel est le format/type de données de ma variable "resoverall" et comment la placer dans la structure de données PANDAS.

20voto

Thomas Devoogdt Points 348

Connecteur MySQL

Pour ceux qui travaillent avec le connecteur mysql, vous pouvez utiliser ce code comme point de départ. (Merci à @Daniel Velkov)

Refs utilisés :


import pandas as pd
import mysql.connector

# Setup MySQL connection
db = mysql.connector.connect(
    host="<IP>",              # your host, usually localhost
    user="<USER>",            # your username
    password="<PASS>",        # your password
    database="<DATABASE>"     # name of the data base
)   

# You must create a Cursor object. It will let you execute all the queries you need
cur = db.cursor()

# Use all the SQL you like
cur.execute("SELECT * FROM <TABLE>")

# Put it all to a data frame
sql_data = pd.DataFrame(cur.fetchall())
sql_data.columns = cur.column_names

# Close the session
db.close()

# Show the data
print(sql_data.head())

9voto

Murali Bala Points 360

Voici le code que j'utilise. J'espère que cela vous aidera.

import pandas as pd
from sqlalchemy import create_engine

def getData():
  # Parameters
  ServerName = "my_server"
  Database = "my_db"
  UserPwd = "user:pwd"
  Driver = "driver=SQL Server Native Client 11.0"

  # Create the connection
  engine = create_engine('mssql+pyodbc://' + UserPwd + '@' + ServerName + '/' + Database + "?" + Driver)

  sql = "select * from mytable"
  df = pd.read_sql(sql, engine)
  return df

df2 = getData()
print(df2)

9voto

DeshDeep Singh Points 1361

Il s'agit d'une réponse courte et précise à votre problème :

from __future__ import print_function
import MySQLdb
import numpy as np
import pandas as pd
import xlrd

# Connecting to MySQL Database
connection = MySQLdb.connect(
             host="hostname",
             port=0000,
             user="userID",
             passwd="password",
             db="table_documents",
             charset='utf8'
           )
print(connection)
#getting data from database into a dataframe
sql_for_df = 'select * from tabledata'
df_from_database = pd.read_sql(sql_for_df , connection)

5voto

Janak Mayer Points 116

Comme Nathan, je souhaite souvent transférer les résultats d'une requête sqlalchemy ou sqlsoup dans un cadre de données Pandas. Ma propre solution est la suivante :

query = session.query(tbl.Field1, tbl.Field2)
DataFrame(query.all(), columns=[column['name'] for column in query.column_descriptions])

4voto

Wouter Overmeire Points 6676

resoverall est un objet ResultProxy sqlalchemy. Vous pouvez en savoir plus sur cet objet dans la section sqlalchemy docs Ce dernier explique l'utilisation de base des moteurs et des connexions. Ce qui est important ici, c'est que resoverall est une dictée.

Pandas aime les objets "dict like" pour créer ses structures de données, voir la section documents en ligne

Bonne chance avec sqlalchemy et pandas.

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