এসকিউএলএলকেমি ওআরএম রূপান্তর করে ডেটাফ্রেমে and


107

এই বিষয়টিকে কিছুক্ষণ, এখানে বা অন্য কোথাও সম্বোধন করা হয়নি। কোনও এসকিউএলএলকেমিকে একটি পান্ডাস ডেটা ফ্রেমে রূপান্তর করার কোনও সমাধান আছে কি <Query object>?

পান্ডাসের ব্যবহারের ক্ষমতা রয়েছে pandas.read_sqlতবে এর জন্য কাঁচা এসকিউএল ব্যবহার প্রয়োজন। এটি এড়ানোর জন্য আমার দুটি কারণ রয়েছে: ১) আমার কাছে ইতিমধ্যে ওআরএম ব্যবহার করার সমস্ত কিছু রয়েছে (নিজের মধ্যে একটি ভাল কারণ এবং) 2) আমি প্রশ্নের অস্তিত্ব হিসাবে পাইথন তালিকা ব্যবহার করছি (যেমন: আমার মডেল শ্রেণিটি .db.session.query(Item).filter(Item.symbol.in_(add_symbols)কোথায় Item? এবং add_symbolsএকটি তালিকা)। এটি এসকিউএল এর সমতুল্য SELECT ... from ... WHERE ... IN

কিছু কি সম্ভব?

উত্তর:


192

নীচে বেশিরভাগ ক্ষেত্রে কাজ করা উচিত:

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

pandas.read_sqlপরামিতিগুলিতে আরও তথ্যের জন্য ডকুমেন্টেশন দেখুন ।


@ ওয়ান +1 তবে কিছুটা আরও বিশদ সহ করতে পারেন। যেমন আমি df = pd.read_sql(query, query.bind)যখন করেছি তখন querysqlalchemy.sql.selectable.Select। অন্যথায়, আমি পেয়েছি 'Select' object has no attribute 'session'
লিটল ববি টেবিলগুলি

অর্ডার কপি-পেস্ট করুন, আমি উত্তর, যা আপনার প্রশ্ন জুড়ে সরাসরি ডকুমেন্টেশন লিংক যোগ: আপনি প্রদান করা উচিত conপরামিতি, যা হতে পারে engineবাconnection string
ভ্যান

@van কি এখানে ক্যোয়ারী.সায়োশন.কনেকশন () ব্যবহার করা ভাল? অন্যথায় কোয়েরিটি অধিবেশনটিতে নিবিড়িত পরিবর্তনগুলিকে বিবেচনা করে না ...
ডেটাফ্লো

1
@ ডেটাফ্লো: আমি মনে করি আপনি ঠিক বলেছেন, তবে আমি কখনও অনুমানটি পরীক্ষা করি নি।
ভ্যান

@ ওয়ান - এটি 'প্রকারের ত্রুটি: ক্রম আইটেম 0: প্রত্যাশিত স্ট্রিং, ডিফল্ট মেটা পাওয়া গেছে'; কী সমস্যা আছে তা বের করার চেষ্টা করে সারাদিন আমার চুল ছিঁড়ে ফেলেছে। কেবলমাত্র আমি বুঝতে পারি যে এটি একটি স্কোপড_অ্যাসিওশন থেকে সংযোগ বের করার চেষ্টা করার সাথে কিছুটা থাকতে পারে ....
অ্যান্ড্রুডারসন

85

কেবল শিখর পাণ্ডাস প্রোগ্রামারদের জন্য এটি আরও স্পষ্ট করার জন্য, এখানে একটি দৃ concrete় উদাহরণ দেওয়া হয়েছে,

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

এখানে আমরা অভিযোগ টেবিল থেকে অভিযোগ নির্বাচন করি (স্কেলচেমি মডেল অভিযোগ) আইডি = 2 দিয়ে


1
আমি মনে করি এটি আরও স্পষ্ট, যখন কোডটি ORM ভিত্তিক হয়।
ব্যবহারকারী 40780

ঈশ্বর! আমি স্ক্যালএলকেমি হেল্পকে অনেকটা লড়াই করেছি। এখানে কেবল একটি পার্শ্ব নোট: আপনি পঠন-এসকিউএল ('ট্যাবলেট থেকে' নির্বাচন করুন ', db.session.bind )ও লিখতে পারেন। ধন্যবাদ। উপরের উত্তরটি আমাকে গৃহীত উত্তরটির চেয়ে বেশি সাহায্য করেছিল।
পল্লবক্ষী

3
কি করে .statement?
এলাচি

4
@ কার্ডডম এটি স্কেল কোয়েরিটি দেয়।
নুনো আন্দ্রে

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
কার্লোস আজেভেদো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.