97

Pandas のドキュメントには、さまざまな形式で保存されたデータを操作するためのベスト プラクティスの例が数多くあります。

ただし、たとえば MySQL などのデータベースを操作するための良い例を見つけることができません。

mysql-pythonを使用してクエリ結果を Pandas のデータ フレームに効率的に変換する方法のリンクを示したり、コード スニペットを提供したりできますか?

4

13 に答える 13

102

Wes が言うように、DBI 互換ライブラリを使用してデータベース接続を取得すると、io/sql の read_sql がそれを行います。MySQLdbcx_Oracleライブラリを使用して Oracle と MySQL に接続し、それらのデータ ディクショナリにクエリを実行する2 つの短い例を見ることができます。の例を次に示し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()
于 2012-06-21T12:34:29.960 に答える
58

この質問の最近の読者向け: 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')
于 2014-07-30T07:04:38.090 に答える
23

For the record, here is an example using a sqlite database:

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
于 2013-02-26T18:58:37.440 に答える
21

私は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)
于 2014-04-28T03:08:09.287 に答える
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)
于 2014-01-21T14:03:07.133 に答える
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()
于 2012-10-11T07:18:29.813 に答える
6

そして、これが 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)
于 2013-09-11T22:30:42.640 に答える
4

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>"))
于 2013-01-09T22:36:02.513 に答える