Каков наилучший способ вычислить скользящую (отставание и отставание) разницу в продажах? - PullRequest
1 голос
/ 29 апреля 2019

Я хочу добавить одно или два поля в мой набор данных, которые представляют разницу в продажах с прошлой недели до текущей недели и с текущей недели до следующей недели.

Мой набор данных составляет около 4,5 миллионов строк, поэтому я ищу, чтобы найти эффективный способ сделать это, в настоящее время я вхожу в много итераций и для циклов, и я совершенно уверен, что я собираюсь об этом Неправильный путь. но я пытаюсь написать код, который будет многократно использоваться в других наборах данных, и есть ситуации, когда вы можете иметь нулевые или нулевые изменения в продажах неделя (поэтому нет записи)

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

Store  Item  WeekID  WeeklySales
1      1567   34      100.00
2      2765   34      86.00
3      1163   34      200.00
1      1567   35      160.00
.      .
.      . 
.      .

У меня есть каждая неделя в качестве собственного словаря, а затем продажи каждого магазина за эту неделю в словаре внутри. Таким образом, я могу использовать неделю в качестве ключа, а затем в течение недели я получаю доступ к словарю продаж товаров в магазине.

weekly_sales_dict = {}
for i in df['WeekID'].unique():
    store_items_dict = {}
    subset = df[df['WeekID'] == i]
    subset = subset.groupby(['Store', 'Item']).agg({'WeeklySales':'sum'}).reset_index()
    for j in subset['Store'].unique():
        storeset = subset[subset['Store'] == j]
        store_items_dict.update({str(j): storeset})
    weekly_sales_dict.update({ str(i) : store_items_dict})

Затем я перебираю каждую неделю в weekly_sales_dict и сравниваю каждый магазин / предмет в нем с неделей за ней (я планировал сделать то же самое и на следующей неделе). «Список lag_list», который я создаю, может быть проиндексирован по неделям, хранилищу и элементу, поэтому я собирался выполнить итерацию и добавить значения к своему df в качестве нового столбца задержки, но я чувствую, что я слишком обдумываю это.

count = 0 
key_list = list(df['WeekID'].unique())
lag_list = []
for k,v in weekly_sales_dict.items():
    if count != 0 and count != len(df['WeekID'].unique())-1:
        prev_wk = weekly_sales_dict[str(key_list[(count - 1)])]
        current_wk = weekly_sales_dict[str(key_list[count])
        for i in df['Store'].unique():
            prev_df = prev_wk[str(i)]
            current_df = current_wk[str(i)]
            for j in df['Item'].unique():
                print('in j')
                if j in list(current_df['Item'].unique()) and j in list(prev_df['Item'].unique()):
                    item_lag = current_df[current_df['Item'] == int(j)]['WeeklySales'].values - prev_df[prev_df['Item'] == int(j)]['WeeklySales'].values
                    df[df['Item'] == j][df['Store'] == i ][df['WeekID'] == key_list[count]]['lag'] = item_lag[0]
                    lag_list.append((str(i),str(j),item_lag[0]))
                elif j in list(current_df['Item'].unique()):
                    item_lag = current_df[current_df['Item'] == int(j)]['WeeklySales'].values
                    lag_list.append((str(i),str(j),item_lag[0]))
                else:
                    pass
        count += 1
    else:            
        count += 1

1 Ответ

1 голос
/ 30 апреля 2019

Используя pd.diff() проблема была решена. Я отсортировал все строки по неделям, а затем создал подмножество с несколькими индексами, сгруппировав их по магазинам, элементам и неделям. Наконец, я использовал pd.diff () с периодом 1 и в итоге получил разницу в продажах с текущей недели до предыдущей недели.

df = df.sort_values(by = 'WeekID')

subset = df.groupby(['Store', 'Items', 'WeekID']).agg({''WeeklySales'':'sum'})
subset['lag']  = subset[['WeeklySales']].diff(1)
...