কীভাবে এসকিউএল ক্যোয়ারী ফলাফলকে পান্ডাস ডেটা স্ট্রাকচারে রূপান্তর করবেন?


116

এই সমস্যা সম্পর্কে যে কোনও সহায়তা প্রশংসিত হবে।

সুতরাং মূলত আমি আমার এসকিউএল ডাটাবেজে একটি ক্যোয়ারী চালাতে এবং ফিরে আসা ডেটাটিকে পান্ডাস ডেটা স্ট্রাকচার হিসাবে সঞ্চয় করতে চাই।

আমি জিজ্ঞাসা জন্য কোড সংযুক্ত আছে।

আমি পান্ডসে ডকুমেন্টেশন পড়ছি, তবে আমার ক্যোয়ারির রিটার্নের ধরণটি সনাক্ত করতে আমার সমস্যা আছে।

আমি ক্যোয়ারির ফলাফল মুদ্রণের চেষ্টা করেছি, তবে এটি কোনও কার্যকর তথ্য দেয় না।

ধন্যবাদ !!!!

from sqlalchemy import create_engine

engine2 = create_engine('mysql://THE DATABASE I AM ACCESSING')
connection2 = engine2.connect()
dataid = 1022
resoverall = connection2.execute("
  SELECT 
      sum(BLABLA) AS BLA,
      sum(BLABLABLA2) AS BLABLABLA2,
      sum(SOME_INT) AS SOME_INT,
      sum(SOME_INT2) AS SOME_INT2,
      100*sum(SOME_INT2)/sum(SOME_INT) AS ctr,
      sum(SOME_INT2)/sum(SOME_INT) AS cpc
   FROM daily_report_cooked
   WHERE campaign_id = '%s'", %dataid)

সুতরাং আমি বাছাই করতে চাই আমার ভেরিয়েবল "রিসোভারল" এর ফর্ম্যাট / ডেটাটাইপ কী এবং এটি কীভাবে প্যান্ডাস ডেটা স্ট্রাকচারের সাহায্যে রাখা যায়।


মূলত, "রিসোভারল" ভেরিয়েবলের কাঠামো / ধরণ কী এবং কীভাবে এটি পান্ডাস ডেটা স্ট্রাকচারে রূপান্তর করা যায়।
ব্যবহারকারী 1613017

পান্ডাস বেশ আকর্ষণীয় শোনায়, আমি এর আগে শুনিনি, তবে এই প্রশ্নটি খুব সার্থক করে তোলে। "কোনও দরকারী তথ্য দেয় না" এর অর্থ আপনি কী বোঝাতে চেয়েছেন এবং স্পষ্ট করে বলতে পারেন?
tadman

1
কারণ আমি যে ক্যোয়ারীটি সম্পাদন করেছি তা একটি রিটার্ন দেয়, কেবল কীভাবে এই রিটার্নটি আমি হেরফের করব এবং এটিকে একটি পান্ডাস ডেটা কাঠামোতে পরিণত করব তা ভাবছি। আমি অজগর থেকে খুব নতুন এবং তাই খুব বেশি জ্ঞান নেই, যেমন আমরা পিএইচপিতে যা করি কেবলমাত্র একটি স্কেল_ফেট_আরে করা হয় এবং আমাদের কাছে "ব্যবহারযোগ্য" ডেটা থাকে। =)
ব্যবহারকারী 1613017

উত্তর:


120

এখানে কাজটি করবে এমন সংক্ষিপ্ততম কোড:

from pandas import DataFrame
df = DataFrame(resoverall.fetchall())
df.columns = resoverall.keys()

আপনি ফ্যানসিয়ারে যেতে পারেন এবং পৌলের উত্তরের মতো ধরণের পার্স করতে পারেন।


1
এটি ওরাকল ডাটাবেস থেকে 1.000.000 রেকর্ডের জন্য আমার পক্ষে কাজ করেছে।
এরডেম কেএ

8
df = DataFrame(cursor.fetchall())প্রত্যাবর্তন ValueError: DataFrame constructor not properly called!, এটি উপস্থিত হয় যে tuples এর tuple DataFrame নির্মাণকারীর জন্য গ্রহণযোগ্য নয়। .keys()অভিধান বা টিউপল মোডে কার্সারেও নেই ।
মোবিজিটাল

3
কেবলমাত্র নোট করুন যে কী পদ্ধতিটি কেবল স্ক্ল্যাচলেমি ব্যবহার করে প্রাপ্ত ফলাফলগুলির সাথে কাজ করবে। পিওডবিসি কলামগুলির জন্য বর্ণন বৈশিষ্ট্যটি ব্যবহার করে।
ফিলিপ

