gpt4 book ai didi

python - 时间序列数据的 sqlalchemy 查询格式为(步骤,下一步)时间相邻样本对

转载 作者:太空宇宙 更新时间:2023-11-03 11:38:08 24 4
gpt4 key购买 nike

我有一些时间序列数据,其中有一组时间序列,每个 Timeseries 实例都具有一对多关系使用 Point 实例。下面是数据的简化表示。

表格.py:

class Timeseries(Base):
__tablename__ = "timeseries"

id = Column("id", Integer, primary_key=True)
points = relationship("Point", back_populates="ts")


class Point(Base):
__tablename__ = "point"

id = Column("id", Integer, primary_key=True)
t = Column("t", Float)
v = Column("v", Float)
ts_id = Column(Integer, ForeignKey("timeseries.id"))
ts = relationship("Timeseries", back_populates="points")

问题:我正在尝试使用以下类型的列进行查询:“timeseries_id”、“id”、“t”、“v”、“id_next”、“t_next” ", "v_next"。也就是说,我希望能够按时间顺序查看时间序列中每个点的数据以及下一个点的数据,但我一直在努力获取一个不包含隐式连接元素的表? (编辑:重要的一点是,我希望能够使用 sqlalchemy 中的 100% 查询和子查询对象来获取此列表,因为我需要在进一步的连接、过滤器等中使用此查询表。)这是基本的开始我得到了,(请注意,我没有运行这段代码,因为这是我实际数据库的简化版本,但它的想法是一样的):

# The point data actually in the database.
sq = (session.query(
Timeseries.id.label("timeseries_id"),
Point.id,
Point.t,
Point.v)
.select_from(
join(Timeseries, Point, Timeseries.id==Point.ts_id))
.group_by('timeseries_id')
.subquery())

# first point manually added to each list in query
sq_first = (session.query(
Timeseries.id.label("timeseries_id"),
sa.literal_column("-1", Integer).label("id"), # Some unused Point.id value
sa.literal_column(-math.inf, Float).label("t"),
sa.literal_column(-math.inf, Float).label("v"))
.select_from(
join(Timeseries, Point, Timeseries.id==Point.ts_id))
.subquery())

# last point manually added to each list in query.
sq_last = (session.query(
Timeseries.id.label("timeseries_id"),
sa.literal_column("-2", Integer).label("id"), # Another unused Point.id value
sa.literal_column(math.inf, Float).label("t"),
sa.literal_column(math.inf, Float).label("v"))
.select_from(
join(Timeseries, Point, Timeseries.id==Point.ts_id))
.subquery())

# Append each timeseries in `sq` table with last point
sq_points_curr = session.query(sa.union_all(sq_first, sq)).subquery()
sq_points_next = session.query(sa.union_all(sq, sq_last)).subquery()

假设我到目前为止所做的是有用的,这是我卡住的部分:

#I guess rename the columns in `sq_points_next` to append them by "_next"....
sq_points_next = (session.query(
sq_points_curr.c.timeseries_id
sq_points_curr.c.id.label("id_next"),
sq_points_curr.c.t.label("t_next"),
sq_points_curr.c.v.label("v_next"))
.subquery())

# ... and then perform a join along "timeseries_id" somehow to get the table I originally wanted...
sq_point_pairs = (session.query(
Timeseries.id.label("timeseries_id")
"id",
"t",
"v",
"id_next",
"t_next",
"v_next"
).select_from(
sq_points, sq_points_next, sq_points.timeseries_id==sq_points_next.timeseries_id)
)

我什至不确定这最后一个是否会在此时编译,因为它再次从真实代码中改编/简化,但它不会产生相邻时间点表等。

编辑(2019 年 8 月 10 日):

来自 Nathan 的以下简化查询肯定是接近工作的正确方法,但会引发 sqlite 错误。

sq = session.query(
Timeseries.id.label("timeseries_id"),
Point.t.label("point_t"),
func.lead(Point.t).over().label('point_after_t')
).select_from(
join(Timeseries, Point, Timeseries.id == Point.ts_id)
).order_by(Timeseries.id)

print(sq.all())

最佳答案

假设您可以获得足够新版本的 sqlite3 python 模块(例如,通过使用 Anaconda),您可以使用 LEAD 窗口函数来实现您的目标。为了在进一步的查询中使用 LEAD 函数的结果,您还需要使用 CTE。以下方法适用于您提供的架构:

sq = session.query(
Timeseries.id.label("timeseries_id"),
Point.id.label("point_id"),
Point.t.label("point_t"),
Point.v.label("point_v"),
func.lead(Point.id).over().label('point_after_id'),
func.lead(Point.v).over().label('point_after_v'),
func.lead(Point.t).over().label('point_after_t')).select_from(
join(Timeseries, Point, Timeseries.id == Point.ts_id)).order_by(Timeseries.id)

with_after = sq.cte()
session.execute(with_after.select().where(
with_after.c.point_v < with_after.c.point_after_v)).fetchall()

关于python - 时间序列数据的 sqlalchemy 查询格式为(步骤,下一步)时间相邻样本对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55234272/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com