数据挖掘-电子商务网站行为分析

news/2024/5/15 8:23:23/文章来源:https://blog.csdn.net/weixin_58565789/article/details/129940930
# 代码11-1import os
import pandas as pd# 修改工作路径到指定文件夹
os.chdir("D:/chapter11/demo")# 第一种连接方式
from sqlalchemy import create_engineengine = create_engine('mysql+pymysql://root:123@192.168.31.140:3306/test?charset=utf8')
sql = pd.read_sql('all_gzdata', engine, chunksize = 10000)# 第二种连接方式
import pymysql as pmcon = pm.connect('localhost','root','123456','test',charset='utf8')
data = pd.read_sql('select * from all_gzdata',con=con)
con.close()           #关闭连接# 保存读取的数据
data.to_csv('./tmp/all_gzdata.csv', index=False, encoding='utf-8')

 

# 代码11-2import pandas as pd
from sqlalchemy import create_engineengine = create_engine('mysql+pymysql://root:root123@127.0.0.1:3306/test?charset=utf8')
sql = pd.read_sql('all_gzdata', engine, chunksize = 10000)
# 分析网页类型
counts = [i['fullURLId'].value_counts() for i in sql] #逐块统计
counts = counts.copy()
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, inplace=True)  # 降序排列
counts_['ratio'] = counts_.iloc[:,0] / counts_.iloc[:,0].sum()
print(counts_)
# 代码11-3# 因为只有107001一类,但是可以继续细分成三类:知识内容页、知识列表页、知识首页
def count107(i): #自定义统计函数j = i[['fullURL']][i['fullURLId'].str.contains('107')].copy()  # 找出类别包含107的网址j['type'] = None # 添加空列j['type'][j['fullURL'].str.contains('info/.+?/')]= '知识首页'j['type'][j['fullURL'].str.contains('info/.+?/.+?')]= '知识列表页'j['type'][j['fullURL'].str.contains('/\d+?_*\d+?\.html')]= '知识内容页'return j['type'].value_counts()
# 注意:获取一次sql对象就需要重新访问一下数据库(!!!)
#engine = create_engine('mysql+pymysql://root:123456@127.0.0.1:3306/test?charset=utf8')
sql = pd.read_sql('all_gzdata', engine, chunksize = 10000)counts2 = [count107(i) for i in sql] # 逐块统计
counts2 = pd.concat(counts2).groupby(level=0).sum()  # 合并统计结果
print(counts2)
#计算各个部分的占比
res107 = pd.DataFrame(counts2)
# res107.reset_index(inplace=True)
res107.index.name= '107类型'
res107.rename(columns={'type':'num'}, inplace=True)
res107['比例'] = res107['num'] / res107['num'].sum()
res107.reset_index(inplace = True)
print(res107)

 

# 代码11-4def countquestion(i):  # 自定义统计函数j = i[['fullURLId']][i['fullURL'].str.contains('\?')].copy()  # 找出类别包含107的网址return j#engine = create_engine('mysql+pymysql://root:123456@127.0.0.1:3306/test?charset=utf8')
sql = pd.read_sql('all_gzdata', engine, chunksize = 10000)counts3 = [countquestion(i)['fullURLId'].value_counts() for i in sql]
counts3 = pd.concat(counts3).groupby(level=0).sum()
print(counts3)# 求各个类型的占比并保存数据
df1 =  pd.DataFrame(counts3)
df1['perc'] = df1['fullURLId']/df1['fullURLId'].sum()*100
df1.sort_values(by='fullURLId',ascending=False,inplace=True)
print(df1.round(4))

