Анализировать сложения и вычитания в / из набора данных - PullRequest
1 голос
/ 05 апреля 2019

У меня есть набор данных в следующем виде:

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 товаров и данные за четыре месяца.Я хочу понять, как набор продуктов менялся с течением времени.Очевидно, что легко подсчитать количество в день и увидеть, что я потерял один продукт 2 января, а другой - 4 января, но потом я не знаю, какой это был продукт.

Есть ли более систематический способсобирается об этом?В идеале выходные данные должны показывать мне список дней и продуктов, которые выпали / были добавлены в тот день, например:

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

Я думал о мин. (Дата), макс. (Дата) по продуктам раньше, но продуктыможно удалять и добавлять повторно, и я не буду перехватывать это туда-сюда таким образом.

Доступны следующие среды: Python, SQL и Excel.

Спасибо

Ответы [ 2 ]

0 голосов
/ 05 апреля 2019

Вот решение 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}
0 голосов
/ 05 апреля 2019

Чтобы сгенерировать список пропущенных записей, вы можете сделать декартово произведение product s и date s, используя CROSS JOIN, и использовать его для обнаружения пробелов в таблице с помощью 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

Демонстрация на DB Fiddle :

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