Как преобразовать результат 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 ответов:
вот самый короткий код, который будет делать эту работу:
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)
Как и Натан, я часто хочу сбросить результаты запроса 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