Pandas 문서에는 다양한 형식으로 저장된 데이터 작업에 대한 모범 사례의 수많은 예가 있습니다.
그러나 예를 들어 MySQL과 같은 데이터베이스 작업에 대한 좋은 예를 찾을 수 없습니다.
누구든지 링크를 가리 키거나 mysql-python 을 사용하여 쿼리 결과를 Pandas의 데이터 프레임으로 효율적 으로 변환하는 방법에 대한 코드 스 니펫을 제공 할 수 있습니까?
답변
Wes가 말했듯이 DBI 호환 라이브러리를 사용하여 데이터베이스 연결을 얻으면 io / sql의 read_sql이이를 수행합니다. Oracle 및 MySQL에 연결하고 데이터 사전을 쿼리하기 위해 MySQLdb
및 cx_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()
답변
이 질문의 최근 독자를 위해 : 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')
답변
기록을 위해 다음은 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 를 사용하여 쿼리 를 만든 다음 여기에서 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)
답변
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()
답변
그리고 이것이 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)