基于PyFlink的钻石价格数据处理与分析

大数据学习路线图

【版权声明】版权所有,严禁转载,严禁用于商业用途,侵权必究。
作者:厦门大学计算机科学与技术系2023级研究生 董畅
指导老师:厦门大学数据库实验室 林子雨 博士/副教授
时间:2024年6月
相关教材:林子雨编著《Flink编程基础(Java版)》(访问教材官网
相关案例:Flink大数据处理分析案例集锦
本案例采用阿里天池大赛提供的钻石价格数据集。使用pandas进行数据清洗,保存到分布式文件系统HDFS中,接下来使用PyFlink进行数据分析,最后,采用matplotlib和seaborn进行可视化。
数据集和代码下载:从百度网盘下载本案例的代码和数据集。(提取码是ziyu)

一、实验任务

1.实验环境

Linux: Ubuntu16.04
Hadoop: 3.3.5
Flink:1.17.0
Apache-flink:1.17.2(PyFlink)
Python:3.7.6(Anaconda3)
运行环境:Jupyter Notebook

2.数据介绍

数据集下载链接如下:钻石价格预测_数据集-阿里云天池 (aliyun.com)
文件名称为Diamond Price Prediction.csv,记录着53940行钻石的数据。每行数据包含十个指标,分别是克拉重量,刀工,颜色,种类,深度,台面比,长度,宽度,高度和价格。

3.数据清洗

(1)读取数据
通过pandas读取数据,并且显示前十行查看数据。

(2)删除包含缺失值或有重复的行

(3)对Price价格变量进行处理
将价格由以美元为单位转变为人民币,且将数据类型转变为float型。

(4)删除多余行且修改列名

数据清洗至此结束,最后通过调用describe简单了解数据集情况。

4.数据上传

将数据传到本地,删除过时文件后将新的文件上传到HDFS中,最后查看文件是否上传成功。

5.数据处理

(1)引用的包

(2)打印函数
在Jupyter notebook上进行计算,结果会在终端显示,页面无法看到,因此定义输出函数,使用execute_and_collect来收集和打印结果。

(3)读取数据
创建流执行环境,并且定义路径,从hdfs中读取csv数据保存到data_stream数据流中。

使用打印函数输出data_stream的数据,则显示结果如下:

(4)探究数据集特征值之间的关系
将X,Y,Z等长宽高信息转变为体积信息,并且将字符串分类转变为数字分类,再将数据流进行保存,用于研究特征值两两之间的关系。
a)根据钻石的x,y,z估计钻石的体积
以“,”为分割符分出列,取出X,Y,Z列的数值,根据公式volume=π × Z × ((X+Y)/2)2计算体积,将计算结果添加到数据流中,通过map的方式将data_stream进行映射处理。

b)将Cut,Color,Clarity的字符串等级划分变为数字划分
将不同字符串对应为不同的数字,数字越小,代表钻石品质越高。

c)保存数据
在体积信息计算结束且将等级转为数字分类后,以体积信息代替X,Y,Z信息,将整体数据保存为以total为开头的csv文件,用于判断总体数据的不同特征之间彼此的联系关系。

(5)探究Depth、Table与价格的关系
以2为区间划分Depth和Table的值,并且计算不同区间中,钻石每克拉的平均价值和总数。
a)计算Depth和Table不同区间中钻石每克拉的均价和总数

首先计算每克拉的单价,将其作为一个新的列放入数据流中;以2为步长划分区间,将depth和table进行划分,将其作为新的列提取出来;将计算出的单价,d_range,t_range 做成一个新的数据流。
以depth为例,将d_rang,pre_price,1作为设置为一行数据,以d_range为key,对于d_range相同的行,单价和数量进行累加,则其中每个d_range对应的最大的数值就是这一区间内的累加单价和数量,再将累加单价/数量,即可以得到这个区间内的每克拉钻石的平均单价和数量,t_range同理。

b)保存数据
将数据保存为分别以depth和table为开头的csv文件。


(6)探究Color对钻石Price和Carat的影响
在数据流中取出color,carat,price三个特定的数据列组成新的数据流,并且将数据保存为以color为开头的csv文件。

(7)探究价格对于钻石品质的影响
a)简化分类
若以Cut,Color,clarity为关键词进行分类,则分类过细导致种类太多,难以进行可视化,因此定义函数进行简化分类。

b)根据价格筛选数据并计算数量

以约25%为区间,根据价格筛选数据,将原本的数据流拆分为四个不同价格区间的数据流,且统计不同价格区间内不同品质钻石的数量。
c)保存数据
将数据保存为分别以low_price、lmid_price、mid_price和high_price为开头的csv文件。由于保存代码相似,因此只截图一个。

6.数据可视化

(1)引用的包

(2)读取数据
根据不同文件的特定开头在读取路径中查找文件路径,然后根据路径将数据读取存到data列表中,最后将data添加标题行并转换为Datarame类型,便于可视化。
由于数据的读取方式均一致,因此只展示对total为开头文件的读取。

(3)探究数据集特征值之间的关系
a)数据集热力图
图片如下:

根据热力图可看出,Carat,Volume,Price三个特征值之间的关联度较深。
使用seaborn根据数据绘制热力图:

b)特征值成对散点图

绘制代码如下:

通过散点图可以看出Carat,Volume,Price特征值之间的关系偏向于线性,即体积Volume越大,Carart克拉越大,Price价格也越高。而其他特征值之间没有明显的关系。
(4)探究Depth、Table与价格的关系
a)提取数据
count最大时的数据行对应的数值才是最终均价和数量。


b)绘制Depth、count与Pre_price的直方图

图片如下:

可看出Depth在区间[60-64)的数量较多,但在区间[58-60)的价格最高。可初步推断钻石Depth一般在56%-66%之间,58%-60%为品质最优。
c)绘制table、count与Pre_price的直方图
代码如下:

根据以下直方图可看出Table在区间[56-60)的数量较多,且在区间[56-58)的价格最高。可初步推断钻石Table一般在52%-66%之间,56%-58%为品质最优。

(5)探究Color对钻石Price和Carat的影响
a)绘制散点曲线图
代码如下:

根据下图可以看出价格随克拉进行增长的同时,颜色品质也对价格有一定影响,颜色品质高的钻石在同一情况下的价格会较高。

(6)探究价格对于钻石品质的影响
a)提取数据
count的最大值为最终计算得出的数量,因此根据count的值进行数据提取。(由于四个数据处理近似,因此只展示低区间处理代码)

b)绘制价格与钻石品质的饼图
代码如下:

图片如下:


可以看出价格位于中低区间的钻石品质较好的数量比较多,而在高价格区间内各种品质的钻石数量差不多。由于可看出相较于品质,克拉值更加影响钻石的价格。