У меня есть модель ORM в SQLAlchemy, в которой хранятся некоторые цены (по product_id и дате) и курсы валют (по currency_from, currency_to и дате).У меня есть функция, которая возвращает объект запроса.В запросе есть столбцы id, date, currency и price.При желании цены могут быть конвертированы в другую валюту.Я хотел бы взять этот объект запроса в качестве аргумента и объединить его с таблицей ExRates
, чтобы конвертировать в другую валюту.
Обходной путь, который я использую, - это прочитать части, которые мне нужны для pandas.DataFrame
, и объединить.Еще одна хитрость в том, что иногда у меня есть цена на субботу, но нет обменного курса.В этом случае следует использовать последний доступный обменный курс.Снова в pandas
я могу сделать это с .reindex
и .fillna(method='ffill')
, но я хотел бы реализовать это исключительно в SQL.
Для справки ниже приведены биты из моего кода:
class Price(ReprMixin, GenFromDfMixin, ToDfMixin, Base):
__tablename__ = 'prices'
benchmark_id = Column(String, ForeignKey('benchmarks.benchmark_id'), index=True, primary_key=True)
date = Column(Date, index=True, primary_key=True)
price = Column(Float)
return_ytd = Column(Float)
class Benchmark(ReprMixin, GenFromDfMixin, ToDfMixin, Base):
__tablename__ = 'benchmarks'
benchmark_id = Column(String, primary_key=True)
index_name = Column(String)
currency = Column(String)
...
class ExRate(ReprMixin, GenFromDfMixin, ToDfMixin, Base):
__tablename__ = 'rates'
cur_from = Column(String, primary_key=True)
cur_to = Column(String, primary_key=True)
date = Column(Date, primary_key=True, index=True)
ex_rate = Column(Float)
def _query_by_id_and_date(benchmark_id, date_min=None, date_max=None):
if date_min is None:
date_min = datetime.date(1900, 1, 1)
if date_max is None:
date_max = datetime.date(2222, 1, 1)
prices = dal.session.query(Price.benchmark_id, Price.date, Price.price, Benchmark.currency).join(Benchmark)\
.filter(Price.benchmark_id == benchmark_id).filter(Price.date.between(date_min, date_max))
return prices
def _currency_convert(q, to_curr):
pass
# I would like to call this function like this:
# _currency_convert(_query_by_id_and_date('some_id'), 'EUR')
# and get the same 4 column query, but with prices converted to a new currency