计算销售额滚动(滞后和领先)差异的最佳方法是什么?
What is the best way to compute a rolling (lag and lead) difference in sales?
我想在我的数据集中添加一个或两个字段,以表示从上周到本周以及从本周到下周的销售额差异。
我的数据集大约有 450 万行,所以我正在寻找一种有效的方法来执行此操作,目前我正在进行大量的迭代和 for 循环,我很确定我会这样做这是错误的方式。但我正在尝试编写可在其他数据集上重复使用的代码,并且在某些情况下您可能会有空值或每周的销售量没有变化(因此没有记录)
数据集如下所示:
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 中的每个星期,并将其中的每个 store/item 与它后面的一周进行比较(我计划下周也这样做)。我创建的 '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
使用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)
我想在我的数据集中添加一个或两个字段,以表示从上周到本周以及从本周到下周的销售额差异。
我的数据集大约有 450 万行,所以我正在寻找一种有效的方法来执行此操作,目前我正在进行大量的迭代和 for 循环,我很确定我会这样做这是错误的方式。但我正在尝试编写可在其他数据集上重复使用的代码,并且在某些情况下您可能会有空值或每周的销售量没有变化(因此没有记录)
数据集如下所示:
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 中的每个星期,并将其中的每个 store/item 与它后面的一周进行比较(我计划下周也这样做)。我创建的 '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
使用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)