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

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

我有一个每日销售数据框

我想创建一个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

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

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

  • 我认为没有比这更“pythonic”的方法来编写代码。虽然范围很广,但我可以告诉你我的大脑如何接近你的大脑 我所理解的问题是:
  • 我不知道它是否有用,但可能使用
    .mean()
    (正如您在我的代码中看到的)而不是
    .sum()
    查找平均销售额中的比率差异

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

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

  • 我认为没有比这更“pythonic”的方法来编写代码。虽然范围很广,但我可以告诉你我的大脑如何接近你的大脑 我所理解的问题是:
  • 我不知道它是否有用,但可能使用
    .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()))