পাইথন-পান্ডা এবং মাইএসকিএলের মতো ডেটাবেস


97

পান্ডাদের ডকুমেন্টেশনে বিভিন্ন ফরম্যাটে সঞ্চিত ডেটা নিয়ে কাজ করার জন্য সেরা অনুশীলনের উদাহরণ রয়েছে।

যাইহোক, উদাহরণস্বরূপ, মাইএসকিউএল এর মতো ডেটাবেসগুলির সাথে কাজ করার জন্য আমি কোনও ভাল উদাহরণ পেতে অক্ষম।

কেউ কী আমাকে লিঙ্কগুলিতে নির্দেশ করতে পারেন বা মাইএসকিএল-পাইথন ব্যবহার করে কোয়ালিটির ফলাফলগুলি কীভাবে পান্ডসে ডেটা ফ্রেমে দক্ষতার সাথে রূপান্তর করবেন সে সম্পর্কে কিছু কোড স্নিপেট দিতে পারেন?





আপনি যদি অর্থ ব্যয় করতে রাজি হন তবে আমি বিশ্বাস করি যে ওয়েস ম্যাককিনির বইটিতে ("পাইথন ফর ডেটা অ্যানালাইসিস") এর কিছু দরকারী উদাহরণ রয়েছে।
এমট্রেইনফিল্ড

উত্তর:


102

ওয়েস যেমন বলেছে, আইও / এসকিউএল এর রিড_ এসকিউএল এটি করবে, একবার আপনি কোনও ডিবিআই সুসংগত লাইব্রেরি ব্যবহার করে একটি ডাটাবেস সংযোগ পেয়েছেন। ওরাকল এবং মাইএসকিউএল-এ সংযোগ স্থাপনের জন্য 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()

57

এই প্রশ্নের সাম্প্রতিক পাঠকদের জন্য: পান্ডাদের 14.0 সংস্করণে ডক্সে নিম্নলিখিত সতর্কতা রয়েছে :

সতর্কতা: বিদ্যমান কিছু ফাংশন বা ফাংশন অ্যালিয়াসগুলি হ্রাস করা হয়েছে এবং ভবিষ্যতের সংস্করণগুলিতে সরানো হবে। এর মধ্যে রয়েছে: tquery, uquery, read_frame, ফ্রেম_কোয়ারি, লেখার_ ফ্রেম।

এবং:

সতর্কতা: ডিবিএপিআই কানেকশন অবজেক্ট ব্যবহার করার সময় 'মাইএসকিএল' গন্ধের জন্য সমর্থন হ্রাস করা হয়েছে। মাইএসকিউএল আরও এসকিউএএলএলএলচেমি ইঞ্জিনগুলি (জিএইচ 6900) দ্বারা সমর্থিত হবে।

এটি এখানে অনেক উত্তর পুরানো করে তোলে। আপনার ব্যবহার করা উচিত 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')

১৩৩ টি সারি এবং col টি কলাম সহ একটি টেবিল লোড করতে প্রায় 30 সেকেন্ড সময় লাগে .. আপনি কেন কিছুটা অন্তর্দৃষ্টি দিতে পারেন তা কেন?
ইডোদা

@ আইডোদা [সাধারণভাবে এটি প্রশ্নের বিষয় নয় এবং একটি নতুন প্রশ্ন জিজ্ঞাসা করা ভাল তবে আপনি আরও মতামত পেতে চান]। আপনি কি নিশ্চিত যে এটি অনুরোধের বিলম্বের বিষয় নয়? সহজেই ক্যোয়ারী প্রেরণ এবং ফলাফলগুলি দ্রুততরভাবে পুনরুদ্ধার করা হচ্ছে?
কোরেম

