Pandas的文档提供了许多使用各种格式存储的最佳实践示例。
但是,我找不到用于处理像MySQL这样的数据库的任何好的示例。
谁能指向我链接或提供一些代码片段,说明如何使用mysql-python将查询结果有效地转换为Pandas中的数据帧?
Pandas的文档提供了许多使用各种格式存储的最佳实践示例。
但是,我找不到用于处理像MySQL这样的数据库的任何好的示例。
谁能指向我链接或提供一些代码片段,说明如何使用mysql-python将查询结果有效地转换为Pandas中的数据帧?
Answers:
正如Wes所说,一旦使用DBI兼容库建立了数据库连接,io / sql的read_sql就可以完成。我们可以看两个使用MySQLdb
和cx_Oracle
库连接到Oracle和MySQL并查询其数据字典的简短示例。这是以下示例cx_Oracle
:
import pandas as pd
import cx_Oracle
ora_conn = cx_Oracle.connect('your_connection_string')
df_ora = pd.read_sql('select * from user_objects', con=ora_conn)
print 'loaded dataframe from Oracle. # Records: ', len(df_ora)
ora_conn.close()
这是等效的示例MySQLdb
:
import MySQLdb
mysql_cn= MySQLdb.connect(host='myhost',
port=3306,user='myusername', passwd='mypassword',
db='information_schema')
df_mysql = pd.read_sql('select * from VIEWS;', con=mysql_cn)
print 'loaded dataframe from MySQL. records:', len(df_mysql)
mysql_cn.close()
对于这个问题的新读者:熊猫在其版本14.0的文档中具有以下警告:
警告:一些现有功能或功能别名已被弃用,并将在以后的版本中删除。这包括:tquery,uquery,read_frame,frame_query,write_frame。
和:
警告:不建议使用DBAPI连接对象时支持'mysql'风格。SQLAlchemy引擎(GH6900)将进一步支持MySQL。
这使得这里的许多答案已经过时了。您应该使用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')
engine.execute("select * FROM mytable")
与花费的执行时间pd.read_sql_query('SELECT * FROM mytable', engine)
我更喜欢使用SQLAlchemy创建查询,然后从中创建一个DataFrame。如果您打算一遍又一遍地混合和匹配内容,SQLAlchemy可以更轻松地通过Python 组合SQL条件。
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)
dialect+driver://user:pwd@host:port/db
这就是您使用psycopg2驱动程序连接到PostgreSQL的方式(如果您在Debian Linux派生OS上,则使用“ apt-get install python-psycopg2”安装)。
import pandas.io.sql as psql
import psycopg2
conn = psycopg2.connect("dbname='datawarehouse' user='user1' host='localhost' password='uberdba'")
q = """select month_idx, sum(payment) from bi_some_table"""
df3 = psql.frame_query(q, conn)
对于Sybase,以下工作原理(使用http://python-sybase.sourceforge.net)
import pandas.io.sql as psql
import Sybase
df = psql.frame_query("<Query>", con=Sybase.connect("<dsn>", "<user>", "<pwd>"))
import pandas as pd
import oursql
conn=oursql.connect(host="localhost",user="me",passwd="mypassword",db="classicmodels")
sql="Select customerName, city,country from customers order by customerName,country,city"
df_mysql = pd.read_sql(sql,conn)
print df_mysql
可以正常工作,并使用pandas.io.sql frame_works(带有弃用警告)。使用的数据库是mysql教程中的示例数据库。
这应该很好。
import MySQLdb as mdb
import pandas as pd
con = mdb.connect(‘127.0.0.1’, ‘root’, ‘password’, ‘database_name’);
with con:
cur = con.cursor()
cur.execute(“select random_number_one, random_number_two, random_number_three from randomness.a_random_table”)
rows = cur.fetchall()
df = pd.DataFrame( [[ij for ij in i] for i in rows] )
df.rename(columns={0: ‘Random Number One’, 1: ‘Random Number Two’, 2: ‘Random Number Three’}, inplace=True);
print(df.head(20))
这对我帮助从基于python 3.x的lambda函数连接到AWS MYSQL(RDS)并加载到pandas DataFrame中
import json
import boto3
import pymysql
import pandas as pd
user = 'username'
password = 'XXXXXXX'
client = boto3.client('rds')
def lambda_handler(event, context):
conn = pymysql.connect(host='xxx.xxxxus-west-2.rds.amazonaws.com', port=3306, user=user, passwd=password, db='database name', connect_timeout=5)
df= pd.read_sql('select * from TableName limit 10',con=conn)
print(df)
# TODO implement
#return {
# 'statusCode': 200,
# 'df': df
#}
对于Postgres用户
import psycopg2
import pandas as pd
conn = psycopg2.connect("database='datawarehouse' user='user1' host='localhost' password='uberdba'")
customers = 'select * from customers'
customers_df = pd.read_sql(customers,conn)
customers_df