【问题标题】:Calculate recurring customer计算经常性客户
【发布时间】:2019-09-09 18:11:20
【问题描述】:

我正在分析一家商店的销售数据,并想计算在下个月变成回头客的“首次订购客户”的百分比。

我有一个包含所有订单的 DataFrame。如果这是他/她的第一个订单,这包括客户 ID、日期和标志。这是我的数据:

import pandas as pd 

data = {'Name': ['Tom', 'nick', 'krish', 'Tom'], 
        'First_order': [1, 1, 1, 0], 
        'Date' :['01-01-2018', '01-01-2018', '01-01-2018', '02-02-2018']} 

df = pd.DataFrame(data) 

我现在将在 1 月份创建一个所有新客户的列表,并在 2 月份创建一个所有经常性客户的列表,然后加入他们。然后我有两个数字可以用来计算百分比。

但我不知道,如何在不遍历数据框的情况下计算一整年的滚动。有没有一种不错的 pandas/python 方法可以做到这一点?

目标是创建一个新的数据框,其中包含月份和上个月的回头客百分比。

【问题讨论】:

  • 您对这些数据的预期输出是什么?
  • 数据 = {'percentage_of_recurring_cust':['25%', '10%'], '日期':['JAN2018', 'FEB2018']}
  • 为什么 Jan 是 25% 而不是 33%?为什么二月是10%
  • 对不起。刚刚发布了数据结构。一月份不会有任何经常性客户。因为我们没有 12 月份的数据.... 2 月份的 33% 是正确的

标签: python pandas dataframe


【解决方案1】:

一个想法是接受 1 月至 11 月的所有订单,并有一个“reccurr”列,根据该客户是否在下个月订购,它会为您提供真/假。然后,您可以使用包含真/假计数/总和的每月 groupby 并添加一个给出比率的列。

编辑:在此之前您可能需要转换日期:

df.Date = pd.to_datetime(df.Date)

然后:

df['month'] = df['Date'].apply(lambda x: x.month) #this is for simplicity's sake, not hard to extend to MMYYYY
df1 = df[df.month != 12].copy() #now we select everything but Nov
df1 = df1[df1.First_order == 1].copy() #and filter out non-first orders
df1['recurr'] = df1.apply(lambda x: True if len(df[(df.month == x.month + 1)&(df.Name == x.Name)])>0 else False, axis=1) #Now we fill a column with True if it finds an order from the same person next month
df2 = df1[['month','Name','recurr']].groupby('month').agg({'Name':'count','recurr':'sum'})

此时,对于每个月,“名称”列都有第一个订单的数量,“重复”列有下个月再次订购的数量。一个简单的额外列为您提供百分比:

df2['percentage_of_recurring_customer'] = (df2.recurr/df2.Name)*100

编辑:对于任意数量的日期,这是一个笨拙的解决方案。选择一个开始日期并将当年的 1 月用作第 1 个月,然后按顺序编号之后的所有月份。

df.Date = pd.to_datetime(df.Date)
start_year = df.Date.min().year
def get_month_num(date):
    return (date.year-start_year)*12+date.month

现在我们有了转换日期的函数,代码稍作改动:

df['month'] = df['Date'].apply(lambda x: get_month_num(x))
df1 = df[df.First_order == 1].copy()
df1['recurr'] = df1.apply(lambda x: True if len(df[(df.month == x.month + 1)&(df.Name == x.Name)])>0 else False, axis=1)
df2 = df1[['month','Name','recurr']].groupby('month').agg({'Name':'count','recurr':'sum'})

最后,您可以创建一个函数将您的月份数字还原​​为日期:

def restore_month(month_num):
    year = int(month_num/12)+start_year #int rounds down so we can do this.
    month = month_num%12 #modulo gives us month
    return pd.Timestamp(str(year)+'-'+str(month)+'-1') #This returns the first of that month
df3 = df2.reset_index().copy() #removing month from index so we can change it.
df3['month_date'] = df3['month'].apply(lambda x: restore_month(x))

【讨论】:

  • 酷。看起来它正在工作:) 只是为了清楚起见......为什么你选择除了 11 月之外的所有东西,但不包括月份!= 12?如果我有超过一年的时间怎么办?它是否也适用于日期或 MMYY... 因为您要在月份中添加一个欢呼和感谢!
  • 因为我做了一年多,并且我们正在与下个月进行比较,所以 12 月的第一批订单没有“下个月”——这就是我删除 12 的原因。我只是懒得添加处理多年的方法:P 如果您需要添加,请告诉我,我会进行编辑。
  • 完成!如果您有任何问题,请告诉我。
猜你喜欢
  • 2018-06-20
  • 1970-01-01
  • 2018-02-21
  • 1970-01-01
  • 2019-10-14
  • 2015-10-13
  • 2011-06-29
  • 2017-02-27
  • 1970-01-01
相关资源
最近更新 更多