0X00
上一次我使用python爬取了链家上成都市双流区的一些租房信息,今天我们就来对爬取到的数据进行一些简单的数据可视化处理,学习学习python一些简单的数据处理。
0X01 数据展示
这些就是我们之前爬取到的数据,我们这次就会对他的规格、面积、单价等信息进行简单的可视化处理。
0X02 租房信息规格(饼状图)
这里使用的是openpyxl库对excel表进行操作,matplotlib库对数据进行可视化。
import openpyxl
import matplotlib.pyplot as plt
这里偷了个懒,提前用列表将租房信息的规格写好了,没有在读取数据的过程中去添加。
specification = ['1室0厅', '1室1厅', '1室2厅', '2室1厅', '2室2厅', '3室0厅', '3室1厅', '3室2厅', '3室3厅', '4室1厅', '4室2厅', '4室3厅', '5室1厅',
'5室2厅', '5室3厅', '6室1厅', '6室2厅', '6室3厅', '6室4厅', '车位']
specification_num = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
然后读取表中的数据,如果读取到的数据不为空,则对specification列表进行循环,将对应位置的规格数量加一
num = 1
string = '1'
while string is not None:
num += 1
string = ws.cell(num, 4).value
count = 0
for i in specification:
if i == string:
specification_num[count] += 1
break
count += 1
然后由于一些规格的租房数量很少,在图中会导致很密集看不清,所以我们就以100为分水岭,数量100以下就归类到其他中
labels = []
x = []
index = 0
index_other = 0
for i in specification_num:
if i > 100:
labels.append(specification[index])
x.append(specification_num[index])
else:
if not ('其他' in labels):
labels.append('其他')
x.append(specification_num[index])
index_other = index
else:
x[index_other] += specification_num[index]
index += 1
最后就是数据的可视化图表,x对应着绘图的数据,labels对应着数据的标签,autopct对应着数据的百分比。
还要注意设置一下标签的字体,不然如果matplotlib找不到字体,会导致乱码。
plt.show()
将图形展示出来,也可以使用plt.savefig(path)
保存图片
plt.pie(x=x, # 绘图数据
labels=labels, # 添加租房类别标签
autopct='%.1f%%', # 设置百分比的格式,这里保留一位小数
)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 黑体
plt.show()
成果图:
0X03 租房面积(条形图)
对数据的简单处理和之前差不多,读取各条信息的面积,然后对于不同面积范围进行归类。
这里利用area_列表储存各面积范围的上限,然后将面积与之进行对比,然后方便将其归类。
import openpyxl
import matplotlib.pyplot as plt
file_name = '成都市双流区二手房源.xlsx'
wb = openpyxl.load_workbook(file_name)
print(file_name + '打开成功!')
ws = wb.active
area = ['<60', '60(含)-70', '70(含)-80', '80(含)-90', '90(含)-100', '100(含)-120', '120(含)-140', '140(含)-160', '>=160']
area_ = [60, 70, 80, 90, 100, 120, 140, 160]
area_num = [0, 0, 0, 0, 0, 0, 0, 0, 0]
num = 2
string = ws.cell(num, 5).value
while string is not None:
index = 0
for i in area_:
if float(string) < i:
area_num[index] += 1
break
if float(string) >= 160:
area_num[8] += 1
break
index += 1
num += 1
string = ws.cell(num, 5).value
然后是数据的可视化代码。
plt.figure(figsize=(15, 7))
设置了窗口的尺寸大小。
plt.ylabel
和plt.title
分别添加了数据表的y轴标签和条形图标题。
plt.tick_params(labelsize=15)
设置了标签的字体大小为15。
"""条形图"""
# 窗口尺寸
plt.figure(figsize=(15, 7))
# 绘制条形图
plt.bar(range(len(area)), area_num, width=0.5)
# 添加y轴的标签
plt.ylabel('租房面积(平方米)')
# 添加条形图的标题
plt.title('成都市双流区二手房租房信息')
# 对应x轴与字符串
plt.xticks(range(len(area)), area)
plt.tick_params(labelsize=15)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 黑体
plt.show()
成果图:
0X04 租房单价(箱线图)
遍历一遍表格,获取全部的单价信息。
import openpyxl
import matplotlib.pyplot as plt
file_name = '成都市双流区二手房源.xlsx'
wb = openpyxl.load_workbook(file_name)
print(file_name + '打开成功!')
ws = wb.active
num = 2
list = []
string = ws.cell(num, 7).value
while string is not None:
list.append(float(string))
num += 1
string = ws.cell(num, 7).value
将获取到的信息作为绘图数据,设置表格属性。
plt.boxplot(x=list, # 指定绘图数据
patch_artist=True, # 要求用自定义颜色填充盒形图,默认白色填充
showmeans=True, # 以点的形式显示均值
boxprops={'color': 'black', 'facecolor': 'steelblue'}, # 设置箱体属性,如边框色和填充色
# 设置异常点属性,如点的形状、填充色和点的大小
flierprops={'marker': 'o', 'markerfacecolor': 'red', 'markersize': 3, 'markeredgecolor': 'red'},
# 设置均值点的属性,如点的形状、填充色和点的大小
meanprops={'marker': 'D', 'markerfacecolor': 'indianred', 'markersize': 4},
# 设置中位数线的属性,如线的类型和颜色
medianprops={'linestyle': '--', 'color': 'orange'},
labels=[''] # 删除x轴的刻度标签,否则图形显示刻度标签为1
)
# 添加图形标题
plt.title('二手房单价分布的箱线图')
plt.rcParams['font.sans-serif'] = ['SimHei'] # 黑体
# 显示图形
plt.show()
成果图:
0X05 总结
这篇分析由于只抓取了链家网的部分数据且对数据的真实性未做核实,因此可能会导致分析结果不准确的问题。
对数据没有进行严格的分析,仅对范围进行了简单的处理,无法对租房的选择进行明确的指引,仅用于python学习。
不足之处欢迎指出。