@ কোরেম আমি একটি নতুন খোলার বিষয়ে ভেবেছিলাম, তবে আমি এটি নিশ্চিত করতে চেয়েছিলাম যে এটি প্রথমে তুচ্ছ নয়। আমি যখন একটি মাইএসকিএল ক্লায়েন্ট (সিকুয়েল প্রো) ব্যবহার করি এবং ডেটাবেসকে কোয়েরি করি তখন পুনরায় সংযুক্তি আরও দ্রুত চলে আসে। যখন আপনি "কেবল প্রেরণ এবং তারপরে পুনরুদ্ধার করা" বলছেন, আপনি কি বোঝাতে চাইছেন? (ক্লায়েন্ট ব্যবহার করে)
ইডোদা

@ আইডোদা বলতে আমার বোঝানো হয়েছে যে মৃত্যুদন্ড কার্যকর engine.execute("select * FROM mytable")করতে যে সময় লাগে তার সাথে তুলনা করাpd.read_sql_query('SELECT * FROM mytable', engine)
কোরেম

কেউ কী কোনও স্ক্যান্ডালমি কেরি (নীচে আমার উত্তর হিসাবে সেশন.কোয়ারি) সরাসরি একটি পান্ডাস পদ্ধতিতে পাস করতে পারেন? ওটাই হবে রিপার!
dmvianna

23

রেকর্ডের জন্য, এখানে স্ক্লাইট ডাটাবেস ব্যবহার করে একটি উদাহরণ দেওয়া হয়েছে:

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

4
আপনি নির্দিষ্ট করে একটি সূচক হিসাবে ব্যবহার করার জন্য কলাম নির্দিষ্ট করতে পারেন index_col='timestamp'মধ্যে frame_query
যান্ত্রিক শামুক

19

আমি এসকিউএএলএলচেমির সাথে ক্যোয়ারী তৈরি করতে পছন্দ করি এবং তারপরে এটি থেকে ডেটাফ্রেম তৈরি করি। এসকিউএলএলচেমি এসকিউএল অবস্থার সাথে পাইথোনিকভাবে একত্রিত করা সহজ করে তোলে যদি আপনি বারবার জিনিসগুলিকে মিশ্রিত করতে এবং মিলাতে চান।

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)

এছাড়াও আপনাকে ড্রাইভার অবশ্যই উল্লেখ করতে হবে যদি এটি এসকিউএলএলচেমির ডিফল্ট একের মতো না হয় :dialect+driver://user:pwd@host:port/db
নুনো আন্দ্রে

11

মাইএসকিউএল উদাহরণ:

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

একই সিনট্যাক্সটি এমডিসি এসকিউএল সার্ভারের জন্য পডবিসি ব্যবহার করেও কাজ করে।

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

এবং এভাবেই আপনি সাইকোপজি 2 ড্রাইভার ব্যবহার করে পোস্টগ্র্রেএসকিউএলে সংযুক্ত হন (আপনি ডেবিয়ান লিনাক্স ডেরিভেটিভ ওএস এ থাকলে "অ্যাপট-গেট ইনস্টল পাইথন-সাইকোকজি 2" দিয়ে ইনস্টল করুন)।

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 ফ্রেমওয়ার্কগুলি ব্যবহার করে (অবমূল্যায়নের সতর্কতা সহ)। ব্যবহৃত ডেটাবেস হ'ল মাইএসকিএল টিউটোরিয়াল থেকে প্রাপ্ত নমুনা ডাটাবেস।


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

পাইথন ৩.x ভিত্তিক ল্যাম্বডা ফাংশন থেকে অ্যাডাব্লুএস এমওয়াইএসকিউএল (আরডিএস) এর সাথে সংযোগ স্থাপন এবং একটি পান্ডাস ডেটা ফ্রেমে লোড করার জন্য এটি আমার জন্য সহায়তা করেছিল

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

4
আপনি @ উইলের উত্তরের মধ্যে পার্থক্যটি চিহ্নিত করতে পারেন এবং কেন আপনার সমাধানটি বেছে নেওয়া উচিত?
সেবাস্তিয়ান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.