# 代码11-5def page199(i): #自定义统计函数j = i[['fullURL','pageTitle']][(i['fullURLId'].str.contains('199')) & (i['fullURL'].str.contains('\?'))]j['pageTitle'].fillna('空',inplace=True)j['type'] = '其他' # 添加空列j['type'][j['pageTitle'].str.contains('法律快车-律师助手')]= '法律快车-律师助手'j['type'][j['pageTitle'].str.contains('咨询发布成功')]= '咨询发布成功'j['type'][j['pageTitle'].str.contains('免费发布法律咨询' )] = '免费发布法律咨询'j['type'][j['pageTitle'].str.contains('法律快搜')] = '快搜'j['type'][j['pageTitle'].str.contains('法律快车法律经验')] = '法律快车法律经验'j['type'][j['pageTitle'].str.contains('法律快车法律咨询')] = '法律快车法律咨询'j['type'][(j['pageTitle'].str.contains('_法律快车')) | (j['pageTitle'].str.contains('-法律快车'))] = '法律快车'j['type'][j['pageTitle'].str.contains('空')] = '空'return j# 注意:获取一次sql对象就需要重新访问一下数据库
#engine = create_engine('mysql+pymysql://root:123456@127.0.0.1:3306/test?charset=utf8')
sql = pd.read_sql('all_gzdata', engine, chunksize = 10000)# 分块读取数据库信息
#sql = pd.read_sql_query('select * from all_gzdata limit 10000', con=engine)counts4 = [page199(i) for i in sql] # 逐块统计
counts4 = pd.concat(counts4)
d1 = counts4['type'].value_counts()
print(d1)
d2 = counts4[counts4['type']=='其他']
print(d2)
# 求各个部分的占比并保存数据
df1_ =  pd.DataFrame(d1)
df1_['perc'] = df1_['type']/df1_['type'].sum()*100
df1_.sort_values(by='type',ascending=False,inplace=True)
print(df1_)

