এসকিউএলএলকেমি ওআরএম রূপান্তর করে ডেটাফ্রেমে 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)যখন করেছি তখন queryক sqlalchemy.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.