分析数据集中的加法和减法

时间:2019-04-05 19:44:49

标签: python sql excel max min

我具有以下形式的数据集:

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

我之前曾考虑过产品的最小(日期),最大(日期),但是产品可以删除并反复添加,因此我不会以这种方式来回捕捉。

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

谢谢

2 个答案:

答案 0 :(得分:0)

要生成缺失条目的列表,可以使用product制作dateCROSS JOIN s的笛卡尔积,并使用它来检测表中的间隙。 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 |

答案 1 :(得分:0)

这是一个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}