计算周末销售额占总销售额的百分比,以及如何处理银行假期等例外情况

2024-04-26 14:28:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个每日销售数据框

我想创建一个KPI,以了解周末销售如何影响每周销售,以及正常工作日如何影响每周销售

我创建了一个工作代码,作为下面的示例,它是有效的

但是:

1) (第一个主要问题)我认为可以用一种更为通灵的方式来改进,但我不知道如何改进

2)(第二个小问题)如果是销售过低的银行假日或销售过高的特殊假日,我应该用平均值或中值替换这些异常值吗

#Generating a Random Sample
np.random.seed(30)
values=np.random.randint(0,400,14)
day= pd.date_range(start='25/02/2020',periods=14)

#Creating an example DataFrame
df_input={'date':day,"values":values}
df_test=pd.DataFrame(df_input)

#From here starts what I have done on my original code
# week and day of the week are two informatio that I have to retrieve from my
#original DataFrame
#Creating a column with Week and Day Of The Week info
df_test['week']=df_test.date.dt.week
df_test['day']=df_test.date.dt.dayofweek

#Creating a Column for differencing weekend from normal day 
df_test['weekend']=np.zeros(len(df_test))
df_test['weekend'][(df_test.day==5)|(df_test.day==6)]=1

#Grouping on Week to get total sales 
grouped_full=df_test.groupby(['week']).sum()

#Grouping on Week And Weekend to separate normal days from weekend days
grouped=df_test.groupby(['week','weekend']).sum()

#Getting the ratio between 
#the weekend and total weekly sales
#normal days and total weekly sales
ratio=grouped/grouped_full
print(ratio['values'])

这是我的输出:

week  weekend
9     0.0        0.666667
      1.0        0.333333
10    0.0        0.784127
      1.0        0.215873
11    0.0        1.000000

Tags: andthetestcreatingdataframedfdateon
3条回答

嗨,我很想评论一下乌克兰哔叽布的回答,但最终由于50分的声誉规则,这是不可能的,但我不在乎,我无论如何都想做出贡献

我想指出,从技术上讲,你的回答只回答了问题的后半部分:

I want to create a KPI to understand how weekend sales influence weekly sales and how normal days influence weekly sales

事实上,通过对同一周数进行分组,我们创建的KPI具有工作日的因果关系>;相反,我们应该使用:

# group and use mean
weekdays = (df_test[df_test.date.dt.weekday.isin([0,1,2,3,4])]
                .groupby(df_test.date.dt.week)
                .mean())
# group and use mean
weekends = (df_test[df_test.date.dt.weekday.isin([5,6])]
                .groupby(df_test.date.dt.week -1 )
                .mean())

为了找到周末>;工作日因果关系

我花了一些时间试图真正理解你是如何处理这个问题的,以及是否有其他方法来看待这个问题

无论如何,我都不是专业人士,所以对这一切都要三思而后行:

  1. 我认为没有比这更“pythonic”的方法来编写代码。虽然范围很广,但我可以告诉你我的大脑如何接近你的大脑 我所理解的问题是:
import numpy as np
import pandas as pd

#Generating a Random Sample
np.random.seed(30)
values=np.random.randint(0,400,14)
day= pd.date_range(start='25/02/2020',periods=14)

#Creating an example DataFrame
df_input={'date':day,"values":values}
df_test=pd.DataFrame(df_input)

# group and use mean
weekdays = (df_test[df_test.date.dt.weekday.isin([0,1,2,3,4])]
                .groupby(df_test.date.dt.week)
                .mean())
# group and use mean
weekends = (df_test[df_test.date.dt.weekday.isin([5,6])]
                .groupby(df_test.date.dt.week)
                .mean())

# store in dict
d = {'weekdays': weekdays, 'weekends': weekends}

# concat and drop extra level('values')
both = pd.concat(d, axis=1).droplevel(1, axis=1)

# create new column with mean ratio differences
both['weekends_ratio'] = both['weekends'].div(both['weekends']+both['weekdays'])

print(both)
      weekdays  weekends  weekend_ratio
date
9          280     280.0       0.500000
10         247     170.0       0.407674
11          18       NaN            NaN
  1. 我不知道它是否有用,但可能使用.mean()(正如您在我的代码中看到的那样)而不是 .sum()查找平均销售额中的比率差异

问题1

可能的替代方案

# Creating an example DataFrame
np.random.seed(30)
values = np.random.randint(0,400,14)
day = pd.date_range(start='25/02/2020',periods=14)
df_test = pd.DataFrame({'date':day,"values":values})

# Create week, day, weekend
df_test['week'] = df_test['date'].dt.week
df_test['day'] = df_test['date'].dt.dayofweek
df_test['weekend'] = df_test['day'].isin([5,6])# optional  > .astype(int)

# Calculate the metric
df_test_grouped = df_test.groupby(['week', 'weekend'])[['values']].sum()
df_test_grouped.groupby(level=0).apply(lambda x: 100 * x / float(x.sum()))

问题2
很难说,这取决于分析的类型、你所做的假设、你有多少数据、异常值的规模等等。
异常值通常是重要的数字,而不仅仅是需要平滑处理的值。
圣诞节一周可以提供某种产品年销售额的20%。那一周只是个例外吗

相关问题 更多 >