我有一个以下形式的数据集:
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个产品和4个月的数据。我想了解产品集是如何随着时间的推移而变化的。这显然很容易计算每天的计数,看到我在1月2日失去了一个产品,并在Jan4th上获得了一个产品,但随后我不知道它是什么产品。
有没有更系统的方法来解决这个问题?理想情况下,输出将向我显示日期列表以及当天丢弃/添加了哪些产品,即:
Date | Product | Type
2019-01-02 | 456 | Out
2019-01-03 | 456 | In
2019-01-04 | 789 | In我以前考虑过产品的min(日期),max(日期),但产品可以删除和重复添加,我不会以这种方式来回捕获。
可用的环境包括Python、SQL和Excel。
谢谢
发布于 2019-04-06 03:56:09
要生成缺少条目的列表,您可以使用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| product | date |
| ------- | ---------- |
| 789 | 2019-01-01 |
| 456 | 2019-01-02 |
| 789 | 2019-01-02 |
| 789 | 2019-01-03 |发布于 2019-04-06 03:59:06
这是一个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} {}您可以进一步消除null条目:
#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}https://stackoverflow.com/questions/55542399
复制相似问题