# 代码11-6def xiaguang(i): #自定义统计函数j = i.loc[(i['fullURL'].str.contains('\.html'))==False,['fullURL','fullURLId','pageTitle']]return j# 注意获取一次sql对象就需要重新访问一下数据库
engine = create_engine('mysql+pymysql://root:123456@127.0.0.1:3306/test?charset=utf8')
sql = pd.read_sql('all_gzdata', engine, chunksize = 10000)# 分块读取数据库信息counts5 = [xiaguang(i) for i in sql]
counts5 = pd.concat(counts5)xg1 = counts5['fullURLId'].value_counts()
print(xg1)
# 求各个部分的占比
xg_ =  pd.DataFrame(xg1)
xg_.reset_index(inplace=True)
xg_.columns= ['index', 'num']
xg_['perc'] = xg_['num']/xg_['num'].sum()*100
xg_.sort_values(by='num',ascending=False,inplace=True)xg_['type'] = xg_['index'].str.extract('(\d{3})') #提取前三个数字作为类别id    xgs_ = xg_[['type', 'num']].groupby('type').sum() #按类别合并
xgs_.sort_values(by='num', ascending=False,inplace=True) #降序排列
xgs_['percentage'] = xgs_['num']/xgs_['num'].sum()*100print(xgs_.round(4))
# 代码11-7# 分析网页点击次数
# 统计点击次数
engine = create_engine('mysql+pymysql://root:123456@127.0.0.1:3306/test?charset=utf8')
sql = pd.read_sql('all_gzdata', engine, chunksize = 10000)# 分块读取数据库信息counts1 = [i['realIP'].value_counts() for i in sql] # 分块统计各个IP的出现次数
counts1 = pd.concat(counts1).groupby(level=0).sum() # 合并统计结果,level=0表示按照index分组
print(counts1)counts1_ = pd.DataFrame(counts1)
counts1_
counts1['realIP'] = counts1.index.tolist()counts1_[1]=1  # 添加1列全为1
hit_count = counts1_.groupby('realIP').sum()  # 统计各个“不同点击次数”分别出现的次数
# 也可以使用counts1_['realIP'].value_counts()功能
hit_count.columns=['用户数']
hit_count.index.name = '点击次数'# 统计1~7次、7次以上的用户人数
hit_count.sort_index(inplace = True)
hit_count_7 = hit_count.iloc[:7,:]
time = hit_count.iloc[7:,0].sum()  # 统计点击次数7次以上的用户数
hit_count_7 = hit_count_7.append([{'用户数':time}], ignore_index=True)
hit_count_7.index = ['1','2','3','4','5','6','7','7次以上']
hit_count_7['用户比例'] = hit_count_7['用户数'] / hit_count_7['用户数'].sum()
print(hit_count_7)
# 代码11-8# 分析浏览一次的用户行为engine = create_engine('mysql+pymysql://root:123456@127.0.0.1:3306/test?charset=utf8')
all_gzdata = pd.read_sql_table('all_gzdata', con = engine)  # 读取all_gzdata数据#对realIP进行统计
# 提取浏览1次网页的数据
real_count = pd.DataFrame(all_gzdata.groupby("realIP")["realIP"].count())
real_count.columns = ["count"]
real_count["realIP"] = real_count.index.tolist()
user_one = real_count[(real_count["count"] == 1)]  # 提取只登录一次的用户
# 通过realIP与原始数据合并
real_one = pd.merge(user_one, all_gzdata, left_on="realIP", right_on="realIP")# 统计浏览一次的网页类型
URL_count = pd.DataFrame(real_one.groupby("fullURLId")["fullURLId"].count())
URL_count.columns = ["count"]
URL_count.sort_values(by='count', ascending=False, inplace=True)  # 降序排列
# 统计排名前4和其他的网页类型
URL_count_4 = URL_count.iloc[:4,:]
time = hit_count.iloc[4:,0].sum()  # 统计其他的
URLindex = URL_count_4.index.values
URL_count_4 = URL_count_4.append([{'count':time}], ignore_index=True)
URL_count_4.index = [URLindex[0], URLindex[1], URLindex[2], URLindex[3], '其他']
URL_count_4['比例'] = URL_count_4['count'] / URL_count_4['count'].sum()
print(URL_count_4)# 代码11-9# 在浏览1次的前提下, 得到的网页被浏览的总次数
fullURL_count = pd.DataFrame(real_one.groupby("fullURL")["fullURL"].count())
fullURL_count.columns = ["count"]
fullURL_count["fullURL"] = fullURL_count.index.tolist()
fullURL_count.sort_values(by='count', ascending=False, inplace=True)  # 降序排列


