Python 计算周末销售额占总销售额的百分比,以及如何处理银行假期等例外情况
我有一个每日销售数据框 我想创建一个KPI,以了解周末销售如何影响每周销售,以及正常工作日如何影响每周销售 我创建了一个工作代码,作为下面的示例,它是有效的 但是: 1) (第一个主要问题)我认为可以用一种更为通灵的方式来改进,但我不知道如何改进 2) (第二个小问题)如果是销售过低的银行假日或销售过高的特殊假日,我应该用平均值或中值替换这些异常值吗Python 计算周末销售额占总销售额的百分比,以及如何处理银行假期等例外情况,python,pandas,date,pandas-groupby,Python,Pandas,Date,Pandas Groupby,我有一个每日销售数据框 我想创建一个KPI,以了解周末销售如何影响每周销售,以及正常工作日如何影响每周销售 我创建了一个工作代码,作为下面的示例,它是有效的 但是: 1) (第一个主要问题)我认为可以用一种更为通灵的方式来改进,但我不知道如何改进 2) (第二个小问题)如果是销售过低的银行假日或销售过高的特殊假日,我应该用平均值或中值替换这些异常值吗 #Generating a Random Sample np.random.seed(30) values=np.random.randint(0
#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
我花了一些时间试图真正理解你是如何处理这个问题的,以及是否有其他方法来看待这个问题 无论如何,我都不是专业人士,所以对这一切都要三思而后行:
.mean()
(正如您在我的代码中看到的)而不是
.sum()
查找平均销售额中的比率差异我花了一些时间试图真正理解你是如何处理这个问题的,以及是否有其他方法来看待这个问题 无论如何,我都不是专业人士,所以对这一切都要三思而后行:
.mean()
(正如您在我的代码中看到的)而不是
.sum()
查找平均销售额中的比率差异嗨,我很想评论一下乌克兰哔叽布的回答,但最终由于50分的声誉规则,这是不可能的,但我不在乎,我无论如何都想做出贡献 我想指出,从技术上讲,你的回答只回答了问题的后半部分: 我想创建一个KPI,以了解周末销售如何影响每周销售,以及正常工作日如何影响每周销售 实际上,通过对同一周数进行分组,我们创建了KPI,其因果关系为Weekdays-->Weekend,反之,我们应使用:
#分组并使用平均值
工作日=(df_test[df_test.date.dt.weekday.isin([0,1,2,3,4]))
.groupby(df_测试日期dt周)
.mean())
#分组并使用平均值
周末=(df_test[df_test.date.dt.weekday.isin([5,6]))
.groupby(df_test.date.dt.week-1)
.mean())
为了找到周末-->工作日因果关系您好,我想对乌克兰哔叽回答发表意见,但最终由于50分声誉规则,这是不可能的,但我不在乎,我无论如何都想做出贡献 我想指出,从技术上讲,你的回答只回答了问题的后半部分: 我想创建一个KPI,以了解周末销售如何影响每周销售,以及正常工作日如何影响每周销售 实际上,通过对同一周数进行分组,我们创建了KPI,其因果关系为Weekdays-->Weekend,反之,我们应使用:
#分组并使用平均值
工作日=(df_test[df_test.date.dt.weekday.isin([0,1,2,3,4]))
.groupby(df_测试日期dt周)
.mean())
#分组并使用平均值
周末=(df_test[df_test.date.dt.weekday.isin([5,6]))
.groupby(df_test.date.dt.week-1)
.mean())
为了找到周末-->工作日因果关系问题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%。那周只是一个异常值吗?问题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%。那一周只是个例外吗
# 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()))