python电影网站数据挖掘_python数据挖掘之网站用户访问推荐学习笔记

分为两部分

第一部分为数据清洗,规约,

第二部分为模型—协同过滤

本章为第一部分

先介绍原始数据,为一个500m的*.sql文件(数据库文件),因此我并没有照着原来教程的思路直接搞,决定先观察数据格式,于是准备将他导入到我电脑已经装有的mysql上。方式为,登入mysql,创建一个测试库(例如test或者我的7law),选择进库,source 路径,就能把文件导入到mysql中,500m也挺快的,不要1分钟。

然后观察到数据格式为一个法律在线网站,用户访问该网站留下的不同历史信息,包括用户id,ip,登入方式,客户端,网页信息,网页类型(这俩是重点)

接着用python看看网站类型(int型)都有哪些,(比如103002,103001,108005前面103108是大类,后面是小类)创建一个引擎,然后把sql表读进来,

#encoding=utf-8

import pandas as pd

from sqlalchemy import create_engine

import MySQLdb

engine=create_engine('mysql+mysqldb://root:123456@localhost:3306/7law?charset=utf8',echo=True)

sql=pd.read_sql('law',engine,chunksize=10000)

counts = [ i['fullURLId'].value_counts() for i in sql] #逐块统计

print counts[:1]

counts = pd.concat(counts).groupby(level=0).sum() #合并统计结果,把相同的统计项合并(即按index分组并求和)

counts = counts.reset_index() #重新设置index,将原来的index作为counts的一列。

counts.columns = ['index', 'num'] #重新设置列名,主要是第二列,默认为0

counts['type'] = counts['index'].str.extract('(\d{3})') #提取前三个数字作为类别id

counts_ = counts[['type', 'num']].groupby('type').sum() #按类别合并

counts_.sort_values(by='num', ascending = False) #降序排列

#counts_.sort_index(by='num', ascending = False) #降序排列

counts_['baifenbi']=[float(i)/(counts_['num'].sum()) for i in counts_['num']]

print counts_

101类型占了百分之49,是咨询类,199其他类21%,107法律知识类21%(这里有一个sort_values,为什么没排序,我也没搞懂)。其他类虽然占第二,但后期可以在细分,所以推荐的模型以咨询和知识链接为主

另外注意,这里sql变量用一次就会关闭,我在测试中发现的。因此每次需要再次赋值。

接着对每一类进行子级探索,这里直讲一类以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'知识首页'

j['type'][j['fullURL'].str.contains('info/.+?/.+?')] = u'知识列表页'

j['type'][j['fullURL'].str.contains('/\d+?_*\d+?\.html')] = u'知识内容页'

return j['type'].value_counts()

sql=pd.read_sql('law',engine,chunksize=10000)

counts2 = [count107(i) for i in sql] #逐块统计

counts2 = pd.concat(counts2).groupby(level=0).sum() #合并统计结果

print counts2

这里不粘贴结果了,思路上将107类的网页链接拿出来,根据链接的后缀,然后用正则匹配把他们分一下类,结果三类,知识内容页占比最多,其他两个次之。

sql=pd.read_sql('law',engine,chunksize=10000)

c=[i['realIP'].value_counts() for i in sql]

counts3=pd.concat(c).groupby(level=0).sum()

counts3=pd.DataFrame(counts3)

print counts3

counts3[1]=1

a11=counts3.groupby('realIP').sum()

print a11

这个是探索ip点击量,根据每一条一个ip,统计ip出现的次数,比如ipa,出现1,b1次,c100次,然后再反向统计次数这一列,就会转成 出现1次即点击量为1的有多个ip(用户),100次的有多少个用户。

#python 访问mysql数据库进行清洗操作

for i in sql:

d=i[['realIP','fullURL']]#只要这两列

d=d[d['fullURL'].str.contains('\.htm')].copy()#只要htm的

d.to_sql('cleaned_law',engine,index=False,if_exists='append')

因为链接有多种类型,比如跳转页啊,会员登录页,什么乱七八糟,因此只取有html的url,然后保存到mysql一个新表

#对翻页类网址数据变换

sql = pd.read_sql('cleaned_law', engine, chunksize = 10000)

for i in sql: #逐块变换并去重

d = i.copy()

d['fullURL'] = d['fullURL'].str.replace('_\d{0,2}.html', '.html') #将下划线后面部分去掉,规范为标准网址

d = d.drop_duplicates() #删除重复记录

d.to_sql('changed_gzdata', engine, index = False, if_exists = 'append') #保存

因为浏览器会将一些大文本页进行不同压缩导致页数不同,即翻页选项,比如你看个什么小说,有第二页第三页,这本质其实还是一个链接,但网页记录会生成_1,_3,_20的页数,因此合并他们,这里是一个替换工具,一个_开头,然后正则匹配\d(数字),{0,2}表示匹配的数字最少零,最多2个,因为用的url会有不是翻页的,但格式_12554424215256这样的,限定长度就区分开了,并去掉完全重复的行

#对网址重新分类

sql = pd.read_sql('changed_gzdata', engine, chunksize = 10000)

for i in sql: #逐块变换并去重

d = i.copy()

d['type_1'] = d['fullURL'] #复制一列

d['type_1'][d['fullURL'].str.contains('(ask)|(askzt)')] = 'zixun'

#将含有ask、askzt关键字的网址的类别一归为咨询(后面的规则就不详细列出来了,实际问题自己添加即可)

d.to_sql('splited_gzdata', engine, index = False, if_exists = 'append') #保存

ask为咨询,askzt也是咨询(前面提到过其他类,有的askzt就在里面),所以将其归类,知识类也是如此。

最后生成两列,用户 与物品(这里是网站)

用户推荐主要用的是协同过滤,但原作者也是扯淡,只粘了一个算法模型,没讲具体应用,我看了一下,还有几个地方不明白,等完全明白了,再写第二部分。

物品推荐

哈哈,每次画图是最好玩的

ps:突然想去六月份去面试一个公司,他是一个刚毕业研究生,问我,他们的网站现在有搜索引擎跳转来源,比如一个url里面带百度,带谷歌,怎么把他们归类出来,我当时想了半天,弱弱的回了一句vlookup,他说这个做不出来,然后问我Vlookup,当时一紧张把01说成12,然后说我基本功不扎实(虽然他很臭屁,不过确实我自己能力不够,)后来想过问题,得到了一个mid+find的excel方法,也确实能实现,不过现在再看,啪啪两声写成python,然后一个正则匹配,啪啪啪三声,一个保存。o了。所以说python大法好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值