在 Pandas 中复制 SQL Group By、Having 和 Sum 功能

问题描述 投票:0回答:1

这是我的sql查询:

select  tri.FINCODE, tri.YEAR_END, sum(qr.OP_INCOME) OP_INCOME, sum(qr.OP_EXPENSE) OP_EXPENSE, sum(qr.INT_COST) INT_COST, sum(qr.EBIT) EBIT, sum(qr.NOPAT) NOPAT, sum(qr.MINORITY_INTEREST_PL) MINORITY_INTEREST_PL
from    fin_qtr_results  qr
inner join fin_qtr_results tri
on qr.FINCODE = tri.FINCODE and qr.DATE_END <= tri.YEAR_END and qr.DATE_END >= tri.YEAR_END - 99
group by tri.FINCODE, tri.YEAR_END
having count(*) = 4

它基本上是一个带有条件的自连接,然后是一个分组依据和一个having count(*) 条件。我正在尝试获取过去十二个月的数据。

现在我在桌子上有一个具有完全相同结构的数据框。我并不总是有所有季度的数据,因此当 4 个季度没有数据时,TTM 总和应该为 NULL

fincode year_end op_income
1001    202303   100
1001    202306   200
1001    202309   300
1001    202312   400

我如何在 Pandas 中实现这一目标。

我尝试滚动总和,应用 lambda,但我只是不知道如何做到这一点。

python pandas dataframe rolling-computation
1个回答
0
投票

您好,所以我厌倦了创建与您类似的代码,并且不知道这是否适合您,因此编写了一个用于执行滚动总和的代码,将其打印出来以验证其正确执行,然后应用过滤器。 我还更改了日期格式以使工作更容易。

这是使用您提到的 lambda 操作的代码:

sql_data = {
    'FINCODE': [1001, 1001, 1001, 1001],
    'YEAR_END': [202303, 202306, 202309, 202312],
    'OP_INCOME': [100, 200, 300, 400]
}

df = pd.DataFrame(sql_data)
df['YEAR_END'] = pd.to_datetime(df['YEAR_END'], format='%Y%m')
grouped = df.groupby('FINCODE')
ttm_sum = grouped.apply(lambda x: x.set_index('YEAR_END').rolling('365D').sum().reset_index())
ttm_sum.reset_index(drop=True, inplace=True)
result = ttm_sum.groupby('FINCODE').filter(lambda x: len(x) == 4)

print(ttm_sum)
print(result)
© www.soinside.com 2019 - 2024. All rights reserved.