# 最后一次浏览距今的天数
days_browse = df[df['behavior_type']==1].groupby('user_id')['date'].max().agg([lambda x:(datetime.strptime('2014-12-19','%Y-%m-%d')-x).days]).reset_index()
labels= pd.merge(labels,days_browse,how='left',on='user_id')
labels.rename(columns={'<lambda>':'days_browse'},inplace=True)
labels.head(10)
# 最后一次加购物车距今的天数
days_cart = df[df['behavior_type']==3].groupby('user_id')['date'].max().agg([lambda x:(datetime.strptime('2014-12-19','%Y-%m-%d')-x).days]).reset_index()
labels= pd.merge(labels,days_cart,how='left',on='user_id')
labels.rename(columns={'<lambda>':'days_cart'},inplace=True)
labels.head()
# 最后一次购买距今天数
days_buy = df[df['behavior_type']==4].groupby('user_id')['date'].max().agg([lambda x:(datetime.strptime('2014-12-19','%Y-%m-%d')-x).days])
labels = pd.merge(labels,days_buy,how='left',on='user_id')
labels.rename(columns={'<lambda>':'days_buy'},inplace=True)
labels.head()
# 最近两次购买间隔天数
df_interval_buy = df[df['behavior_type']==4].groupby(['user_id','date']).item_id.count().reset_index()
interval_buy = df_interval_buy.groupby('user_id')['date'].apply(lambda x:x.sort_values().diff(1).dropna().head(1)).reset_index()
interval_buy['date'] = interval_buy['date'].apply(lambda x:x.days)
interval_buy.drop('level_1',axis=1,inplace=True)
interval_buy.rename(columns={'date':'interval_buy'},inplace=True)
labels = pd.merge(labels,interval_buy,how='left',on='user_id')
labels.head()
# 用户是否存在浏览未下单行为
df_browse_buy = df.loc[(df['behavior_type']==1) | (df['behavior_type']==4),['user_id','item_id','behavior_type','time']]
browse_not_buy = pd.pivot_table(df_browse_buy,index=['user_id','item_id'],columns=['behavior_type'],values=['time'],aggfunc=['count'])
browse_not_buy.fillna(0,inplace=True)
browse_not_buy.columns=['browse','buy']
# 添加了一列browse_not_buy,初始值为0。
browse_not_buy['browse_not_buy']=0
# 浏览数>0,购买数=0的数据输出1.
browse_not_buy.loc[(browse_not_buy['browse']>0) & (browse_not_buy['buy']==0),'browse_not_buy']=1
browse_not_buy = browse_not_buy.groupby('user_id')['browse_not_buy'].sum().reset_index()
labels = pd.merge(labels,browse_not_buy,how='left',on='user_id')
labels['browse_not_buy'] = labels['browse_not_buy'].apply(lambda x:'是' if x>0 else '否')
labels.head()
# 是否存在加购物车未下单行为
df_cart_buy = df.loc[(df['behavior_type']==3) | (df['behavior_type']==4),['user_id','item_id','behavior_type','time']]
cart_not_buy = pd.pivot_table(df_cart_buy,index=['user_id','item_id'],columns=['behavior_type'],values=['time'],aggfunc=['count'])
cart_not_buy.columns = ['cart','buy']
cart_not_buy.fillna(0,inplace=True)
cart_not_buy['cart_not_buy']=0
cart_not_buy.loc[(cart_not_buy['cart']>0) & (cart_not_buy['buy']==0),'cart_not_buy']=1
cart_not_buy = cart_not_buy.groupby('user_id')['cart_not_buy'].sum().reset_index()
labels = pd.merge(labels,cart_not_buy,how='left',on='user_id')
labels['cart_not_buy'] = labels['cart_not_buy'].apply(lambda x: '是' if x>0 else '否')
labels.head()
# 是否复购用户
buy_again = df[df['behavior_type']==4].groupby('user_id')['item_id'].count().reset_index()
buy_again.rename(columns={'item_id':'buy_again'},inplace=True)
labels=pd.merge(labels,buy_again,how='left',on='user_id')
labels['buy_again'].fillna(-1,inplace=True)
labels['buy_again'] = labels['buy_again'].apply(lambda x:'是' if x>1 else '否' if x==1 else '未购买')
labels.head()
# 访问活跃度
user_active_level = labels['counts_30_active'].value_counts().sort_index(ascending=False)
plt.figure(figsize=(16,9))
user_active_level.plot(title='30天内访问次数与访问人数的关系',fontsize=18)
plt.xlabel('访问次数',fontsize=15)
plt.ylabel('访问人数',fontsize=15)
labels['user_active_level']='高'
labels.loc[labels['counts_30_active']<=20,'user_active_level'] = '低'
labels.head()
# 购买活跃度
buy_active_level = labels['counts_30_buy'].value_counts().sort_index(ascending=False)
plt.figure(figsize=(16,9))
buy_active_level.plot(title='30天内购买次数与购买人数的关系',fontsize=18)
plt.xlabel('购买次数',fontsize=15)
plt.ylabel('购买人数',fontsize=15)
# 定义购买活跃度标签
labels['buy_active_level'] = '高'
labels.loc[labels['counts_30_buy']<=15,'buy_active_level'] = '低'
labels.head()
# 购买品类是否单一
buy_single = df[df['behavior_type']==4].groupby('user_id').item_category.nunique().reset_index()
buy_single.rename(columns={'item_category':'buy_single'},inplace=True)
labels = pd.merge(labels,buy_single,how='left',on='user_id')
labels['buy_single'].fillna(-1,inplace=True)
labels['buy_single'] = labels['buy_single'].apply(lambda x:'是' if x>1 else '否' if x==1 else '未购买')
labels.head()
# 用户价值分组RFM
last_buy_days = labels['days_buy'].value_counts().sort_index()
plt.figure(figsize=(16,9))
last_buy_days.plot(title='最后一次购买距今天数与购买人数的关系',fontsize=18)
plt.xlabel('距今天数',fontsize=15)
plt.ylabel('购买人数',fontsize=15)
labels['buy_days_level'] = '高'
labels.loc[labels['days_buy']>8,'buy_days_level'] = '低'
labels.head()
# 利用用户活跃程度和最近购买两个指标来计算RFM
labels['rfm_value'] = labels['user_active_level'].str.cat(labels['buy_days_level'])
def trans_value(x):
if x=='高高':
return '重要价值客户'
elif x=='低高':
return '重要深耕客户'
elif x=='高低':
return '重要召回客户'
else:
return '即将流失客户'
labels['rfm'] = labels['rfm_value'].apply(trans_value)
labels.head()
labels.drop(['buy_days_level','rfm_value'],axis=1,inplace=True)
labels['rfm'].value_counts()
# 作柱状图
labels['rfm'].value_counts().plot.bar()
plt.xticks(rotation=0)