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)