SQLAlchemy ORM पंडों के लिए रूपांतरण DataFrame


107

इस विषय को कुछ समय में, यहाँ या कहीं और संबोधित नहीं किया गया है। वहाँ एक समाधान <Query object>एक पांडा के लिए एक SQLAlchemy DataFrame परिवर्तित कर रहा है?

पंडों के पास उपयोग करने की क्षमता है pandas.read_sqlलेकिन इसके लिए कच्चे एसक्यूएल के उपयोग की आवश्यकता होती है। मेरे पास इसे टालने के दो कारण हैं: 1) मेरे पास पहले से ही ORM (स्वयं का एक अच्छा कारण) और 2) का उपयोग करके सब कुछ है, मैं क्वेरी के भाग के रूप में अजगर सूचियों का उपयोग कर रहा हूं (जैसे: मेरा मॉडल वर्ग .db.session.query(Item).filter(Item.symbol.in_(add_symbols)कहां Itemहै और add_symbolsएक सूची है)। यह SQL के बराबर है SELECT ... from ... WHERE ... IN

क्या कुछ संभव है?

जवाबों:


192

नीचे ज्यादातर मामलों में काम करना चाहिए:

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

pandas.read_sqlमापदंडों पर अधिक जानकारी के लिए प्रलेखन देखें ।


@van +1 लेकिन थोड़ा अधिक विस्तार के साथ कर सकता है। उदाहरण के लिए मैंने किया है df = pd.read_sql(query, query.bind)जब queryएक sqlalchemy.sql.selectable.Select। नहीं तो मुझे मिल गया 'Select' object has no attribute 'session'
लिटिल बॉबी टेबल्स

क्रम में करने के लिए कॉपी-पेस्ट में, मैं इस सवाल का जवाब है, जो अपने प्रश्न को शामिल किया गया में सीधे प्रलेखन के लिए लिंक कहा: आप प्रदान करना चाहिए conपैरामीटर है, जो हो सकता है engineयाconnection string
वैन

@van क्या यहां query.session.connection () का उपयोग करना बेहतर होगा? अन्यथा क्वेरी सत्र में खाता unpersisted परिवर्तन पर ध्यान नहीं देता ...
dataflow

1
@dataflow: मुझे लगता है कि आप सही हैं, लेकिन मैंने कभी इस धारणा का परीक्षण नहीं किया है।
वैन

@ इवन - यह 'टाइप टाइप: सीक्वेंस आइटम 0: अपेक्षित स्ट्रिंग, डिफाल्टमेट पाया'; पूरे दिन मेरे बाल फाड़ रहा है और यह पता लगाने की कोशिश कर रहा है कि क्या गलत है। केवल एक चीज जो मैं समझ सकता हूं, वह यह है कि एक scoped_session से एक कनेक्शन निकालने की कोशिश करने के साथ कुछ करना पड़ सकता है ....
andrewpederson

86

नौसिखिया पांडा प्रोग्रामर्स के लिए इसे और अधिक स्पष्ट करने के लिए, यहाँ एक ठोस उदाहरण है,

pd.read_sql(session.query(Complaint).filter(Complaint.id == 2).statement,session.bind) 

यहाँ हम id = 2 के साथ शिकायत तालिका (sqlalchemy मॉडल शिकायत है) से एक शिकायत का चयन करते हैं


1
मुझे लगता है कि यह अधिक स्पष्ट है, जब कोड ORM आधारित है।
user40780

हे भगवान! मैंने sqlAlchemy नर्क से बहुत संघर्ष किया। बस एक साइड नोट यहां: आप read_sql ('SELECT * FAB TABLENAME', db.session.bind) भी लिख सकते हैं। धन्यवाद। उपरोक्त उत्तर ने मुझे स्वीकृत से अधिक मदद की।
पल्लवबक्षि

3
क्या करता .statementहै?
इलायची

4
@cardamom यह sql क्वेरी लौटाता है।
नूनो एंड्रे

10

चयनित समाधान मेरे काम नहीं आया, क्योंकि मैं त्रुटि प्राप्त करता रहा

गुण: 'एनोटेटसाइलेट' ऑब्जेक्ट में कोई विशेषता नहीं है 'कम'

मैंने पाया कि निम्नलिखित काम किया है:

df = pd.read_sql_query(query.statement, engine)

4

यदि आप मापदंडों और बोली विशिष्ट तर्कों के साथ एक क्वेरी संकलित करना चाहते हैं, तो इस तरह से कुछ का उपयोग करें:

c = query.statement.compile(query.session.bind)
df = pandas.read_sql(c.string, query.session.bind, params=c.params)

3
from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

engine = create_engine('postgresql://postgres:postgres@localhost:5432/DB', echo=False)
Base = declarative_base(bind=engine)
Session = sessionmaker(bind=engine)
session = Session()

conn = session.bind

class DailyTrendsTable(Base):

    __tablename__ = 'trends'
    __table_args__ = ({"schema": 'mf_analysis'})

    company_code = Column(DOUBLE_PRECISION, primary_key=True)
    rt_bullish_trending = Column(Integer)
    rt_bearish_trending = Column(Integer)
    rt_bullish_non_trending = Column(Integer)
    rt_bearish_non_trending = Column(Integer)
    gen_date = Column(Date, primary_key=True)

df_query = select([DailyTrendsTable])

df_data = pd.read_sql(rt_daily_query, con = conn)

के आयात selectमें df_query = select([DailyTrendsTable])याद आ रही है। from sqlalchemy import select
कार्लोस अजेवेदो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.