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