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

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

Поэтому в основном я хочу выполнить запрос к моей базе данных SQL и сохранить возвращенные данные в виде структуры данных 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.

Ответ 1

Вот самый короткий код, который выполнит задание:

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

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

Ответ 2

Изменить: март 2015

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

import pandas as pd

df = pd.read_sql(sql, cnxn)

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

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

Ответ 3

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

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

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

Ответ 4

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

pandas теперь имеет функцию read_sql. Вы определенно хотите использовать это вместо этого.

Оригинальный ответ:

Я не могу помочь вам с SQLAlchemy - я всегда использую pyodbc, MySQLdb или psychopg2 по мере необходимости. Но при этом функция, столь же простая, как и нижняя, как правило, соответствует моим потребностям:

import decimal

import pydobc
import numpy as np
import pandas

cnn, cur = myConnectToDBfunction()
cmd = "SELECT * FROM myTable"
cur.execute(cmd)
dataframe = __processCursor(cur, dataframe=True)

def __processCursor(cur, dataframe=False, index=None):
    '''
    Processes a database cursor with data on it into either
    a structured numpy array or a pandas dataframe.

    input:
    cur - a pyodbc cursor that has just received data
    dataframe - bool. if false, a numpy record array is returned
                if true, return a pandas dataframe
    index - list of column(s) to use as index in a pandas dataframe
    '''
    datatypes = []
    colinfo = cur.description
    for col in colinfo:
        if col[1] == unicode:
            datatypes.append((col[0], 'U%d' % col[3]))
        elif col[1] == str:
            datatypes.append((col[0], 'S%d' % col[3]))
        elif col[1] in [float, decimal.Decimal]:
            datatypes.append((col[0], 'f4'))
        elif col[1] == datetime.datetime:
            datatypes.append((col[0], 'O4'))
        elif col[1] == int:
            datatypes.append((col[0], 'i4'))

    data = []
    for row in cur:
        data.append(tuple(row))

    array = np.array(data, dtype=datatypes)
    if dataframe:
        output = pandas.DataFrame.from_records(array)

        if index is not None:
            output = output.set_index(index)

    else:
        output = array

    return output

Ответ 5

MySQL Connector

Для тех, кто работает с соединителем mysql, вы можете использовать этот код для начала. (Спасибо @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())

Ответ 6

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

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)

Ответ 7

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

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)

Ответ 8

resoverall - объект ResultProxy sqlalchemy. Подробнее об этом можно узнать в sqlalchemy docs, в котором объясняется основное использование работы с двигателями и подключениями. Важно отметить, что resoverall имеет тип dict.

Pandas любит подобные объекты типа, чтобы создавать свои структуры данных, см. онлайн-документы

Удачи вам в sqlalchemy и pandas.

Ответ 9

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

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

Ответ 10

Просто используйте 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).

Ответ 11

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

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

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 в DataFrame.

Ответ 12

Вот мой. На всякий случай, если вы используете "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

Ответ 13

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

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

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

Ответ 14

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

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

Ответ 15

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

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

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

Ответ 16

1. Использование MySQL-connector-python

# pip install mysql-connector-python

import mysql.connector
import pandas as pd

mydb = mysql.connector.connect(
    host = 'host',
    user = 'username',
    passwd = 'pass',
    database = 'db_name'
)
query = 'select * from table_name'
df = pd.read_sql(query, con = mydb)
print(df)

2. Использование SQLAlchemy

# pip install pymysql
# pip install sqlalchemy

import pandas as pd
import sqlalchemy

engine = sqlalchemy.create_engine('mysql+pymysql://username:[email protected]:3306/db_name')

query = '''
select * from table_name
'''
df = pd.read_sql_query(query, engine)
print(df)

Ответ 17

pandas.io.sql.write_frame УСТАРЕЛО. https://pandas.pydata.org/pandas-docs/version/0.15.2/generated/pandas.io.sql.write_frame.html

Следует изменить, чтобы использовать pandas.DataFrame.to_sql https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_sql.html

Есть другое решение. PYODBC to Pandas - DataFrame не работает - форма передаваемых значений (x, y), индексы подразумевают (w, z)

Начиная с Pandas 0.12 (я верю), вы можете сделать:

import pandas
import pyodbc

sql = 'select * from table'
cnn = pyodbc.connect(...)

data = pandas.read_sql(sql, cnn)

До 0.12 вы могли сделать:

import pandas
from pandas.io.sql import read_frame
import pyodbc

sql = 'select * from table'
cnn = pyodbc.connect(...)

data = read_frame(sql, cnn)