[英]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
您可以找到有关dataframes 、 groupby 、 merge等的更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.