像python大pandas和数据库
Pandas的文档中有许多关于处理以各种格式存储的数据的最佳实践的例子。
但是,我无法find任何与MySQL等数据库一起工作的好例子。
任何人都可以指向我的链接或给一些代码片段如何转换使用mysql-python的查询结果有效地在pandas数据框?
正如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()
对于这个问题的最近读者:大pandas在14.0版本的文档中有以下警告:
警告:某些现有的函数或函数别名已被弃用,并将在未来版本中删除。 这包括:tquery,uquery,read_frame,frame_query,write_frame。
和:
警告:使用DBAPI连接对象时对“mysql”风格的支持已被弃用。 MySQL将通过SQLAlchemy引擎(GH6900)进一步得到支持。
这使得许多答案已经过时。 你应该使用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')
为了logging,这里是一个使用sqlite数据库的例子:
import pandas as pd import sqlite3 with sqlite3.connect("whatever.sqlite") as con: sql = "SELECT * FROM table_name" df = pd.read_sql_query(sql, con) print df.shape
我更喜欢使用SQLAlchemy创build查询,然后从中创build一个DataFrame。 如果您打算反复混合和匹配, SQLAlchemy可以更轻松地组合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)
MySQL的例子:
import MySQLdb as db from pandas import DataFrame from pandas.io.sql import frame_query database = db.connect('localhost','username','password','database') data = frame_query("SELECT * FROM data", database)
同样的语法也适用于使用podbc的Ms SQL服务器。
import pyodbc import pandas.io.sql as psql cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=servername;DATABASE=mydb;UID=username;PWD=password') cursor = cnxn.cursor() sql = ("""select * from mytable""") df = psql.frame_query(sql, cnxn) cnxn.close()
对于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>"))
这就是你如何使用psycopg2驱动程序连接到PostgreSQL(如果你使用的是Debian Linux派生操作系统,请安装“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)
pandas.io.sql.frame_query
已被弃用。 改用pandas.read_sql
。
导入模块
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))