python-pandasとmysqlのようなデータベース


97

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

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

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




また、見とるブレイズを
osa 14

あなたがお金を使う用意があるなら、私はウェス・マッキーニーの本(「Python for Data Analysis」)にいくつかの有用な例があると思います。
MTrenfield 2014

回答:


102

Wesが言うように、DBI互換ライブラリを使用してデータベース接続を取得すると、io / sqlのread_sqlがそれを行います。MySQLdbおよびcx_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()

57

この質問の最近の読者の場合:パンダは、バージョン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)を使用してデータベースにクエリを実行すると、再利用がはるかに速くなります。「単に送信してから取得する」と言うとき、それはどういう意味ですか。(クライアントを使用して)
idoda 2014

@idoda実行にかかる時間と実行にかかる時間を比較engine.execute("select * FROM mytable")するpd.read_sql_query('SELECT * FROM mytable', engine)
Korem

sqlalchemyクエリ(以下の私の答えにあるようなsession.query)を直接pandasメソッドに渡すことはできますか?それはリッパーでしょう!
dmvianna 2015

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
機械式カタツムリ2013年

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ののデフォルト1dialect+driver://user:pwd@host:port/db
ヌーノ・アンドレ

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)代わりに使用してください。
ロバート・スミス

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

これは、Python 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 の答えの違いと、ソリューションを選択する理由を教えてください。
セバスチャン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.