# 代码11-10import os
import re
import pandas as pd
import pymysql as pm
from random import sample# 修改工作路径到指定文件夹
os.chdir("D:/chapter11/demo")# 读取数据
con = pm.connect('localhost','root','123456','test',charset='utf8')
data = pd.read_sql('select * from all_gzdata',con=con)
con.close()  # 关闭连接# 取出107类型数据
index107 = [re.search('107',str(i))!=None for i in data.loc[:,'fullURLId']]
data_107 = data.loc[index107,:]# 在107类型中筛选出婚姻类数据
index = [re.search('hunyin',str(i))!=None for i in data_107.loc[:,'fullURL']]
data_hunyin = data_107.loc[index,:]# 提取所需字段(realIP、fullURL)
info = data_hunyin.loc[:,['realIP','fullURL']]# 去除网址中“?”及其后面内容
da = [re.sub('\?.*','',str(i)) for i in info.loc[:,'fullURL']]
info.loc[:,'fullURL'] = da     # 将info中‘fullURL’那列换成da
# 去除无html网址
index = [re.search('\.html',str(i))!=None for i in info.loc[:,'fullURL']]
index.count(True)   # True 或者 1 , False 或者 0
info1 = info.loc[index,:]# 代码11-11# 找出翻页和非翻页网址
index = [re.search('/\d+_\d+\.html',i)!=None for i in info1.loc[:,'fullURL']]
index1 = [i==False for i in index]
info1_1 = info1.loc[index,:]   # 带翻页网址
info1_2 = info1.loc[index1,:]  # 无翻页网址
# 将翻页网址还原
da = [re.sub('_\d+\.html','.html',str(i)) for i in info1_1.loc[:,'fullURL']]
info1_1.loc[:,'fullURL'] = da
# 翻页与非翻页网址合并
frames = [info1_1,info1_2]
info2 = pd.concat(frames)
# 或者
info2 = pd.concat([info1_1,info1_2],axis = 0)   # 默认为0,即行合并
# 去重(realIP和fullURL两列相同)
info3 = info2.drop_duplicates()
# 将IP转换成字符型数据
info3.iloc[:,0] = [str(index) for index in info3.iloc[:,0]]
info3.iloc[:,1] = [str(index) for index in info3.iloc[:,1]]
len(info3)# 代码11-12# 筛选满足一定浏览次数的IP
IP_count = info3['realIP'].value_counts()
# 找出IP集合
IP = list(IP_count.index)
count = list(IP_count.values)
# 统计每个IP的浏览次数,并存放进IP_count数据框中,第一列为IP,第二列为浏览次数
IP_count = pd.DataFrame({'IP':IP,'count':count})
# 3.3筛选出浏览网址在n次以上的IP集合
n = 2
index = IP_count.loc[:,'count']>n
IP_index = IP_count.loc[index,'IP']# 代码11-13# 划分IP集合为训练集和测试集
index_tr = sample(range(0,len(IP_index)),int(len(IP_index)*0.8))  # 或者np.random.sample
index_te = [i for i in range(0,len(IP_index)) if i not in index_tr]
IP_tr = IP_index[index_tr]
IP_te = IP_index[index_te]
# 将对应数据集划分为训练集和测试集
index_tr = [i in list(IP_tr) for i in info3.loc[:,'realIP']]
index_te = [i in list(IP_te) for i in info3.loc[:,'realIP']]
data_tr = info3.loc[index_tr,:]
data_te = info3.loc[index_te,:]
print(len(data_tr))
IP_tr = data_tr.iloc[:,0]  # 训练集IP
url_tr = data_tr.iloc[:,1]  # 训练集网址
IP_tr = list(set(IP_tr))  # 去重处理
url_tr = list(set(url_tr))  # 去重处理
len(url_tr)# 代码11-14import pandas as pd
# 利用训练集数据构建模型
UI_matrix_tr = pd.DataFrame(0,index=IP_tr,columns=url_tr)
# 求用户-物品矩阵
for i in data_tr.index:UI_matrix_tr.loc[data_tr.loc[i,'realIP'],data_tr.loc[i,'fullURL']] = 1
sum(UI_matrix_tr.sum(axis=1))# 求物品相似度矩阵(因计算量较大,需要耗费的时间较久)
Item_matrix_tr = pd.DataFrame(0,index=url_tr,columns=url_tr)
for i in Item_matrix_tr.index:for j in Item_matrix_tr.index:a = sum(UI_matrix_tr.loc[:,[i,j]].sum(axis=1)==2)b = sum(UI_matrix_tr.loc[:,[i,j]].sum(axis=1)!=0)Item_matrix_tr.loc[i,j] = a/b# 将物品相似度矩阵对角线处理为零
for i in Item_matrix_tr.index:Item_matrix_tr.loc[i,i]=0# 利用测试集数据对模型评价
IP_te = data_te.iloc[:,0]
url_te = data_te.iloc[:,1]
IP_te = list(set(IP_te))
url_te = list(set(url_te))# 测试集数据用户物品矩阵
UI_matrix_te = pd.DataFrame(0,index=IP_te,columns=url_te)
for i in data_te.index:UI_matrix_te.loc[data_te.loc[i,'realIP'],data_te.loc[i,'fullURL']] = 1# 对测试集IP进行推荐
Res = pd.DataFrame('NaN',index=data_te.index,columns=['IP','已浏览网址','推荐网址','T/F'])
Res.loc[:,'IP']=list(data_te.iloc[:,0])
Res.loc[:,'已浏览网址']=list(data_te.iloc[:,1])# 开始推荐
for i in Res.index:if Res.loc[i,'已浏览网址'] in list(Item_matrix_tr.index):Res.loc[i,'推荐网址'] = Item_matrix_tr.loc[Res.loc[i,'已浏览网址'],:].argmax()if Res.loc[i,'推荐网址'] in url_te:Res.loc[i,'T/F']=UI_matrix_te.loc[Res.loc[i,'IP'],Res.loc[i,'推荐网址']]==1else:Res.loc[i,'T/F'] = False# 保存推荐结果
Res.to_csv('./tmp/Res.csv',index=False,encoding='utf8')

 

 