এই পোস্টগ্রিস ডাটাবেসের জন্য কাজ করতে পারে? আমি keys()ফাংশন সহ ফলাফল ডেটা ফ্রেমের কলামের নামগুলি পাওয়ার চেষ্টা করছি তবে এটি কাজ করতে পারছে না।
বোভেন লিউ

1
@ বোভেনলিউ হ্যাঁ, আপনি সাইকোপজি 2df.columns=[ x.name for x in recoverall.description ]
জ্নুদিফ

136

সম্পাদনা করুন: মার্চ 2015

নীচে উল্লিখিত হিসাবে, পান্ডাস এখন স্কুএলএলকেমি ব্যবহার করে ( পঠন-এসকিউএল ) উভয়ই পড়ুন এবং একটি ডাটাবেসে ( to_sql ) প্রবেশ করান । নিম্নলিখিত কাজ করা উচিত

import pandas as pd

df = pd.read_sql(sql, cnxn)

পূর্ববর্তী উত্তর: মাইকেবমাসে একটি অনুরূপ প্রশ্ন থেকে

import pyodbc
import pandas.io.sql as psql

cnxn = pyodbc.connect(connection_info) 
cursor = cnxn.cursor()
sql = "SELECT * FROM TABLE"

df = psql.frame_query(sql, cnxn)
cnxn.close()

এটি এটি করার সর্বোত্তম উপায় বলে মনে হচ্ছে, কারণ কলাম সূচকটি পেতে আপনাকে ম্যানুয়ালি .keys () ব্যবহার করতে হবে না। সম্ভবত এই পদ্ধতিটি বিদ্যমান থাকার আগে ড্যানিয়েলের উত্তর লেখা হয়েছিল। আপনি pandas.io.sql.read_frame ()
রবিনএল

1
@ ওপেনওয়ংক কোথায় pd.read_sql()উপরের কোড স্নিপেটে প্রয়োগ করবে ?
3kstc

আসলে, আমার শেষ প্রতিক্রিয়া থেকে, আমি বেশ কিছুটা ব্যবহার করেছি pyodbcএবং pandasএকসাথে করেছি । উদাহরণ সহ নতুন উত্তর যুক্ত করা হচ্ছে, এফওয়াইআই।
ওপেনভাক

33

আপনি যদি এক্সপ্রেশন ভাষার পরিবর্তে এসকিএএলএলচেমির ওআরএম ব্যবহার করে থাকেন তবে আপনি নিজের মতো করে কোনও বস্তুকে sqlalchemy.orm.query.Queryপান্ডা ডেটা ফ্রেমে রূপান্তর করতে চাইছেন ।

সবচেয়ে পরিষ্কার পদ্ধতির হ'ল উত্সাহিত এসকিউএলকে ক্যোয়ারীর বিবৃতি বৈশিষ্ট্য থেকে পাওয়া এবং তারপরে এটি পান্ডাসের read_sql()পদ্ধতিতে চালিত করা । উদাহরণস্বরূপ, কোয়েরি অবজেক্ট নামে শুরু করে query:

df = pd.read_sql(query.statement, query.session.bind)

5
আরও দক্ষ পন্থা হ'ল স্ক্লাচেমির কাছ থেকে বিবৃতিটি পাওয়া এবং পান্ডাসকে তার সাথে pandas.read_sql_queryপাস করে query.statementজিজ্ঞাসাটি করা উচিত। : এই উত্তর দেখার stackoverflow.com/a/29528804/1273938
LeoRochael

ধন্যবাদ @ লিওরোচেল! আমি আমার উত্তর সম্পাদনা করেছি। অবশ্যই ক্লিনার!
নাথান গোল্ড

23

2014-09-30 সম্পাদনা করুন:

পান্ডসের এখন একটি read_sqlফাংশন রয়েছে। আপনি অবশ্যই এর পরিবর্তে এটি ব্যবহার করতে চান।

আসল উত্তর:

আমি আপনাকে এসকিউএএলএলকেমি সাহায্য করতে পারি না - আমি সর্বদা পাইডবিসি, মাইএসকিউএলডিবি, বা সাইকোপজি 2 প্রয়োজন হিসাবে ব্যবহার করি। তবে এটি করার সময়, নীচের মত একটি সাধারণ ক্রিয়াকলাপটি আমার প্রয়োজন অনুসারে চলে:

import decimal

import pydobc
import numpy as np
import pandas

