Как преобразовать результат SQL-запроса в структуру данных PANDAS?


любая помощь по этой проблеме будет очень признательна.

поэтому в основном я хочу запустить запрос к моей базе данных SQL и сохранить возвращенные данные в виде структуры данных Pandas.

я прикрепил код для запроса.

Я читаю документацию по Pandas, но у меня есть проблема, чтобы определить тип возврата моего запроса.

Я попытался распечатать результат запроса, но это не дает никакой полезной информации.

спасибо!!!!

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)

поэтому я вроде как хочу понять, что такое формат / тип данных моей переменной "resoverall" и как ее поместить в структуру данных PANDAS.

15 64

15 ответов:

вот самый короткий код, который будет делать эту работу:

from pandas import DataFrame
df = DataFrame(resoverall.fetchall())
df.columns = resoverall.keys()

вы можете пойти fancier и разобрать типы, как в ответе Павла.

Edit: Mar. 2015

Как отмечено ниже, панды теперь используют SQLAlchemy читать из ( read_sql) и вставить в (to_sql) базы данных. Следующее должно работать

import pandas as pd

df = pd.read_sql(sql, cnxn)

предыдущий ответ: Через mikebmassey от A аналогичный вопрос

import pyodbc
import pandas.io.sql as psql

cnxn = pyodbc.connect(connection_info) 
cursor = cnxn.cursor()
sql = "SELECT * FROM TABLE"

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

если вы используете ORM SQLAlchemy, а не язык выражений, вы можете захотеть преобразовать объект типа sqlalchemy.orm.query.Query для фрейма данных Pandas.

самый чистый подход-получить сгенерированный SQL из атрибута оператора запроса, а затем выполнить его с помощью pandas read_sql() метод. Например, начиная с объекта запроса под названием query:

df = pd.read_sql(query.statement, query.session.bind)

изменить 2014-09-30:

панды теперь есть

Как и Натан, я часто хочу сбросить результаты запроса sqlalchemy или sqlsoup в фрейм данных Pandas. Мое собственное решение для этого:

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

просто использовать pandas и pyodbc вместе. Вам придется изменить строку подключения (connstr) согласно вашим спецификациям базы данных.

import pyodbc
import pandas as pd

# MSSQL Connection String Example
connstr = "Server=myServerAddress;Database=myDB;User Id=myUsername;Password=myPass;"

# Query Database and Create DataFrame Using Results
df = pd.read_sql("select * from myTable", pyodbc.connect(connstr))

я использовал pyodbc с несколькими корпоративными базами данных (например, SQL Server, MySQL, MariaDB, IBM).

resoverall является объектом SQLAlchemy ResultProxy. Вы можете прочитать больше об этом в С SQLAlchemy документы, последнее объясняет основное использование работы с двигателями и соединениями. Важным здесь является то, что resoverall Это как дикт.

панды любит dict как объекты для создания своих структур данных, см. online docs

удачи с sqlalchemy и панд.

этот вопрос старый, но я хотел добавить свои два цента. Я прочитал вопрос как " я хочу запустить запрос к моей [моей]базе данных SQL и сохранить возвращенные данные в виде структуры данных Pandas [DataFrame]."

из кода похоже, что вы имеете в виду базу данных mysql и предполагаете, что вы имеете в виду фрейм данных pandas.

import MySQLdb as mdb
import pandas.io.sql as sql
from pandas import *

conn = mdb.connect('<server>','<user>','<pass>','<db>');
df = sql.read_frame('<query>', conn)

например,

conn = mdb.connect('localhost','myname','mypass','testdb');
df = sql.read_frame('select * from testTable', conn)

это будет импортировать все строки testTable в фрейм данных.

MySQL Connector

для тех, кто работает с MySQL connector, вы можете использовать этот код в качестве начала. (Спасибо @Daniel Velkov)

использованы ссылки:


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())

вот код, который я использую. Надеюсь, это поможет.

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)

Это краткий и четкий ответ на вашу проблему:

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)

долгое время с последнего поста, но, возможно, это кому-то помогает...

укороченный путь, чем Павел H:

my_dic = session.query(query.all())
my_df = pandas.DataFrame.from_dict(my_dic)

лучший способ сделать это

db.execute(query) where db=db_class() #database class
    mydata=[x for x in db.fetchall()]
    df=pd.DataFrame(data=mydata)

вот мой. На всякий случай, если вы используете "pymysql":

import pymysql
from pandas import DataFrame

host   = 'localhost'
port   = 3306
user   = 'yourUserName'
passwd = 'yourPassword'
db     = 'yourDatabase'

cnx    = pymysql.connect(host=host, port=port, user=user, passwd=passwd, db=db)
cur    = cnx.cursor()

query  = """ SELECT * FROM yourTable LIMIT 10"""
cur.execute(query)

field_names = [i[0] for i in cur.description]
get_data = [xx for xx in cur]

cur.close()
cnx.close()

df = DataFrame(get_data)
df.columns = field_names

Если тип результата ResultSet, вы должны сначала преобразовать его в словарь. Тогда столбцы таблицы данных будет собран автоматически.

это работает в моем случае:

df = pd.DataFrame([dict(r) for r in resoverall])