【问题标题】:Week difference from current week to last day previous week本周与前一周最后一天的周差
【发布时间】:2017-05-04 01:28:29
【问题描述】:

我有一个使用 pivot_table 方法从另一个 pandas 数据框(按商店销售)创建的数据透视表 Pandas 数据框(按地区销售)。

举个例子:

df = pd.DataFrame(
    {'store':['A','B','C','D','E']*7, 
     'region':['NW','NW','SW','NE','NE']*7, 
     'date':['2017-03-30']*5+['2017-04-05']*5+['2017-04-07']*5+['2017-04-12']*5+['2017-04-13']*5+['2017-04-17']*5+['2017-04-20']*5,
     'sales':[30,1,133,9,1,30,3,135,9,11,30,1,140,15,15,25,10,137,9,3,29,10,137,9,11,30,19,145,20,10,30,8,141,25,25]
     })
df_sales = df.pivot_table(index = ['region'], columns = ['date'], aggfunc = [np.sum], margins = True)
df_sales = df_sales.ix[:,range(0, df_sales.shape[1]-1)]

我的目标是对销售数据框执行以下操作。

添加一个名为“周差”的列,用于计算本周的总销售额与前一周的最新值(按日期)之间的差值。假设:我每周总是有几天的数据,但不是固定的日子。 随着新数据的到来,周差列会有所不同,但对于最新数据,如下所示:

>>> df_sales
              sum                                                         \
            sales                                                          
date   2017-03-30 2017-04-05 2017-04-07 2017-04-12 2017-04-13 2017-04-17   
region                                                                     
NE           10.0       20.0       30.0       12.0       20.0       30.0   
NW           31.0       33.0       31.0       35.0       39.0       49.0   
SW          133.0      135.0      140.0      137.0      137.0      145.0   
All         174.0      188.0      201.0      184.0      196.0      224.0   



date   2017-04-20 WeekDifference 
region             
NE           50.0    50.0-20.0
NW           38.0    38.0-39.0
SW          141.0    141.0-137.0
All         229.0    229-196.0

因为它是最晚日期和前一周最晚日期之间的差异。在这个具体的例子中,我们是在 2017-04-20 周,前一周数据的最后一天是 2017-04-13。

随着数据的更新,我想以一般方式执行此操作。

【问题讨论】:

    标签: pandas datetime


    【解决方案1】:
    df = pd.DataFrame(
        {'store':['A','B','C','D','E']*7, 
         'region':['NW','NW','SW','NE','NE']*7, 
         'date':['2017-03-30']*5+['2017-04-05']*5+['2017-04-07']*5+['2017-04-12']*5+['2017-04-13']*5+['2017-04-17']*5+['2017-04-20']*5,
         'sales':[30,1,133,9,1,30,3,135,9,11,30,1,140,15,15,25,10,137,9,3,29,10,137,9,11,30,19,145,20,10,30,8,141,25,25]
         })
    df_sales = df.pivot_table(index = ['region'], columns = ['date'], aggfunc = [np.sum], margins = True)
    df_sales = df_sales.ix[:,range(0, df_sales.shape[1]-1)]
    

    输入:

                  sum                                                         \
                sales                                                          
    date   2017-03-30 2017-04-05 2017-04-07 2017-04-12 2017-04-13 2017-04-17   
    region                                                                     
    NE           10.0       20.0       30.0       12.0       20.0       30.0   
    NW           31.0       33.0       31.0       35.0       39.0       49.0   
    SW          133.0      135.0      140.0      137.0      137.0      145.0   
    All         174.0      188.0      201.0      184.0      196.0      224.0   
    
    
    
    date   2017-04-20  weekdiffernce  
    region                            
    NE           50.0    50.0 - 20.0  
    NW           38.0    38.0 - 39.0  
    SW          141.0  141.0 - 137.0  
    All         229.0  229.0 - 196.0  
    

    计算上周和一周的偏移量:

    last_column = pd.to_datetime(df_sales.iloc[:,-1].name[2])
    

    last_week_column = last_column + pd.DateOffset(weeks=-1)

    col_mask = (pd.to_datetime(df_sales.columns.get_level_values(2)).weekofyear == (last_column.weekofyear-1))    
    

    df_sales.loc[:,('sum','sales','weekdiffernce')]=df_sales.iloc[:,-1].astype(str) + ' - '+df_sales.loc[ :,('sum','sales',last_week_column.strftime('%Y-%m-%d'))].astype(str)

    df_sales.loc[:,('sum','sales','weekdiffernce')]=df_sales.iloc[:,-1].astype(str) + ' - '+df_sales.loc[:,('sum','sales',list(col_mask))].iloc[:,-1].astype(str)
    
    print(df_sales)
    

    输出:

                  sum                                                         \
                sales                                                          
    date   2017-03-30 2017-04-05 2017-04-07 2017-04-12 2017-04-13 2017-04-17   
    region                                                                     
    NE           10.0       20.0       30.0       12.0       20.0       30.0   
    NW           31.0       33.0       31.0       35.0       39.0       49.0   
    SW          133.0      135.0      140.0      137.0      137.0      145.0   
    All         174.0      188.0      201.0      184.0      196.0      224.0   
    
    
    
    date   2017-04-20  weekdiffernce  
    region                            
    NE           50.0    50.0 - 20.0  
    NW           38.0    38.0 - 39.0  
    SW          141.0  141.0 - 137.0  
    All         229.0  229.0 - 196.0
    

    【讨论】:

    • 谢谢。这个答案假设我们总是有 1 周滞后的数据,但在我的问题中,我提到有些日子我有数据,而其他日子我没有。这就是为什么我需要前一周的最后一天。你介意指点我如何将这个答案推广到那个边缘情况吗?
    • 获取以前的记录 1 周或更长时间?是否存在您在 1 周内只有一天的极端情况?
    • 我希望行为能够与前一周的最后一天进行比较。例如,如果最新数据是 2017 年 4 月 17 日,则周差将是 2017 年 4 月 17 日和 2017 年 4 月 13 日销售额之间的差。而您的代码将改为比较数据中不存在的 2017-04-17 和 2017-04-10
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 2021-07-21
    • 2016-07-18
    • 2011-01-06
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    相关资源
    最近更新 更多