# 代码11-15import pandas as pd
# 读取保存的推荐结果
Res = pd.read_csv('./tmp/Res.csv',keep_default_na=False, encoding='utf8')# 计算推荐准确率
Pre = round(sum(Res.loc[:,'T/F']=='True') / (len(Res.index)-sum(Res.loc[:,'T/F']=='NaN')), 3)print(Pre)# 计算推荐召回率
Rec = round(sum(Res.loc[:,'T/F']=='True') / (sum(Res.loc[:,'T/F']=='True')+sum(Res.loc[:,'T/F']=='NaN')), 3)print(Rec)# 计算F1指标
F1 = round(2*Pre*Rec/(Pre+Rec),3)
print(F1)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_899543.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云+Nuxtjs+SpringBoot——个人网站开发到上线全套资料整理

2020年更新: 域名及服务器过期,更新地址 目前效果:https://hongxh.cn/me/ 前言 前段时间突然心血来潮想搭建了一个个人网站,就买了个云服务器开始折腾。其实单纯个人网站一个页面比较轻松,主要期间顺便把之前自己整的…

从零开始搭建个人网站(5)【gitlab / gitlab-runner / CI自动构建】

gitlab-runner 的安装 参考文档:https://docs.gitlab.com/runner/install/linux-manually.html 1.安装 wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd642.添加权限 chmod x /…

谷歌Analytics优化网站与AB测试方法

【转】谷歌Analytics优化网站与AB测试方法 一、使用Analytics跟踪用户行为 来优化网站 1.网站流量和用户行为分析是指定网站发展方向的重要参考(特别是CMS类网站),通过Google Analytics强大的分析功能,你可以轻松地查看访客在网站…

10个基于Java的CMS网站内容管理系统

10个基于Java的CMS网站内容管理系统 简介 功能强大的CMS往往有着高昂的售价,预算不足的用户很希望找到一款好用且免费的管理系统。现在已经出现了许多基于java的开源CMS系统,本文挑选了10个最强大、最易用的java开源CMS,向大家做一个简要介绍…

网站漏洞查找工具

通过百度爬关键字,然后更具域名查找漏洞页面 如果纯在就显示在下面的结果框 由于工具还在不完整就不发布源代码了 下载地址:http://download.csdn.net/source/2113559

练手项目之天猫商城网站的总结

花时间练手的项目,怎能不做总结 项目中用到的技术项目中用到的设计模式MVC设计模式FilterServlet反射模块化的jsp设计 做项目的流程需求分析实体类的设计DAO类的设计后台管理的开发前台页面的开发 项目中遇到的错误通过项目学到了什么 项目中用到的技术 Java SE基础…

推荐一个好用的操作系统下载网站

MSDN - 原版之家 里面大多数的操作系统都有,而且不像其他网站,一下载就附带很多垃圾软件

微信公众号项目(公众号关注登录网站)

目录 文章目录 目录资料地址资料说明课程内容云盘资料概览 资料地址 微信公众号项目(公众号关注登录网站) 资料说明 项目是基于微信公众号完成的,需要学习公众号项目开发的同学,可以参考。资料包含完整源码、和视频教程,以及众多辅助资料。…

