繁体   English   中英

基于 Pandas 数据框值的动态 SQL 查询

[英]Dynamic SQL Query based on pandas dataframe Values

我面临以下问题。

我有一个包含: ID、日期、previous_date的数据框

我还有一个存储在 SQL Server 数据库中的表,其中包含ID、日期、值,我想实现以下目标:

在 db 表的数据框中搜索每个 ID,并在名为desired_value的新列中返回日期和上一个日期之间发生的值的总和。

开始数据帧

ID  Date    previous_date   desired_value
5   15/3/2020   15/1/2020   16
7   25/6/2019   19/5/2019   8

数据库表

ID  Date    Value
 5  13/1/2020   5
 5  16/1/2020   7
 5  17/2/2020   9
 7  21/5/2019   4
 7  17/6/2019   4

正如我所能想象的那样,对于起始数据帧的每一行,必须在循环中执行查询。

我有这样的想法

my_query = "select ID, sum(Value) from db_table WHERE ID in {}".format(tuple(df['ID']))

但是我怎么能在里面传递日期的参数呢?

或这个

for index,row in left.iterrows():
x = cursor.execute('''
            SELECT [ID], SUM([Value]) FROM db.table
            WHERE Date > ? AND Date < ?
            GROUP BY ID
        ''',row['Date'],row['previous_date']
        )

但是 x 将成为一个游标对象......

注意: Pandas 数据框和 db 表在不同的日期多次包含相同的 id(想象它就像每个 id 的订单)。

谢谢。

该问题最初有一个 sql 标签。

如果我理解逻辑,你想要一个join和聚合:

select s.date, s.date, s.previous_date, sum(db.value)
from starting s left join
     db
     on db.id = s.id and
        db.date between s.previous_date and s.date
group by s.date, s.date, s.previous_date;

在我看来,您正在尝试根据数据框中的条件对数据库中的 Value 列进行累计总和。 因此,假设您已将数据库读入名为database_df的数据帧,并假设您的起始数据帧不包含所需的值starting_df ,您可以执行以下操作

starting_df = starting_df.merge(database_df, on=["id"])
starting_df = starting_df.loc[(starting_df.date > starting_df.previous_date) 
                              & (starting_df.date <= starting_df.Date),:]
starting_df = starting_df.groupby(by=["id", "Date", "previous_date"]).sum()

结果框架将是一个DataFrameGroupBy对象,如下所示。 如果需要,我让您看看如何将其转换为 DataFrame 对象。

                             value
id Date       previous_date       
5  2020-03-15 2020-01-15        16
7  2019-06-25 2019-05-19         8

您可以找到有关dataframesgroupbymerge等的更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM