【问题标题】:Analyze additions and subtractions to/from a data set分析数据集的加法和减法
【发布时间】:2019-08-27 18:30:43
【问题描述】:

我有一个如下形式的数据集:

Product    |    Date
123        |    2019-01-01
456        |    2019-01-01
123        |    2019-01-02
123        |    2019-01-03
456        |    2019-01-03
123        |    2019-01-04
456        |    2019-01-04
789        |    2019-01-04

这只是一个简化版本。全套有约 300 种产品和四个月的数据。我想了解产品集如何随时间变化。显然很容易计算每天的数量,看到我在 1 月 2 日失去了一件产品,在 1 月 4 日获得了一件,但后来我不知道它是什么产品。

有没有更系统的方法来解决这个问题?理想情况下,输出会向我显示日期列表以及当天退出/添加的产品,即:

Date        |   Product   |   Type
2019-01-02  |   456       |   Out
2019-01-03  |   456       |   In
2019-01-04  |   789       |   In

我之前按产品考虑过 min(date)、max(date),但产品可以重复添加和删除,我不会以这种方式来回捕捉。

可用的环境是 Python、SQL 和 Excel。

谢谢

【问题讨论】:

  • "...看到我在 1 月 2 日丢失了一件产品,并在 1 月 4 日获得了一件产品..." -- 从示例数据中我根本看不到这一点。您可能想看看this,然后编辑您的问题以澄清它。包括您迄今为止尝试过的内容以及预期的结果也会很有用。
  • 1 月 2 日产品 456 不在数据集中(一天后回来),产品 789 开始不在数据集中,并在 1 月 4 日首次出现

标签: python sql excel max min


【解决方案1】:

要生成缺失条目的列表,您可以使用CROSS JOIN 制作products 和dates 的笛卡尔积,并使用LEFT JOIN 反模式检测表中的间隙,比如:

SELECT p.product, d.date
FROM 
    (SELECT DISTINCT product FROM mytable) p
    CROSS JOIN (SELECT DISTINCT date from mytable) d
    LEFT JOIN mytable t ON t.product = p.product AND t.date = d.date
WHERE t.product IS NULL

Demo on DB Fiddle

| product | date       |
| ------- | ---------- |
| 789     | 2019-01-01 |
| 456     | 2019-01-02 |
| 789     | 2019-01-02 |
| 789     | 2019-01-03 |

【讨论】:

    【解决方案2】:

    这是一个 Python 解决方案。按日期对产品进行分组并将它们转换为集合。然后,计算两种方式的运行集差异。

    as_set = df.groupby('Date')['Product'].apply(set)
    changes = pd.concat([as_set - as_set.shift(),
                         as_set.shift() - as_set], axis=1).dropna()
    changes.columns = "In", "Out"
    #               In    Out
    #Date                    
    #2019-01-02     {}  {456}
    #2019-01-03  {456}     {}
    #2019-01-04  {789}     {}
    

    您可以进一步消除空条目:

    #import numpy as np
    #changes.replace(set(), np.nan).stack()
    #Date           
    #2019-01-02  Out    {456}
    #2019-01-03  In     {456}
    #2019-01-04  In     {789}
    

    【讨论】:

      猜你喜欢
      • 2013-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      相关资源
      最近更新 更多