Python 自2012年第一次装运后3天内装运的机组汇总/累计金额

Python 自2012年第一次装运后3天内装运的机组汇总/累计金额,python,pandas,cumulative-sum,rolling-computation,Python,Pandas,Cumulative Sum,Rolling Computation,这有点难解释,但我会尽我最大的努力,请容忍我 我有一个带有ID、发货日期和单位的pd。 我想计算3天内发货的单位,计数不应重叠,例如,我的数据框如下 ID Shipping Date Units Expected output 153131151007 20180801 1 1 153131151007 20180828 1 2 153131151007 20180829 1 0 153131151007 20180904

这有点难解释,但我会尽我最大的努力,请容忍我

我有一个带有ID、发货日期和单位的pd。 我想计算3天内发货的单位,计数不应重叠,例如,我的数据框如下

ID          Shipping Date Units Expected output
153131151007    20180801    1   1
153131151007    20180828    1   2
153131151007    20180829    1   0
153131151007    20180904    1   1
153131151007    20181226    2   4
153131151007    20181227    1   0
153131151007    20181228    1   0
153131151007    20190110    1   1
153131151007    20190115    2   3
153131151007    20190116    1   0
153131151011*   20180510    1   2
153131151011*   20180511    1   0
153131151011*   20180513    1   2
153131151011*   20180515    1   0
153131151011*   20180813    1   1
153131151011*   20180822    1   2
153131151011*   20180824    1   0
153131151011*   20190103    1   1
<代码>应检查日期,看看是否有任何发货在未来3天,如果有一个装运,它应该在当前日期栏,并确保它不考虑汇总计数下一次日期计算。 因此,对于第一个ID发货日期20181226,它检查122612271228并将它们相加,在1226中显示结果,在接下来的2个单元格中显示0

同样,对于第二个ID 20180510,0510是系列中的第一个装运日期。它检查05100511和0512,并将其与其余的0510和0相加,这就是为什么0511不考虑0513,并且它是其他装运组的一部分。
data = pd.DataFrame({'ID':['153131151007','153131151007','153131151007','153131151007','153131151007','153131151007','153131151007','153131151007','153131151007','153131151007','153131151011*','153131151011*','153131151011*','153131151011*','153131151011*','153131151011*','153131151011*','153131151011*'],
'Date':[20180801,20180828,20180829,20180904,20181226,20181227,20181228,20190110,20190115,20190116,20180510,20180511,20180513,20180515,20180813,20180822,20180824,20190103],
'Units':[1,1,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1]})

这是可行的,但结果是广泛的:

import pandas as pd
import numpy as np
from dateutil.parser import parse
from datetime import timedelta

data = pd.DataFrame({'ID':['153131151007','153131151007','153131151007','153131151007','153131151007','153131151007','153131151007','153131151007','153131151007','153131151007','153131151011*','153131151011*','153131151011*','153131151011*','153131151011*','153131151011*','153131151011*','153131151011*'],
'Date':[20180801,20180828,20180829,20180904,20181226,20181227,20181228,20190110,20190115,20190116,20180510,20180511,20180513,20180515,20180813,20180822,20180824,20190103],
'Units':[1,1,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1]})

def keep_first(ser):
    ixs = []
    ts = ser.dropna().index[0]
    while ts <= ser.dropna().index.max():
        if ts in ser.dropna().index:
            ixs.append(ts)
            ts+=timedelta(3)
        else:
            ts+=timedelta(1)
    return np.where(ser.index.isin(ixs), ser, 0)

data['Date'] = data['Date'].map(lambda x: parse(str(x))) # parse dates

units = data.groupby(['ID', 'Date']).sum().unstack(0).resample('D').sum() # create resampled units df

units = units.sort_index(ascending=False).rolling(3, min_periods=1).sum().sort_index() # calculate forward-rolling sum

grouped_ix = data.groupby(['ID', 'Date']).sum().unstack(0).index # get indices for actual data

units.loc[grouped_ix].apply(keep_first) # get sums for actual data indices, keep only first
将熊猫作为pd导入
将numpy作为np导入
从dateutil.parser导入解析
从日期时间导入时间增量
data=pd.DataFrame({'ID':['153131151007'、'153131151007'、'153131151007'、'153131151007'、'153131151007'、'153131151007'、'153131151007'、'153131151007'、'153131151007'、'153131151011*、'153131151011*、'153131151011*'、'153131151011*、'153131151011*、'153131151011*、'153131151011*、'153131131151011*,',
‘日期’:[2018080120180828201808292018090420181226201812272201812282019011020190115201901162018051020180512018051201805120180813201808222018082420190103],
‘单位’:[1,1,1,2,1,1,1,1,2,1,1,1,1,1,1,1,1,1]})
def保持_优先(ser):
ixs=[]
ts=ser.dropna().index[0]

在结束括号之前,您缺少了一个卷曲的括号。请更正它。:)这部分工作,我修改了它一点,使其工作根据我的情况。我不知道出了什么事。我使用了
stack().reset_index()
来获取df。我有2000多个ID,出于某种原因,当我输入所有数据时,它不起作用。因此,我最终在每个ID的循环中对数据进行子设置,并在最后合并它们。我得到了我想要的结果。谢谢:)