Python 计算经常性客户

Python 计算经常性客户,python,pandas,dataframe,Python,Pandas,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',

我正在分析一家商店的销售数据,想计算下个月“第一批订单客户”转变为经常性客户的百分比

我有一个包含所有订单的数据框。这包括客户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月份创建一个所有定期客户的列表,然后加入他们。然后我有两个数字可以用来计算百分比

但我不知道,我怎么能不在数据框架上循环计算一整年的滚动。有没有一种很好的熊猫/蟒蛇方法


我们的目标是建立一个新的数据框架,其中包含当月和上个月的定期客户百分比。

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

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

df.Date = pd.to_datetime(df.Date)
然后:

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

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))

你对这些数据的预期输出是什么?数据={'percentage_of_Recurrentive_cust':['25%,'10%,'Date':['JAN2018','FEB2018']}为什么Jan是
25%
而不是
33%
?为什么二月是
10%
?啊,对不起。刚刚发布了数据结构。一月份将不会有任何定期客户。因为我们没有12月的数据。。。。2月份的33%会很酷。看起来它在工作:)只是为了清楚。。。为什么选择除11月以外的所有选项,但不包括月份!=12? 如果我有超过一年的时间呢?它是否也适用于日期或MMYY。。。因为你在这个月增加了一个,干杯,谢谢!因为我已经做了一年多了,我们要和下个月比较,12月份的第一批订单没有“下个月”——这就是为什么我删除了12个。我只是懒得添加一个处理多年的方法:P如果你需要添加,请告诉我,我会进行编辑。完成!如果您有任何问题,请告诉我。
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))