第12章 电子商务网站用户行为分析及服务推荐-代码调整实现

一、环境说明

1.Python3以上版本
2.已经插入与数据分析相关第三方库:Numpy,Scipy,Matplotlib,Pandas,StatsModels,Scikit-Learn,Keras,Gensim等
3.插入第三方数据库连接库,如mysql

二、Python3.7下对该章代码调整

1.关于12-1_sql_value_counts.py代码调整

说明:对于书中原代码的调整处已经在相应部分注释,同时请各读者注意连接数据库驱动密码的修改,另外,有些部分添加了一些print语句,目的是为了更好的阅读程序,同时请读者对照书中提供代码进行参照。

import pandas as pd
from sqlalchemy import create_engine
engine = create_engine('mysql://root:root@127.0.0.1:3306/7law?charset=utf8')#第一处调整
sql = pd.read_sql('all_gzdata', engine, chunksize = 10000)
print(sql)  #测试数据库是否连接成功
'''
用create_engine建立连接,连接地址的意思依次为“数据库格式(mysql)+程序名(pymysql)+账号密码@地址端口/数据库名(test)”,最后指定编码为utf8;
all_gzdata是表名,engine是连接数据的引擎,chunksize指定每次读取1万条记录。这时候sql是一个容器,未真正读取数据。
'''
counts = [ i['fullURLId'].value_counts() for i in sql] #逐块统计
#print(counts)
counts = pd.concat(counts).groupby(level=0).sum() #合并统计结果,把相同的统计项合并(即按index分组并求和)
#print(counts)
counts = counts.reset_index() #重新设置index,将原来的index作为counts的一列。
#print(counts)
counts.columns = ['index', 'num'] #重新设置列名,主要是第二列,默认为0
counts['type'] = counts['index'].str.extract('(\d{3})') #提取前三个数字作为类别id
counts_ = counts[['type', 'num']].groupby('type').sum() #按类别合并
#counts_.sort('num', ascending = False)
counts_.sort_values('num', ascending = False) #降序排列 第二处调整
#print(counts_.sort_values('num', ascending = False))

#统计107类别的情况
sql = pd.read_sql('all_gzdata', engine, chunksize = 10000)  #该句的重复及其重要,若省略会造成该句以下获取sql内容为空[] ,第三处调整
def count107(i): #自定义统计函数
  j = i[['fullURL']][i['fullURLId'].str.contains('107')].copy() #找出类别包含107的网址
  j['type'] = None #添加空列
  j['type'][j['fullURL'].str.contains('info/.+?/')] = u'知识首页'
  j['type'][j['fullURL'].str.contains('info/.+?/.+?')] = u'知识列表页'
  j['type'][j['fullURL'].str.contains('/\d+?_*\d+?\.html')] = u'知识内容页'
  return j['type'].value_counts()

#print([i[['fullURL']][i['fullURLId'].str.contains('107')]for i in sql]) #测试是否重新读取到sql中内容

counts2 = [count107(i) for i in sql] #逐块统计
counts2 = pd.concat(counts2).groupby(level=0).sum() #合并统计结果
#print(counts2)

#统计点击次数
sql = pd.read_sql('all_gzdata', engine, chunksize = 10000)  #该句的重复及其重要,若省略会造成该句以下获取sql内容为空[] ,第四处调整
c = [i['realIP'].value_counts() for i in sql] #分块统计各个IP的出现次数
count3 = pd.concat(c).groupby(level = 0).sum() #合并统计结果,level=0表示按index分组
count3 = pd.DataFrame(count3) #Series转为DataFrame
count3[1] = 1 #添加一列,全为1
#count3.groupby('realIP').sum()
count3.groupby('realIP').sum() #统计各个“不同的点击次数”分别出现的次数,第五处调整
#print(count3.groupby('realIP').sum())  

2.关于12-5_sql_clean_save.py代码调整

import pandas as pd
from sqlalchemy import create_engine

engine = create_engine('mysql://root:root@127.0.0.1:3306/7law?charset=utf8')#替换该处即可
sql = pd.read_sql('all_gzdata', engine, chunksize = 10000) 

for i in sql:
  d = i[['realIP', 'fullURL']] #只要网址列
  d = d[d['fullURL'].str.contains('\.html')].copy() #只要含有.html的网址
  #保存到数据库的cleaned_gzdata表中(如果表不存在则自动创建)
  d.to_sql('cleaned_gzdata', engine, index = False, if_exists = 'append')

 

3.其它几个py源码调试较为简单,不在一一列出

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值