python-pandalar ve mysql gibi veritabanları


97

Pandalar için dokümantasyon, çeşitli formatlarda depolanan verilerle çalışmak için çok sayıda en iyi uygulama örneğini içerir.

Ancak, örneğin MySQL gibi veritabanları ile çalışmak için iyi örnekler bulamıyorum.

Herhangi biri beni bağlantılara yönlendirebilir veya mysql-python kullanarak sorgu sonuçlarının Pandalar'daki veri çerçevelerine nasıl verimli bir şekilde dönüştürüleceğine dair bazı kod parçacıkları verebilir mi?




Ayrıca bir göz atın Blaze .
osa

Para harcamayı düşünüyorsanız, Wes McKinney'nin kitabının ("Veri Analizi için Python") bazı yararlı örnekleri olduğuna inanıyorum.
MTrenfield

Yanıtlar:


102

Wes'in dediği gibi, DBI uyumlu bir kitaplık kullanarak bir veritabanı bağlantısı kurduğunuzda io / sql's read_sql bunu yapacaktır. Oracle ve MySQL'e bağlanmak ve veri sözlüklerini sorgulamak için MySQLdbve cx_Oraclekitaplıklarını kullanarak iki kısa örneğe bakabiliriz . İşte örnek 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()

Ve işte eşdeğer örnek 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

Bu sorunun son okuyucuları için: Pandaların, 14.0 sürümü için belgelerinde şu uyarı var :

Uyarı: Mevcut işlevlerden veya işlev takma adlarından bazıları kullanımdan kaldırıldı ve sonraki sürümlerde kaldırılacak. Bu, şunları içerir: tquery, uquery, read_frame, frame_query, write_frame.

Ve:

Uyarı: DBAPI bağlantı nesneleri kullanılırken 'mysql' çeşidi desteği kullanımdan kaldırıldı. MySQL ayrıca SQLAlchemy motorları (GH6900) ile desteklenecektir.

Bu, buradaki yanıtların çoğunu modası geçmiş hale getirir. Kullanmalısınız 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 satır ve 7 sütunlu bir tablonun yüklenmesi yaklaşık 30 saniye sürer .. Bunun neden olduğuna dair biraz fikir verebilir misiniz?
idoda

@idoda [genel olarak bu sorunun konusu değildir ve yeni bir soru sormak daha iyidir, böylece daha fazla fikir edinebilirsiniz]. Bunun bir istek gecikmesi meselesi olmadığından emin misiniz? Sadece sorguyu göndermek ve sonuçları almak önemli ölçüde daha hızlı mı?
Korem

@Korem Yeni bir tane açmayı düşünmüştüm ama önce bunun önemsiz olmadığından emin olmak istedim. Bir mySql istemcisi (Sequel pro) kullandığımda ve veritabanını sorguladığımda, yeniden kullanmalar çok daha hızlı geliyor. "Basitçe gönder ve sonra geri al" derken kastettiğin bu mu? (müşteri kullanarak)
idoda

@idoda Çalıştırmak için geçen süre ile yürütmek engine.execute("select * FROM mytable")için geçen süreyi karşılaştırmaktan pd.read_sql_query('SELECT * FROM mytable', engine)
bahsediyorum

Bir sqlalchemy sorgusu (aşağıdaki cevabımdaki gibi session.query) doğrudan pandalar yöntemine geçirilebilir mi? Bu bir yırtıcı olurdu!
dmvianna

23

Kayıt için, sqlite veritabanı kullanan bir örnek:

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
Sen belirterek bir endeks olarak kullanımına sütunu belirtebilirsiniz index_col='timestamp'içinde frame_query.
Mekanik salyangoz

19

SQLAlchemy ile sorgular oluşturmayı ve ondan bir DataFrame yapmayı tercih ediyorum . SQLAlchemy , her şeyi tekrar tekrar karıştırmak ve eşleştirmek istiyorsanız SQL koşullarını Python olarak birleştirmeyi kolaylaştırır .

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)

Ayrıca, sürücüyü SQLAlchemy'nin varsayılan sürücüyle aynı değilse de belirtmelisiniz :dialect+driver://user:pwd@host:port/db
Nuno André

11

MySQL örneği:

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_queryartık kullanımdan kaldırıldı. Şimdi pd.read_sql(query, db)bunun yerine kullanın.
Robert Smith

8

Aynı sözdizimi podbc kullanan Ms SQL sunucusu için de geçerlidir.

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

Ve psycopg2 sürücüsünü kullanarak PostgreSQL'e bu şekilde bağlanırsınız (Debian Linux türevi işletim sistemi üzerindeyseniz "apt-get install python-psycopg2" ile kurun).

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_querykullanımdan kaldırıldı. pandas.read_sqlBunun yerine kullanın .


1

modülü içe aktar

import pandas as pd
import oursql

bağlanmak

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

Bu gayet iyi çalışıyor ve pandas.io.sql frame_works (kullanımdan kaldırma uyarısıyla) kullanıyor. Kullanılan veritabanı mysql öğreticisinden örnek veritabanıdır.


0

Bu gayet iyi çalışmalı.

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

Bu , python 3.x tabanlı lambda işlevinden AWS MYSQL'e (RDS) bağlanıp bir pandas DataFrame'e yüklenmeme yardımcı oldu

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 kullanıcıları için

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
Eğer farkı işaret Could cevap @Will ve neden çözüm seçilmeli?
Sebastian
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.