python和mysql等数据库

python和mysql等数据库,python,pandas,Python,Pandas,Pandas的文档中有许多使用各种格式存储的数据的最佳实践示例 然而,我找不到任何好的例子来处理数据库,比如MySQL 有谁能给我指一下链接或给出一些代码片段,告诉我如何使用mysql python高效地将查询结果转换为Pandas中的数据帧吗?正如Wes所说,io/sql的read_sql可以做到这一点,只要您使用与DBI兼容的库建立了数据库连接。我们可以看两个使用MySQLdb和cx_-Oracle库连接到Oracle和MySQL并查询其数据字典的简短示例。以下是cx\U Oracle的示例

Pandas的文档中有许多使用各种格式存储的数据的最佳实践示例

然而,我找不到任何好的例子来处理数据库,比如MySQL


有谁能给我指一下链接或给出一些代码片段,告诉我如何使用mysql python高效地将查询结果转换为Pandas中的数据帧吗?

正如Wes所说,io/sql的read_sql可以做到这一点,只要您使用与DBI兼容的库建立了数据库连接。我们可以看两个使用
MySQLdb
cx_-Oracle
库连接到Oracle和MySQL并查询其数据字典的简短示例。以下是
cx\U 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()

同样的语法也适用于使用podbc的Ms SQL server

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,以下工作(带)

将pandas.io.sql导入为psql
导入Sybase
df=psql.frame\u查询(“,con=Sybase.connect(“,”,”))

对于记录,下面是一个使用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

这就是如何使用psycopg2驱动程序连接到PostgreSQL(如果您使用的是Debian Linux衍生操作系统,请使用“apt get install python-psycopg2”进行安装)

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)

我更喜欢使用创建查询,然后从中创建数据帧SQLAlchemy如果您打算反复混合和匹配事物,则可以更轻松地以pythonical方式组合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)

对于这一问题的近期读者:大熊猫的身体里有以下警告:

警告:某些现有函数或函数别名已被删除 已弃用,将在将来的版本中删除。这包括: tquery,uquery,read\u frame,frame\u query,write\u frame

以及:

警告:在使用DBAPI连接对象时,对“mysql”风格的支持已经失效 他被弃用了。SQLAlchemy将进一步支持MySQL 发动机(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')

pandas.io.sql.frame\u查询
已被弃用。使用熊猫。改为阅读sql。

导入模块 连接
这很好,使用pandas.io.sql frame_也很有效(带有弃用警告)。使用的数据库是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))

这有助于我从基于lambda函数的python 3.x连接到AWS MYSQL(RDS)并加载到数据帧中

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

您可以通过在
frame\u query
中指定
index\u col='timestamp'
来指定要用作索引的列。文档:另请参阅:也可以查看。如果您愿意花钱,我相信Wes McKinney的书(“用于数据分析的Python”)有一些有用的示例。加载一个包含133行和7列的表大约需要30秒。。你能给出一些关于为什么会这样的见解吗?@idoda[通常这不是问题的主题,最好问一个新问题,这样你会得到更多的意见]。你确定这不是请求延迟的问题吗?发送查询和检索结果的速度是否明显加快了?@Korem我确实想过打开一个新的查询,但我想首先确保它不是一个琐碎的查询。当我使用mySql客户端(Sequel pro)并查询数据库时,reuslts的运行速度要快得多。当你说“简单地发送然后检索”时,这就是你的意思吗?(使用客户端)@idoda我的意思是将执行
engine.execute(“select*FROM mytable”)
所需的时间与执行
pd.read\u sql\u query(“select*FROM mytable”,engine)
可以直接将sqlalchemy查询(session.query,如下面我的答案中所示)传递给pandas方法吗?那将是一个开膛手<代码>帧查询现在已不推荐使用。现在改用
pd.read\u sql(query,db)
。如果驱动程序与:
方言不同,还必须指定驱动程序+driver://user:pwd@主机:port/db
您能指出@Will的不同之处,以及为什么选择您的解决方案吗?
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
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))
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
    #}
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