cnn, cur = myConnectToDBfunction()
cmd = "SELECT * FROM myTable"
cur.execute(cmd)
dataframe = __processCursor(cur, dataframe=True)

def __processCursor(cur, dataframe=False, index=None):
    '''
    Processes a database cursor with data on it into either
    a structured numpy array or a pandas dataframe.

    input:
    cur - a pyodbc cursor that has just received data
    dataframe - bool. if false, a numpy record array is returned
                if true, return a pandas dataframe
    index - list of column(s) to use as index in a pandas dataframe
    '''
    datatypes = []
    colinfo = cur.description
    for col in colinfo:
        if col[1] == unicode:
            datatypes.append((col[0], 'U%d' % col[3]))
        elif col[1] == str:
            datatypes.append((col[0], 'S%d' % col[3]))
        elif col[1] in [float, decimal.Decimal]:
            datatypes.append((col[0], 'f4'))
        elif col[1] == datetime.datetime:
            datatypes.append((col[0], 'O4'))
        elif col[1] == int:
            datatypes.append((col[0], 'i4'))

    data = []
    for row in cur:
        data.append(tuple(row))

    array = np.array(data, dtype=datatypes)
    if dataframe:
        output = pandas.DataFrame.from_records(array)

        if index is not None:
            output = output.set_index(index)

    else:
        output = array

    return output

আমি মনে করি আপনি শীর্ষে কোথাও দশমিক आयात করতে হবে?
joefromct

@ জোফ্র্যাম্ট সম্ভবত, তবে এই উত্তরটি এতটাই অপ্রচলিত আমার আসলেই পুরো জিনিসটি আঘাত করা উচিত এবং পান্ডাসের পদ্ধতিগুলি দেখানো উচিত।
পল এইচ

এটি কারও কারও কাছে আপত্তিজনক হতে পারে ... কারণ আমি এটি অধ্যয়ন করার কারণটি ছিল আমার অন্যান্য ইস্যুতে, পড়া_এসকিউএল () এখানে
স্ট্যাকওভারফ্লো

যারা এসকিউএএলএলকেমি ব্যবহার করতে পারবেন না যা সমস্ত ডেটাবেস সমর্থন করে না তাদের জন্য এটি প্রাসঙ্গিক।
ল্যামিকিকল

@ ল্যালমিক্যাল কিছুটা দ্বিমত পোষণ করুন। আইআইআরসি, read_sqlতবুও, পাইডবিসি, সাইকোপিজ ২ ইত্যাদি ইত্যাদির মাধ্যমে নন-এসকিউএএইচএলএলএকমি সংযোগ গ্রহণ করতে পারে
পল এইচ

16

মাইএসকিউএল সংযোগকারী

যারা মাইএসকিএল সংযোগকারীটির সাথে কাজ করে তাদের জন্য আপনি এই কোডটি একটি স্টার্ট হিসাবে ব্যবহার করতে পারেন। (@ ড্যানিয়েল ভেলকভকে ধন্যবাদ)

ব্যবহৃত রেফ:


import pandas as pd
import mysql.connector

# Setup MySQL connection
db = mysql.connector.connect(
    host="<IP>",              # your host, usually localhost
    user="<USER>",            # your username
    password="<PASS>",        # your password
    database="<DATABASE>"     # name of the data base
)   

# You must create a Cursor object. It will let you execute all the queries you need
cur = db.cursor()

# Use all the SQL you like
cur.execute("SELECT * FROM <TABLE>")

# Put it all to a data frame
sql_data = pd.DataFrame(cur.fetchall())
sql_data.columns = cur.column_names

# Close the session
db.close()

# Show the data
print(sql_data.head())

9

আমি যে কোডটি ব্যবহার করি তা এখানে। আশাকরি এটা সাহায্য করবে.

import pandas as pd
from sqlalchemy import create_engine

def getData():
  # Parameters
  ServerName = "my_server"
  Database = "my_db"
  UserPwd = "user:pwd"
  Driver = "driver=SQL Server Native Client 11.0"

  # Create the connection
  engine = create_engine('mssql+pyodbc://' + UserPwd + '@' + ServerName + '/' + Database + "?" + Driver)

  sql = "select * from mytable"
  df = pd.read_sql(sql, engine)
  return df

df2 = getData()
print(df2)

9

এটি আপনার সমস্যার একটি সংক্ষিপ্ত এবং খাস্তা উত্তর:

from __future__ import print_function
import MySQLdb
import numpy as np
import pandas as pd
import xlrd

# Connecting to MySQL Database
connection = MySQLdb.connect(
             host="hostname",
             port=0000,
             user="userID",
             passwd="password",
             db="table_documents",
             charset='utf8'
           )
