《Python数据分析与挖掘实战》第12章(上)——协同推荐

    counts1_ = DataFrame(counts1)
    counts1_[1]=1 # 添加1列全为1
    a = counts1_.groupby('realIP').sum()#统计各个“不同点击次数”分别出现的次数# 也可以使用counts1_['realIP'].value_counts()功能
    a.columns=[u'用户数']
    a.index.name = u'点击次数'
    a[u'用户百分比'] = a[u'用户数']/a[u'用户数'].sum()*100
    a[u'记录百分比'] = a[u'用户数']*a.index/counts1_['realIP'].sum()*100
    a.sort_index(inplace = True)
    b = a.iloc[:7,:]
    c = b.T
    c
[/code]

![](https://img-
blog.csdn.net/2018021201325463?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjA2Mzc3Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

###  **2.2.2** 统计1~7次数及7次以上的

```code
    c.insert(0,u'总计',[a[u'用户数'].sum(),100,100])
    c[u'7次及以上'] = c.iloc[:,0]- c.iloc[:,1:].sum(1)
    #保存的表名命名格式为“1_1_k此表功能名称”,此表表示生成的第1张表格,功能为clickTimes:统计网页点击情况
    c.to_excel('1_2_1clickTimes.xlsx')
    c
[/code]

![](https://img-
blog.csdn.net/20180212013353141?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjA2Mzc3Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

```code
    # 转置表格,并将所有输出保留两位小数
    d = c.T
    format = lambda x: '%.2f' % x  # 也可以使用d.round(4)
    d = d.applymap(format)
[/code]

```code
    # 分析浏览次数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
[/code]

![](https://img-
blog.csdn.net/20180212013517710?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjA2Mzc3Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

###  **2.2.3** 对浏览一次的用户行为进行分析

```code
    # 获取浏览一次的所有数据
    f = counts1_[counts1_['realIP']==1]
    del f[1]
    f.columns = [u'点击次数']
    f.index.name = 'realIP'
    # g = [pd.merge(f,i[['fullURLId','fullURL','realIP']],right_on = 'realIP',left_index=True,how ='left') for i in sql]
    g = [i[['fullURLId','fullURL','realIP']] for i in sql]
    g = pd.concat(g)
    h = pd.merge(f,g,right_on = 'realIP',left_index=True,how ='left')
    h
[/code]

![](https://img-
blog.csdn.net/2018021201364835?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjA2Mzc3Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

```code
    # 浏览一次的用户的网页类型ID分析
    i = h['fullURLId'].value_counts()
    i = DataFrame(i)
    i.rename(columns={'fullURLId':u'个数'},inplace=True)
    i.index.name = u'网页类型ID'
    i[u'百分比'] = i[u'个数']/i[u'个数'].sum()*100
    
    #保存的表名命名格式为“1_2_k此表功能名称”,此表表示生成的第2张表格,功能为typeID:浏览一次的用户的网页类型ID分析
    i.to_excel('1_2_2typeID.xlsx')
    i
[/code]

![](https://img-
blog.csdn.net/20180212013721509?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjA2Mzc3Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

```code
    j.loc[u'其他',u'个数'] = i[i[u'个数']<=100][u'个数'].sum()
    j.loc[u'其他',u'百分比'] = 100-i[i[u'个数']>100][u'百分比'].sum()
    j# 浏览一次的用户中浏览的网页类型ID
[/code]

![](https://img-
blog.csdn.net/2018021201381231?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjA2Mzc3Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

```code
    # 点击1次用户浏览网页统计(点击数大于100次的)
    k = DataFrame(h['fullURL'].value_counts())
    k.index.name = u'网址'
    k.columns = [u'点击数']
    m = k[k[u'点击数'] > 100]
    m.loc[u'其他',u'点击数'] = k[k[u'点击数']<=100][u'点击数'].sum()
    m[u'百分比'] = m[u'点击数']/k[u'点击数'].sum()
    #保存的表名命名格式为“1_2_k此表功能名称”,此表表示生成的第3张表格,功能为lookMorethan100:点击1次用户浏览网页统计(点击数大于100次的)
    m.to_excel('1_2_3lookMorethan100.xlsx')
    m
[/code]

![](https://img-
blog.csdn.net/20180212013839447?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjA2Mzc3Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

##  2.3 网页排名分析

目标:网页排名分析 获得各个网页点击率排名以及类型点击率排名:统计分析原始数据用户浏览网页次数(以“真实IP”区分)

  

###  **2.3.1** 获取网页点击排名

```code
     engine = create_engine('mysql+pymysql://root:@127.0.0.1:3306/jing?charset=utf8')
    sql = pd.read_sql('all_gzdata', engine, chunksize = 10000)
    
    def clickfreq(i): #自定义统计函数
        j = i[['fullURL','fullURLId','realIP']][i['fullURL'].str.contains('\.html')]
        return j
    
    counts1 = [clickfreq(i) for i in sql] # 分块统计各个IP的出现次数
    counts1 = pd.concat(counts1)
    
    counts1_ = counts1['fullURL'].value_counts()
    counts1_ = DataFrame(counts1_)
    
    counts1_.columns = [u'点击次数']
    counts1_.index.name = u'网址'
    a = counts1_.sort_values(u'点击次数',ascending=False).iloc[:20,:]
    a
[/code]

![](https://img-
blog.csdn.net/20180212014157357?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjA2Mzc3Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

###  **2.3.2** 获取网页点击排名数筛选出点击次数>50的有html结尾的网址

```code
    b = counts1_.reset_index()
    c = b[b[u'点击次数']>50][b[u'网址'].str.contains('/\d+?_*\d+?\.html')]
    c.set_index(u'网址',inplace=True)
    c.sort_index(inplace = True)
    # savetosql(c, 'count355')# 并保存到数据库中
    c
[/code]

![](https://img-
blog.csdn.net/20180212014337490?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjA2Mzc3Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

###  **2.3.3** 翻页网页统计,对浏览网页翻页的情况进行统计

```code
    # 获取网址中以http://与.html中间的主体部分,即去掉翻页的内容,即去掉尾部"_d"
    import re
    import numpy as np
    pattern = re.compile('http://(.*\d+?)_\w+_\w+\.html$|http://(.*\d+?)_\w+\.html$|http://(.*\w+?).html$',re.S)
    c['websitemain'] = np.nan
    for i in range(len(c)):
        items = re.findall(pattern, c.index[i])
        if len(items)== 0:
            temp = np.nan
        else:
            for j in items[0]:
                if j !='':
                    temp = j
        c.iloc[i,1] = temp
    c
[/code]

![](https://img-
blog.csdn.net/20180212014521854?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjA2Mzc3Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

```code
    # 获取所有网页主体的网页数
    d = c['websitemain'].value_counts()
    d = DataFrame(d)
    d
[/code]

![](https://img-
blog.csdn.net/20180212014542531?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjA2Mzc3Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

```code
    # 统计网页主体出现次数为不少于二次的,即存在翻页的网址
    e = d[d['websitemain']>=2]
    e.columns=['Times']#记录某网页及子网页出现的此处
    e.index.name='websitemain'# 主网页
    
    e['num'] = np.arange(1,len(e)+1) 
    f = pd.merge(c,e,left_on='websitemain',right_index=True,how='right')
    f.sort_index(inplace=True)
    f['per'] = np.nan
    f# 相同num的网页是拥有同一网页主体
[/code]

```code
    # 统计翻子页的点击率与上一页网页点击率的比重(注意:用此处这个方法对网页翻页后序号有10页及以上的合适
    def getper(x):
        x.sort_index(inplace=True) #必须先排序将网页
        print x
        for i in range(len(x)-1):
            x.iloc[i+1,-1] = x.iloc[i+1,0]/x.iloc[i,0]
        return x    
            
    from __future__ import division
    
    result = DataFrame([]) # 用一个空表格记录值
    for i in range(1,f['num'].max()+1):#count36['num'].max()+1
        k= getper(f[f['num'] == i])
        result = pd.concat([result,k])# 每次进行一次操作时
[/code]

```code
    f['Times'].value_counts() # 由统计结果看,只有一个主网址出现过10次及以上,该数据采用上述方法会出问题,因此,在结果中将其剔除后观察剩余数据
[/code]

![](https://img-
blog.csdn.net/20180212014710295?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjA2Mzc3Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

```code
    flipPageResult = result[result['Times']<10]
    #保存的表名命名格式为“1_3_k此表功能名称”,是此小节生成的第1张表格,功能为flipPageResult:统计翻子页的点击率与上一页网页点击率的比重
    flipPageResult.to_excel('1_3_1flipPageResult.xlsx')
    flipPageResult
[/code]

![](https://img-
blog.csdn.net/20180212014743864?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjA2Mzc3Mw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

  
  
** 备注:本章完整代码请见 [ 点击打开链接
](https://github.com/clover95/DataAnalysisbyPython/tree/master/chapter12) **  


![在这里插入图片描述](https://img-blog.csdnimg.cn/20210608151750993.gif)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值