标签:engine index 12 Python 推荐 sum count3 counts 统计
文章目录
《Python数据分析与挖掘实战》的实战部分的第12章的数据——《电子商务网站用户行为分析及服务推荐》。
用一种方法解决问题,然后再结合别人的分析思路,优化自己的解决方案。(sql数据可能导入不全)
旨在补充原文中的细节代码,并给出文中涉及到的内容的完整代码。
在作者所给代码的基础上增加的内容包括:
1)原书中所分析的内容中缺少的代码
2)实现了协同过滤推荐结果展示;
3)实现了按照流行度推荐以及随机推荐;
1 背景与目标分析
-
目标
分析某网站的用户访问记录,然后分析网页相关主题,分析用户网上访问行为;借助用户的访问记录,发现用户的访问习惯,对不同用户进行相关服务页面的推荐。 -
实质:推荐算法。
2.数据探索分析
- 读取数据
import pandas as pd
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:@localhost/wangye?charset=utf8')
sql = pd.read_sql('all_gzdata', engine, chunksize = 10000)
'''
用create_engine建立连接,连接地址的意思依次为“数据库格式(mysql)+程序名(pymysql)+账号密码@地址端口/数据库名(test)”,最后指定编码为utf8;
all_gzdata是表名,engine是连接数据的引擎,chunksize指定每次读取1万条记录。这时候sql是一个容器,未真正读取数据。
'''
2.1 网页类型分析
2.1.1 统计各个网页类型所占的比例
- 统计fullURLId的数量
counts = [ i['fullURLId'].value_counts() for i in sql] #按次10000存取,逐块统计
counts = pd.concat(counts).groupby(level=0).sum() #合并统计结果,把相同的统计项合并(即按index分组并求和)
counts = counts.reset_index() #重新设置index,将原来的index作为counts的一列。
counts.columns = ['index', 'num'] #重新设置列名,主要是第二列,默认为0
counts
- 提取前3个数字做网页类别
counts['type'] = counts['index'].str.extract('(\d{3})') #提取前三个数字作为类别id
counts
- 按类别合并
counts_ = counts[['type', 'num']].groupby('type').sum() #按类别合并
counts_.sort_values('num', ascending = False) #降序排列
counts_['percentage'] = (counts_['num']/counts_['num'].sum())*100
counts_.to_excel('./tmp/1_1_3type_counts.xlsx')
counts_
- 各网页类型中小类别占比
# 每个大类别下面小类别占比
a = counts.set_index(['type'])
b = counts.groupby('type').sum()
print(b)
c = pd.merge(a,b,left_index=True,right_index=True)
print(c)
添加网页类型百分比
c['persentage'] = (c['num_x']/c['num_y'])*100
del c['num_y']
c.rename(columns={'num_x':'num'},inplace=True)
c
2.1.2 网页107类型中的内部统计
- 统计各类型的数量
import pandas as pd
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:@localhost/wangye?charset=utf8')
sql = pd.read_sql('all_gzdata', engine, chunksize = 10000)
#统计107类别的情况
def count107(i): #自定义统计函数
j = i[['fullURL']][i['fullURLId'].str.contains('107')].copy() #找出类别包含107的网址
j['type'] = None #添加空列
j['type'][j['fullURL'].str.contains('info/.+?/')] = u'知识首页' #info以/结尾
j['type'][j['fullURL'].str.contains('info/.+?/.+?')] = u'知识列表页'
j['type'][j['fullURL'].str.contains('/\d+?_*\d+?\.html')] = u'知识内容页'
return j['type'].value_counts()
counts2 = [count107(i) for i in sql] #逐块统计
counts2 = pd.concat(counts2).groupby(level=0).sum() #合并统计结果
counts2.to_excel('./tmp/1_4type107.xlsx')
print(counts2)
- 百分比
#计算各个部分的占比
res107 = pd.DataFrame(counts2)
# res107.reset_index(inplace=True)
res107.index.name= u'107类型'
res107.rename(columns={'type':'num'},inplace=True)
res107[u'百分比'] = (res107['num']/res107['num'].sum())*100
res107.reset_index(inplace = True)
#保存的表名命名格式为“1_1_k+此表功能名称”,此表表示生成的第3张表格,功能为type107,计算知识类型各个小类型所占比例
res107.to_excel('1_1_3type107.xlsx')
res107
2.1.3 统计带"?"问号网址类型统计
2.1.4 统计199类型中的具体类型占比
2.1.5 统计瞎逛用户中各个类型占比
2.2 点击次数分析
目标:点击次数分析:统计分析原始数据用户浏览网页次数(以“真实IP”区分)的情况
2.2.1 统计点击次数
import pandas as pd
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://root:@localhost/wangye?charset=utf8')
sql = pd.read_sql('all_gzdata', engine, chunksize = 10000)
#统计点击次数
c = [i['realIP'].value_counts() for i in sql] #分块统计各个IP的出现次数
count3 = pd.concat(c).groupby(level = 0).sum() #合并统计结果,level=0表示按index分组
count_df = pd.DataFrame(count3) #Series转为DataFrame
count3=count_df
count3[1]=1 # 添加1列全为1
print(count3.head())
2.2.2 点击次数与用户数量关系
realIP_sum=count3['realIP'].sum()
print(realIP_sum)
count3= count3.groupby('realIP').sum()##统计各个“不同点击次数”分别出现的次数# 也可以使用counts1_['realIP'].value_counts()功能
print(count3.head())
count3.columns=[u'用户数']
count3.index.name = u'点击次数'
print(count3.head())
- 用户点击次数所占百分比
count3[u'用户百分比'] = count3[u'用户数']/count3[u'用户数'].sum()*100
count3[u'点击记录百分比'] = count3[u'用户数']*count3.index/realIP_sum*100
count3.sort_index(inplace = True)
c=count3.iloc[:7,]
c=c.T
c
2.2.3 统计1~7次数及7次以上的点击数
c.insert(0,u'总计',[count3[u'用户数'].sum(),100,100])
c[u'7次以上'] = c.iloc[:,0]- c.iloc[:,1:].sum(1)
c.to_excel('./tmp/2_2_2clickTimes.xlsx')
c
- 转置表格,并将所有输出保留两位小数
d = c.T
format = lambda x: '%.2f' % x # 也可以使用d.round(4)
d = d.applymap(format)
d.T
- 分析浏览次数7次以上的用户
# 分析浏览次数7次以上的数据
times = counts1_.index[7:]
bins = [7,100,1000,50000]
cats = pd.cut(times,bins,right=True,labels=['8~100','101~1000','1000以上'])
e = cats.value_counts()
e = DataFrame(e, columns =[u'用户数'])
e.index.name = u'点击次数'
e[u'用户数'] = np.nan
e.ix[u'8~100',u'用户数'] = a.loc[8:100,:][u'用户数'].sum()
e.ix['101~1000',u'用户数'] = a.loc[101:1000,:][u'用户数'].sum()
e.ix['1000以上',u'用户数'] = a.loc[1001:,:][u'用户数'].sum()
e.sort_values(by=u'用户数',ascending=False,inplace = True)
e.reset_index(inplace=True)
e
2.2.4 浏览一次的用户行为分析
2.3.1 点击次数为一的数据
标签:engine,index,12,Python,推荐,sum,count3,counts,统计 来源: https://blog.csdn.net/weixin_43746433/article/details/100515910
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。