print(connection)
#getting data from database into a dataframe
sql_for_df = 'select * from tabledata'
df_from_database = pd.read_sql(sql_for_df , connection)

8

1. মাইএসকিউএল-সংযোজক-পাইথন ব্যবহার করে

# pip install mysql-connector-python

import mysql.connector
import pandas as pd

mydb = mysql.connector.connect(
    host = 'host',
    user = 'username',
    passwd = 'pass',
    database = 'db_name'
)
query = 'select * from table_name'
df = pd.read_sql(query, con = mydb)
print(df)

2. এসকিউএলএলকেমি ব্যবহার করা Using

# pip install pymysql
# pip install sqlalchemy

import pandas as pd
import sqlalchemy

engine = sqlalchemy.create_engine('mysql+pymysql://username:password@localhost:3306/db_name')

query = '''
select * from table_name
'''
df = pd.read_sql_query(query, engine)
print(df)

সহজ এবং দুর্দান্ত উত্তর!
লুকাস আইমারেটো

5

নাথনের মতো, আমি প্রায়শই স্ক্যালকেমি বা স্ক্যালসপ কোয়েরির ফলাফলগুলি পান্ডসের ডেটা ফ্রেমে ফেলে দিতে চাই। এর জন্য আমার নিজস্ব সমাধানটি হ'ল:

query = session.query(tbl.Field1, tbl.Field2)
DataFrame(query.all(), columns=[column['name'] for column in query.column_descriptions])

1
আপনার যদি কোনও কোয়েরি অবজেক্ট থাকে। এটা তোলে sqlalchemy থেকে বিবৃতি পেতে এবং পান্ডাস সঙ্গে ক্যোয়ারী নিজেই না দেওয়া আরো কার্যকর pandas.read_sql_query, ক্ষণস্থায়ী query.statementএটি। : এই উত্তর দেখার stackoverflow.com/a/29528804/1273938
LeoRochael

4

resoverallএকটি স্কেলচেমি রেজাল্টপ্রক্সি অবজেক্ট। স্ক্যাল্কেমি ডক্সে আপনি এটি সম্পর্কে আরও পড়তে পারেন , পরেরটি ইঞ্জিন এবং সংযোগগুলির সাথে কাজ করার প্রাথমিক ব্যবহার ব্যাখ্যা করে। এখানে গুরুত্বপূর্ণ resoverallহ'ল ডিকের মতো।

পান্ডস তার ডাটা স্ট্রাকচার তৈরি করতে অবজেক্টের মতো ডিক পছন্দ করেন, অনলাইন ডক্স দেখুন

স্কালচেমি এবং পান্ডাসের জন্য শুভকামনা।


4

কেবল pandasএবং pyodbcএকসাথে ব্যবহার । connstrআপনাকে আপনার ডাটাবেসের স্পেসিফিকেশন অনুসারে আপনার সংযোগের স্ট্রিং ( ) সংশোধন করতে হবে ।

import pyodbc
import pandas as pd

# MSSQL Connection String Example
connstr = "Server=myServerAddress;Database=myDB;User Id=myUsername;Password=myPass;"

# Query Database and Create DataFrame Using Results
df = pd.read_sql("select * from myTable", pyodbc.connect(connstr))

আমি pyodbcবেশ কয়েকটি এন্টারপ্রাইজ ডাটাবেস ব্যবহার করেছি (যেমন এসকিউএল সার্ভার, মাইএসকিউএল, মারিয়াডিবি, আইবিএম)।


পিওডবিসি ব্যবহার করে এই এমএসএসকিউলে আবার কীভাবে এই ডেটাফ্রেমটি লিখবেন? স্কলারচেমি ব্যবহার করে অন্যরকম
রামসে

অবজেক্টে to_sqlপদ্ধতিটি ব্যবহার করুন DataFrame। এই পদ্ধতিটি এসকিউএলাইটের ডিফল্ট, সুতরাং আপনাকে এটি স্পষ্টভাবে এমএসএসকিউএল ডাটাবেসকে নির্দেশ করে কোনও বস্তুটি পাস করতে হবে। দস্তাবেজগুলি দেখুন ।
ওপেনওনক

আমি নীচের একটিকে চেষ্টা করেছি এবং আমার 13 টি কলাম সহ প্রায় 200 ক সারি রয়েছে। এটি 15 মিনিটের পরেও শেষ হয় না। কোন ধারনা? df.to_sql ('টেবিলের নাম', ইঞ্জিন, স্কিমা = 'স্কিমনাম', if_exists = 'অ্যাপেন্ড', সূচক = মিথ্যা)
রামসে