别人都不知道的“好用”网站,让你的效率飞快

✅🎡个人主页:程序猿追 ✅🎡系列专栏:【日常学习上的分享】 ✅🎡目前状态:创建Java学习之路(零基础到就业实战)系列,目前更新到JAVAWEB开发 ✅🎡作者简介&…

网站的json数据

我们知道,Python的一些数据可以用字典、列表等,网站也是这样,它们会用一种叫json的格式存储。 json(JavaScript Object Notation)是最早用于java的一种格式,后来被广泛应用。在网站一般会存储一些文件信息。…

利用springboot2,elFinder和TinyMCE来简化网站的文件管理,支持阿里云OSS

背景 需要在编辑文章的时候,能很好的管理相关素材,如图片和附件等。一直以来都是用编辑器的上传功能,造成很多素材的冗余,比如上传错了图片,错误图片无法便捷的删除,所以需要一个能够方便管理的素材库。现…

大型网站技术架构

架构演变第一步:物理分离webserver和数据库 最开始,由于某些想法,于是在互联网上搭建了一个网站,这个时候甚至有可能主机都是租借的,但由于这篇文章我们只关注架构的演变历程,因此就假设这个时候已经是托管…

在服务器上搭建wordpress网站

开始之前先要知道如下几个linux命令,如果不会自行百度 1.mv命令 2.vim命令 3.zip解压命令 4.apt-get install 安装命令 5. cd 命令 写一份简约版走起! 0.首先在购置好服务器(腾讯云阿里云都行)后,选一个常用的系统,…

Java网站视频资源加密

----------------------------------------------------------分享此文章,只为让版权能够得到更多的保护---------------------------------------------------------------------------- 目前公司是做线上视频教育的,教育视频资源一直被盗取&#xff0c…

网站怎么做才能够真正的留住用户?

当今已是互联网的时代,各种网站层出不穷,各种网站优化的方式也千变万化,每个站长都希望自己能吸引的用户能越来越多,关注度能越来越高,能将越来越多的用户留在自己的网站,最好能将自己的网站变成一个“黑洞…

做网站如何怎么做到吸引用户和留住用户的运营思路

一直做产品,从未做运营,但这并不妨碍我谈谈对运营的理解。因为在互联网领域,产品和运营都是相通的,产品是要给用户提供价值,运营是让用户认识这种价值,它们相互依存,战略目标是一致的。任何运营…

前端程序猿常用网站总结

第一PPT 优品PPT 油猴 PPT超级市场 极简简历 简信 书签地球 https://www.bookmarkearth.com/ 小图标 fontasome 精灵图在线编译 https://css.spritegen.com/ 在线转ico图标 https://www.bitbug.net/ 阿里图标库 蓝湖 摩客 解压缩文件 7.zip 站长素材 字体免费、 …

介绍几个练习机试的网站

竟然好久没有没有写博客了,最近为了考研复试在练习机试,九度OJ关闭了好可惜,但是我还找到几个比较不错的网址,放上来供参考一下。 牛客网 链接到的是考研专题(感觉对考研复试比较有针对性所以放最前面了,…

看SEO老鸟如何用一篇文章教会你写作

相信对于很多站长来说,建站发外链,搞点事件营销不在话下,甚至可以说信手拈来,但是一提到写文章。我估计很多站长都会立即没了精神头,倒不是说写文章很难,但是对于大部分技术宅的我们来说写文章的确是一件痛…

网站性能提升之采用FreeMarker实现网页静态化

摘要 众所周知,随着网站的访问量增加,如何给用户以良好的访问体验就显得尤为重要。提升网站性能便成为一些网站面临的一大难题,像hao123这样的导航网站要提升网站的性能只要部署的web服务器数量足够就可以承载超大规模的访问量,如…