Python 当标志为True时重置SQL窗口的长度?

Python 当标志为True时重置SQL窗口的长度?,python,sql,if-statement,partition,Python,Sql,If Statement,Partition,我有一个公用事业账单部分的表格,每个部分显示一个月的千瓦时使用量。我想把12人一组加起来,算出年度账单 可变账单cd表示年度账单的最后一部分。 问题是:可以看出,每年的账单没有12个部分。在这个片段中,我只想得到第一个年度账单的总和,因为它将包括12个部分,而不是第二个,因为它只有两个部分 我用python编写了这个查询: import pandas as pd, pandasql as ps df = pd.read_csv('so_ex.csv') q1 = """ select cu

我有一个公用事业账单部分的表格,每个部分显示一个月的千瓦时使用量。我想把12人一组加起来,算出年度账单

可变账单cd表示年度账单的最后一部分。

问题是:可以看出,每年的账单没有12个部分。在这个片段中,我只想得到第一个年度账单的总和,因为它将包括12个部分,而不是第二个,因为它只有两个部分

我用python编写了这个查询:

import pandas as pd, pandasql as ps

df = pd.read_csv('so_ex.csv')

q1 = """
select cust_id, kwh, bill_cd,
sum(kwh) over (partition by cust_id
    rows between 11 preceding and current row) as kwh_total,
count(kwh) over (partition by cust_id
    rows between 11 preceding and current row) as bseg_count
from df
"""

ps.sqldf(q1, locals())
结果如下。是否有一种方法可以在传递票据实例后重置count变量,从而使票据段计数变为1。这样,我可以在bseg_count=12的情况下过滤表

   cust_id      kwh   bill_cd  kwh_total bseg_count
0   3333    1104.388683 ?   1104.388683   1
1   3333    1498.007305 ?   2602.395988   2
2   3333    662.044822  ?   3264.440810   3
3   3333    661.342412  ?   3925.783223   4
4   3333    494.070683  ?   4419.853906   5
5   3333    300.147843  ?   4720.001748   6
6   3333    836.677007  ?   5556.678755   7
7   3333    864.608037  ?   6421.286792   8
8   3333    933.232845  ?   7354.519638   9
9   3333    1191.025358 ?   8545.544996   10
10  3333    1507.119588 ?   10052.664584  11
11  3333    1980.653631 BILL 12033.318215 12
12  3333    2621.387010 ?    13550.316542 12
13  3333    2552.053789 BILL 14604.363026 12
期望输出:

   cust_id      kwh   bill_cd  kwh_total bseg_count
0   3333    1104.388683 ?   1104.388683   1
1   3333    1498.007305 ?   2602.395988   2
2   3333    662.044822  ?   3264.440810   3
3   3333    661.342412  ?   3925.783223   4
4   3333    494.070683  ?   4419.853906   5
5   3333    300.147843  ?   4720.001748   6
6   3333    836.677007  ?   5556.678755   7
7   3333    864.608037  ?   6421.286792   8
8   3333    933.232845  ?   7354.519638   9
9   3333    1191.025358 ?   8545.544996   10
10  3333    1507.119588 ?   10052.664584  11
11  3333    1980.653631 BILL 12033.318215 12
12  3333    2621.387010 ?    13550.316542 1
13  3333    2552.053789 BILL 14604.363026 2

您可以反向进行票据累计计数,以定义组,然后使用行号:


这些窗口功能应基于排序列,如日期或顺序id。不清楚该列是什么。

您可以反向进行票据累积计数,以定义组,然后使用行号:


这些窗口功能应基于排序列,如日期或顺序id。不清楚该列是什么。

这非常快,非常接近,谢谢!但我意识到我没有很好地回答这个问题。我用期望的结果更新了问题。我希望在通过法案后重新设置计数器,因为法案是年度法案的最后一部分。@DDDD。这是一个简单的调整。用降序排序。我昨晚吃晚饭时也有同样的感受。谢谢这是非常快,非常接近,谢谢你!但我意识到我没有很好地回答这个问题。我用期望的结果更新了问题。我希望在通过法案后重新设置计数器,因为法案是年度法案的最后一部分。@DDDD。这是一个简单的调整。用降序排序。我昨晚吃晚饭时也有同样的感受。谢谢
   cust_id      kwh   bill_cd  kwh_total bseg_count
0   3333    1104.388683 ?   1104.388683   1
1   3333    1498.007305 ?   2602.395988   2
2   3333    662.044822  ?   3264.440810   3
3   3333    661.342412  ?   3925.783223   4
4   3333    494.070683  ?   4419.853906   5
5   3333    300.147843  ?   4720.001748   6
6   3333    836.677007  ?   5556.678755   7
7   3333    864.608037  ?   6421.286792   8
8   3333    933.232845  ?   7354.519638   9
9   3333    1191.025358 ?   8545.544996   10
10  3333    1507.119588 ?   10052.664584  11
11  3333    1980.653631 BILL 12033.318215 12
12  3333    2621.387010 ?    13550.316542 1
13  3333    2552.053789 BILL 14604.363026 2
select df.*,
       row_number() over (partition by cust_id, grp order by <ordering col> desc)
from (select df.*,
             sum(case when bill_cd = 'BILL' then 1 else 0 end) over (partition by cust_id order by <ordering col>) as grp
      from df
     ) df