python-pandas 및 mysql과 같은 데이터베이스


97

Pandas 문서에는 다양한 형식으로 저장된 데이터 작업에 대한 모범 사례의 수많은 예가 있습니다.

그러나 예를 들어 MySQL과 같은 데이터베이스 작업에 대한 좋은 예를 찾을 수 없습니다.

누구든지 링크를 가리 키거나 mysql-python 을 사용하여 쿼리 결과를 Pandas의 데이터 프레임으로 효율적 으로 변환하는 방법에 대한 코드 스 니펫을 제공 할 수 있습니까?




Blaze도 살펴보세요 .
osa

돈을 쓰고 싶다면 Wes McKinney의 책 ( "Python for Data Analysis")에 몇 가지 유용한 예가 있다고 생각합니다.
MTrenfield 2014

답변:


102

Wes가 말했듯이 DBI 호환 라이브러리를 사용하여 데이터베이스 연결을 얻으면 io / sql의 read_sql이이를 수행합니다. Oracle 및 MySQL에 연결하고 데이터 사전을 쿼리하기 위해 MySQLdbcx_Oracle라이브러리를 사용하는 두 가지 간단한 예를 살펴볼 수 있습니다 . 다음은에 대한 예입니다 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()

57

이 질문의 최근 독자를 위해 : 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')

133 개의 행과 7 개의 열이있는 테이블을로드하는 데 약 30 초가 걸립니다. 그 이유에 대한 통찰력을 줄 수 있습니까?
idoda 2014 년

@idoda [일반적으로 이것은 질문의 주제가 아니며 더 많은 의견을 얻을 수 있도록 새로운 질문을하는 것이 좋습니다]. 이것이 요청 지연 문제가 아닌 것이 확실합니까? 단순히 쿼리를 보내고 결과를 훨씬 빠르게 검색합니까?
Korem 2014 년

@Korem 나는 새 것을 여는 것에 대해 생각했지만 먼저 그것이 사소한 것이 아닌지 확인하고 싶었습니다. mySql 클라이언트 (Sequel pro)를 사용하고 데이터베이스를 쿼리하면 reuslts가 훨씬 빠르게 나타납니다. "단순히 전송 후 검색"이라고하면 그게 무슨 뜻입니까? (클라이언트를 사용하여)
idoda

@idoda 실행 engine.execute("select * FROM mytable")하는 데 걸리는 시간과 실행하는 데 걸리는 시간을 비교하는 의미pd.read_sql_query('SELECT * FROM mytable', engine)
Korem

sqlalchemy 쿼리 (아래 답변에서와 같이 session.query)를 pandas 메서드에 직접 전달할 수 있습니까? 그것은 리퍼가 될 것입니다!
dmvianna

23

기록을 위해 다음은 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

1
당신은 지정하여 인덱스로 사용할 열을 지정할 수 있습니다 index_col='timestamp'frame_query.
기계 달팽이

19

SQLAlchemy 를 사용하여 쿼리 를 만든 다음 여기에서 DataFrame 을 만드는 것을 선호 합니다. SQLAlchemy를 사용하면 반복해서 혼합하고 일치시키려는 경우 SQL 조건을 Python 방식으로 쉽게 결합 할 수 있습니다.

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)

또한 SQLAlchemy의 기본 드라이버와 동일하지 않은 경우 드라이버를 지정해야합니다 .dialect+driver://user:pwd@host:port/db
Nuno André

11

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)

7
frame_query이제 더 이상 사용되지 않습니다. 이제 pd.read_sql(query, db)대신 사용하십시오.
Robert Smith

8

동일한 구문이 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()

5

그리고 이것이 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)


4

pandas.io.sql.frame_query더 이상 사용되지 않습니다. pandas.read_sql대신 사용하십시오 .


1

모듈 가져 오기

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 튜토리얼의 샘플 데이터베이스입니다.


0

이것은 잘 작동합니다.

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

0

이것은 파이썬 3.x 기반 람다 함수 에서 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
    #}

0

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

1
@Will 의 답변 에 대한 차이점 과 솔루션을 선택해야하는 이유 를 지적 해 주 시겠습니까?
Sebastian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.