源数据来源于: https://tianchi.aliyun.com/dataset/dataDetail?dataId=649&userId=1
可以注册他的账号之后,免费下载。
以下是我下载的数据分享:
链接:https://pan.baidu.com/s/1uGddx2BzRdNencKnyN4quQ 提取码:puam
UserBehavior是阿里巴巴提供的一个淘宝用户行为数据集,用于隐式反馈推荐问题的研究。
数据集介绍
文件名称说明包含特征UserBehavior.csv包含所有的用户行为数据用户ID,商品ID,商品类目ID,行为类型,时间戳UserBehavior.csv
本数据集包含了2017年11月25日至2017年12月3日之间,有行为的约一百万随机用户的所有行为(行为包括点击、购买、加购、喜欢)。数据集的组织形式和MovieLens-20M类似,即数据集的每一行表示一条用户行为,由用户ID、商品ID、商品类目ID、行为类型和时间戳组成,并以逗号分隔。关于数据集中每一列的详细描述如下:
列名称说明用户ID整数类型,序列化后的用户ID商品ID整数类型,序列化后的商品ID商品类目ID整数类型,序列化后的商品所属类目ID行为类型字符串,枚举类型,包括('pv', 'buy', 'cart', 'fav')时间戳行为发生的时间戳注意到,用户行为类型共有四种,它们分别是
行为类型说明pv商品详情页pv,等价于点击buy商品购买cart将商品加入购物车fav收藏商品关于数据集大小的一些说明如下
维度数量用户数量987,994商品数量4,162,024商品类目数量9,439所有行为数量100,150,807活跃度整理: 按一日的时刻来统计哪个时间段活动程度,从所有的数据里面取了:1万条数据进行统计:
如下图所示:
def time_data(): data=get_data() #转换时间 data['time']=pd.to_datetime(data['timestamp'],unit='s') # 先设置索引再清洗数据 data.set_index('time',inplace=True) data=data.drop(['timestamp'],axis=1) data=data['2017-11-25':'2017-12-3'] data.reset_index(inplace=True) # 提取,周,日,时 data['week']=data['time'].dt.weekday data['day']=data['time'].dt.day data['hour']=data['time'].dt.hour data['date']=data['time'].dt.date data.drop_duplicates(['user_id','time','category_id'],keep='first',inplace=True) return data # 天不同时间段的活跃度 def day_report(): data=time_data() # 根据hour分组,以用户id为主计算每个用户活跃次数 day_active=data.groupby('hour')['user_id'].count().reset_index().rename(columns={'user_id':'Count'}) # user_id 表名? day_data=day_active # 打印柱状图 x=day_data.hour.tolist() y=day_data.Count.tolist() plt.figure(figsize=(20,8),dpi=80) day_plt=plt.bar(range(len(x)),y,width=0.3) # x刻度 x_ticks=('{}点'.format(i) for i in x) plt.xticks(x) plt.xlabel('时间点') plt.ylabel('用户活跃数') plt.title('日活跃度统计分析表') # 设置每一柱的具体值 for dd in day_plt: d_pat=dd # type: matplotlib.patches.Rectangle height_value = d_pat.get_height() plt.text(d_pat.get_x()+d_pat.get_width()/2,height_value+10,str(height_value),ha='center',color='r') plt.show()按以上的时刻统计出来的活跃程序不正常,晚上下班的活跃程序不如三更半夜。不知道哪里出错了。?????
问题分析 :时间戳按子午线时间存储,需要转换成北京时间东8区的,需要加8个小时。调用python内部的接口转换。
已经找到解决方法了,重新参考了网上的代码,用:time.localtime,这个方法转换时间如下:重写的time_data()方法:
def time_data(): data=get_data() data.drop_duplicates(subset=['user_id','goods_id','timestamp'], keep='first',inplace=True) def stramp2time(x): return time.strftime('%Y-%m-%d %H',time.localtime(x)) data['date']=data['timestamp'].apply(stramp2time) #将时间戳转化为时间元组,再转换为标准的时间:time.localtime data['date']=pd.to_datetime(data['date']) # 转换为datetiem格式 data['week']=data['date'].dt.weekday data['day'] = data['date'].dt.day data['hour'] = data['date'].dt.hour # 获取时间是17.11.25至17.12.3之间的数据,去掉无效数据 tl=datetime.datetime(year=2017,month=11,day=25) th = datetime.datetime(year=2017,month=12,day=3) data = data[(data.date>=tl) & (data.date<=th)] return data生成的日活跃度的数据流正常了。