এটি ধীর বলে মনে হচ্ছে ... দুঃখিত, আমার সম্ভবত পুরো কোডটি ক্রিয়াকলাপে দেখা দরকার, দুঃখিত। আমি আশা করি pandasহালকা ইটিএল কাজের জন্য আরও অনুকূলিত হয়েছিল, তবে হায় ...
ওপেনওনক

3

এই প্রশ্নটি পুরানো, তবে আমি আমার দ্বি-সেন্ট যুক্ত করতে চেয়েছিলাম। আমি এই প্রশ্নটি পড়লাম "আমি আমার [আমার] এসকিউএল ডাটাবেসে একটি ক্যোয়ারী চালাতে চাই এবং ফিরে আসা ডেটাগুলিকে পান্ডাস ডেটা স্ট্রাকচার [ডেটাফ্রেম] হিসাবে সঞ্চয় করতে চাই।"

কোড থেকে দেখে মনে হচ্ছে আপনি মাইএসকিএল ডাটাবেস বোঝাচ্ছেন এবং ধরে নিচ্ছেন আপনি পান্ডাস ডেটাফ্রেম বোঝাচ্ছেন।

import MySQLdb as mdb
import pandas.io.sql as sql
from pandas import *

conn = mdb.connect('<server>','<user>','<pass>','<db>');
df = sql.read_frame('<query>', conn)

উদাহরণ স্বরূপ,

conn = mdb.connect('localhost','myname','mypass','testdb');
df = sql.read_frame('select * from testTable', conn)

এটি টেস্টেবলের সমস্ত সারি একটি ডেটাফ্রেমে আমদানি করবে।


1

আমারটা এখানে. সেক্ষেত্রে যদি আপনি "পিমিস্কল" ব্যবহার করেন:

import pymysql
from pandas import DataFrame

host   = 'localhost'
port   = 3306
user   = 'yourUserName'
passwd = 'yourPassword'
db     = 'yourDatabase'

cnx    = pymysql.connect(host=host, port=port, user=user, passwd=passwd, db=db)
cur    = cnx.cursor()

query  = """ SELECT * FROM yourTable LIMIT 10"""
cur.execute(query)

field_names = [i[0] for i in cur.description]
get_data = [xx for xx in cur]

cur.close()
cnx.close()

df = DataFrame(get_data)
df.columns = field_names

1

pandas.io.sql.write_frame প্রেরিত https://pandas.pydata.org/pandas-docs/version/0.15.2/generated/pandas.io.sql.write_frame.html

পান্ডাস ব্যবহার করার জন্য পরিবর্তন করা উচিত ata ডেটাফ্রেম. টো_এসকিএল https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_sql.html

আরও একটি সমাধান আছে। PYODBC থেকে পান্ডাস - ডেটাফ্রেম কাজ করছে না - পাস হওয়া মানগুলির আকার (x, y), সূচকগুলি বোঝায় (ডাব্লু, জেড)

পান্ডাস 0.12 হিসাবে (আমি বিশ্বাস করি) আপনি করতে পারেন:

import pandas
import pyodbc

sql = 'select * from table'
cnn = pyodbc.connect(...)

data = pandas.read_sql(sql, cnn)

0.12 এর আগে, আপনি এটি করতে পারেন:

import pandas
from pandas.io.sql import read_frame
import pyodbc

sql = 'select * from table'
cnn = pyodbc.connect(...)

data = read_frame(sql, cnn)

এটি এখন পর্যন্ত সবচেয়ে সহজতম উপায়
উইলমার ই হেনাও

0

শেষ পোস্ট থেকে দীর্ঘ সময় তবে সম্ভবত এটি কাউকে সহায়তা করে ...

পল এইচ এর চেয়ে শর্ট ওয়েড:

my_dic = session.query(query.all())
my_df = pandas.DataFrame.from_dict(my_dic)

0

সেরা উপায় আমি এই কাজ

db.execute(query) where db=db_class() #database class
    mydata=[x for x in db.fetchall()]
    df=pd.DataFrame(data=mydata)

0

ফলাফলের ফলাফল যদি রেজাল্টসেট হয় তবে আপনার প্রথমে অভিধানে রূপান্তর করা উচিত। তারপরে ডেটাফ্রেম কলামগুলি স্বয়ংক্রিয়ভাবে সংগ্রহ করা হবে।

এটি আমার ক্ষেত্রে কাজ করে:

df = pd.DataFrame([dict(r) for r in resoverall])
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.