【问题标题】:How to get last four days sale count in particular month and first 27 day's sale count?如何获得特定月份的最后四天销售计数和前 27 天的销售计数?
【发布时间】:2020-04-16 15:20:58
【问题描述】:

如何获取每个设备号的销售计数并过滤超过前 27 天的销售量(01/Mar/2020 - 27/Mar/2020)

Device_num      Date        sale_type
2344            1/3/2020      BP
2344            12/3/2020     BP
2344            15/3/2020     BP
2344            20/3/2020     BP
2344            28/3/2020     BP
3455            10/3/2020     Retailer
3455            15/3/2020     Retailer
3455            31/3/2020     Retailer 


output table
Device_num  sale_type   1st_27dayssale  Tot_sale last4dayscount
2344          BP             4            5           1           
3455          Retailer       2            3           1

【问题讨论】:

  • 数据是如何存储的?
  • 我需要三列,一列是总销售额 groupby Device_num,第二列是最近四天销售额 groupby Device_num,第三列是前 27 天销售额 groupby Device_num
  • ...它是如何存储的? SQL???
  • 我正在寻找 python 脚本而不是 SQL 脚本
  • 啊抱歉@seven_seas。它以 CSV 格式存储(excel 文件)

标签: python-3.x


【解决方案1】:

你可以试试:

df.groupby(["Device_num", "sale_type", pd.Grouper(key='Date', freq="m")]).apply(
    lambda x: pd.Series({"Device_num":  x.name[0],
                         "sale_type": x.name[1],
                         "1st_27dayssale": (x.Date.dt.day <= 27).sum(),
                         "Tot_sale": len(x),
                         "last4dayscount" : (x.Date.dt.day > 27).sum()})) \
    .reset_index(drop=True)

说明:

  1. 数据集使用groupby按3个键分组:

    • Device_num,因为您希望每个设备编号都有一行
    • sale_type,因为我们还希望每个 sale_type 有一行
    • 当前月份使用pd.Grouper。在pd.grouper 中,参数key 选择在grouper 中使用的列,freq 代表groupby frequency。这里我们使用m 按月分组。更多详情,请查看this topic
  2. 然后对于上述每个组,我们将希望返回 5 个预期列。 pd.apply 让使用对每个组执行一个功能。我们希望我们的函数返回:

    • Device_num:这是群里的钥匙,所以我们打电话给name 来获取。因为它是第一个键,所以我们最终使用x.name[0]This discussion 解释了如何从 groupby 获取密钥。
    • sale_type: x.name[1](同上Device_num
    • 1st_27dayssale:我们使用 x.Date.dt.day 访问从日期开始的日期,并与 27 进行比较。因为我们实际上想要值的数量,所以我们执行 .sum 来计算它们:(x.Date.dt.day &lt;= 27).sum()
    • Tot_sale:组中的行数,例如len(x)
    • last4dayscount: (x.Date.dt.day &gt; 27).sum()(同上1st_27dayssale
  3. 使用 reset_indexdrop=True 从 groupby 中删除多索引。

完整代码:

# Be sure Date is a date type
df["Date"] = pd.to_datetime(df.Date, format="%d/%m/%Y")
print(df)
#    Device_num       Date sale_type
# 0        2344 2020-03-01        BP
# 1        2344 2020-03-12        BP
# 2        2344 2020-03-15        BP
# 3        2344 2020-03-20        BP
# 4        2344 2020-03-28        BP
# 5        3455 2020-03-10  Retailer
# 6        3455 2020-03-15  Retailer
# 7        3455 2020-03-31  Retailer


out = df.groupby(["Device_num", "sale_type", pd.Grouper(key='Date', freq="m")]).apply(
    lambda x: pd.Series({"Device_num":  x.name[0],
                         "sale_type": x.name[1],
                         "1st_27dayssale": (x.Date.dt.day <= 27).sum(),
                         "Tot_sale": len(x),
                         "last4dayscount" : (x.Date.dt.day > 27).sum()})) \
    .reset_index(drop=True)
print(out)
#    Device_num sale_type  1st_27dayssale  Tot_sale  last4dayscount
# 0        2344        BP               4         5               1
# 1        3455  Retailer               2         3               1

【讨论】:

  • 我想统计每个月的最后三天销售额(不仅仅是三月),如何获得? (例如:如果您选择 2 月,过去 4 天计算(2020 年 2 月 27 日 - 2020 年 2 月 29 日)。
  • @ShulazShan 请不要挖掘旧主题,而是打开一个新主题,其中包含您尝试过的内容以及遇到的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
相关资源
最近更新 更多