与笔者的这篇文章中用到的数据集是一样的,只是这次换用MySQL,目的是一样的。
想要的预处理结果是:
1,将不需要的列删去,
2,将含NULL值的记录删去,删除重复数据
3,将整体评分的分值调整为0-5,
4,对电影和用户名进行编号,分别从1到N,
5,统计预处理后数据集信息。
=========================
下面开始用MySQL对上述的5个需求进行处理。
1,将不需要的列删去。
在将CSV格式的原始数据集通过Navicat导入到数据库中以后,先把表复制一个,在复制的表上进行操作,保留最原始表。
接下来所有操作都会在复制表上进行操作。
选择设计表,将不需要的字段直接删除即可,就完成了第一步。之后可以将相对应的列名改为数据集中的正确的列名。
2,将含NULL值的记录删去。
在开始删除之前,先检查一下数据有多少条。输入
SELECT count(*) FROM alldata_copy1;
结果为:
然后开始删除含NULL值的列,这些都是爬取的时候没有爬到完整数据的条目,要作为无效数据删掉。
先查看哪些列含有NULL值,因为数据集是从Excel中导入的,null是以‘null’的形式存存储在表中的,也就是说,需要查找并删除的是含有文本‘null’的行。
查看一下这样的值。
SELECT username,moviename FROM alldata_copy1
where username like '%null%' or moviename like '%null%'
order by moviename desc;
或者用正则表达式搜索含null的记录:
SELECT username,moviename FROM alldata_copy1
where username REGEXP 'null'
order by moviename desc;
得到这样的结果:
之后,直接删掉这些数据即可。
delete from alldata_copy1
where username like '%null%';
运行结果是这样的:
剩余数据条数:
SELECT count(*) from alldata_copy1;
接下来,删除几个列完全相同的数据,每个重复数据只保留1条。
使用distinct,然后直接创建一个新表。
create table alldata3
( SELECT DISTINCT * from alldata_copy2 );
之后的操作就在新表alldata3上面进行。
3、将整体评分数值范围由0-100调整为0-5。
这一步是对数据的数值进行调整,只需要把total列除20即可。
SELECT total / 20 as newtotal FROM `alldata3`;
之后把这一列更新到表中。当然了,在此之前先创建一个新的列totalnew
update alldata3_copy1
set totalnew = total / 20;
可以看到,已经得到想要的数据,再删除掉不需要的列,把totalnew改回total即可。
4、对电影和用户名进行编号,分别从1到N。
这里的需求是:要把现有的电影名字,用户名字,全部替换乘从1开始依次增加的数字ID,目的是为了在之后的计算中方便程序使用。这是数据预处理的要求。
比如说,现有
moviename
你的名字
你的名字
你的名字
你的名字
你的名字
替换后,应该是
movieid
1
1
1
1
1
对于用户名,也是同样的操作。
对电影名字来说,首先把所有不同名的电影查找出来并建立一个新表。
CREATE table movie5
(select distinct moviename
from alldata4_copy1);
然后在这个表里面,创建一个新的字段,movieid
alter table movie5
add movieid int;
然后,更改字段属性为自增字段。
alter table movie5
change movieid
movieid int not null
auto_increment
primary key;
达到了给不同的电影赋予连续的数字ID的目的,根据movie5表,把ID更新到想要的表中。
update lastdata,movie5
set lastdata.movieid = movie5.movieid
where lastdata.moviename=movie5.moviename;
用这个语句可以完成该工作,得到结果如下:
之后采用与电影名相同的操作方法,把用户名也替换成数字ID,第4步的工作就完成了。
5,统计预处理后数据集信息
这里主要是看看电影和用户的分组和每一组的数量。
SELECT movieid,count(movieid) as movienum
from lastdata_copy1
GROUP BY movieid
order by movieid desc;
可以看到电影共有1380部
再来看用户的
SELECT userid,count(userid) as usernum
from lastdata_copy1
GROUP BY userid
order by userid desc;
可以看到共有用户17548名。
OK,数据集处理完毕。