前序
继上次爬取到链家二手房数据后,我们需要对数据做简单的可行性分析,让我们更加直观地知道北京二手房数据信息。
这里涉及的模块包有:pandas,matplotlib,pyecharts
1.不同区域房屋总量分布
1)看一下表格内容数据
# pandas读取表格
df = pd.read_excel(r"C:\Users\Administrator\Desktop\北京二手房.xls")
# 查看数据
print(df.info)
print(df.head(10)
展示出来的数据,我们可以看到“房屋总量”列数据是数字+套的字符串格式,需要做一下数据处理,得到数字来做运算。
house = df["房屋总量"].copy()
for i in range(len(house)):
item = house.iloc[i].strip()
house.iloc[i] = int(item[:-1])
# print(item[:-1])
df["房屋总量"] = house
2)想要不同区域小区房屋总量数据,通过groupby分组处理。并做数据求和
house = df["房屋总量"].groupby(df["区"]).sum()
3)可视化图形代码展示
#设置视图画布1
fig1 = plt.figure(1, facecolor = 'black')
# 这两行代码解决 plt 中文显示的问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#在视图1中设置子图1,背景色灰色,透明度0.3(figure.add_subplot 和plt.suplot都行)
ax1 = fig1.add_subplot(2,1,1,facecolor='#4f4f4f',alpha=0.3)
#设置轴的颜色为白色
plt.tick_params(colors='white')
#画直方图
house.plot(kind='bar', rot=0, color="#ef9d9a")
#设置标题
title = plt.title('北京各区二手房分布图', fontsize=18, color='yellow')
#设置X轴轴标题
xlabel = plt.xlabel('区域', fontsize=14, color='yellow')
#设置Y轴轴标题
ylabel = plt.ylabel('二手房数量', fontsize=14, color='yellow')
# X轴刻度文本垂直摆放
plt.xticks(rotation="vertical")
#设置子图2,是位于子图1下面的饼状图
ax2 = fig1.add_subplot(2,1,2)
# print(house.index)
# print(house.values.sum())
# 制作饼图之前数据处理
labels = list(house.index)
sizes = list(house.values)
# for i in sizes:
# t = i/house.values.sum()*100
# print(t)
explode = tuple([0.1]+[0]*16)
#shadow,饼是否有阴影
plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%', radius=10, shadow=True, textprops={'color':'yellow'})
# 确保画的饼是圆的
ax2.axis('equal')
plt.show()
4)效果图展示
通过上图可以清晰看到每个区域的房源情况。
2. 30天内小区成交量可视化
1)与第一个图形一样,需要对数据做清洗,得到可运算的数据。这里采用正则匹配数字。
chengjiaoliang = df["成交量"].copy()
for i in range(len(chengjiaoliang)):
item = chengjiaoliang.iloc[i].strip()
try:
chengjiaoliang.iloc[i] = int(re.findall(r"30天成交(\d+)套", item)[0])
except:
chengjiaoliang.iloc[i] = 0
df["成交量"] = chengjiaoliang
2)接下来,为了方便看到小区所属区域,我们将"区"与"小区"列做数据合并。然后组成新的pd数据。
xq_addr = df["区"] + '-' + df["小区"]
# print(xq_addr)
df2 = pd.DataFrame(data={'小区地址': xq_addr, "成交量": chengjiaoliang})
3)这时,通过展示出的数据,我们分析到存在很多小区成交量为0的情况,需要取目标值来展示,不然数据过多,展示起来不美观。
# 通过对展示的数据分析,成交量大于8的数据展示更为美观
df2 = df2[df2["成交量"] > 8]
# 按成交量排序,ascending是否按升序排序,并索引重新排序,并删除旧索引
df2 = df2.sort_values(by="成交量", ascending=False).reset_index(drop=True)
4)可视化图形代码展示
y_labes = df2["小区地址"]
x_labes = df2["成交量"]
# print(type(x_labes))
# 这两行代码解决 plt 中文显示的问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
## 用ggplot的风格来画图
plt.style.use('ggplot')
# 设置画布2
fig3 = plt.figure(3, facecolor= 'black')
ax3 = fig3.add_subplot(1,1,1,facecolor='#4f4f4f',alpha=0.3)
# 配置图形
plt.barh(y_labes, x_labes)
#设置标题、x轴、y轴的标签文本
title = plt.title('30天内小区成交量超过8套分布图',fontsize = 18,color = 'yellow')
xlabel= plt.xlabel('套',fontsize = 12,color = 'yellow')
ylabel = plt.ylabel('小区',fontsize = 12,color = 'yellow')
# X轴刻度文本垂直摆放
# plt.xticks(rotation=180)
plt.show()
5)效果图展示
3. 小区房屋出租量可视化分析
其实,通过对30内成交量房屋可视化处理后,出租房屋基本功能也是一致的,只是在数据清洗部分有所不同,其他基本无差异。
chuzu = df["出租量"].copy()
for i in range(len(chuzu)):
item = chuzu.iloc[i].strip()
try:
chuzu.iloc[i] = int(re.search(r"(\d+)", item).group(0))
except:
chuzu.iloc[i] = 0
df["出租量"] = chuzu
4.选定区域小区房价区间分布
最后,我们可以选定某个区域,查看某个区域的小区价格区间分布情况。
1)这里以东城区为例。
# 仅拿东城区的数据
dongcheng = df[df["区"] == "东城"]
2)做数据清洗
# 数据清洗
price = dongcheng["价格"].copy()
for i in range(len(price)):
item = price.iloc[i].strip()
# 替换掉非数字的字符串并转为0
if not item.isdigit():
price.iloc[i] = 0
else:
price.iloc[i] = int(item)
# 结果演示
# print(price)
3)由于没价格数据的数据过多,不方便做展示用,需要取特定目标值来做数据展示。
# 去掉暂无价格的小区数据
price = price[price.values > 0]
4)分类价格区间,以["10万-15万/米", "6万-8万/米", "4万-6万/米", "2万-4万/米", "其他"]做例子,把数字往里套。
c = (
Pie()
.add("", [list(z) for z in zip(lables, [cnt1, cnt2, cnt3, cnt4, cnt5, cnt6])])
.set_colors(["blue", "green", "yellow", "red", "pink", "orange"])
.set_global_opts(title_opts=opts.TitleOpts(title="北京东城区二手房价格"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)
c.render("pie_set_color.html")
5)效果图展示,这里采用了pyecharts模块,展示更加好看点。
到这里,我们就已经把爬取到的数据,按照我们的需求做了可视化分析,当然了,这里只是列出简单方法,大家可以继续研究更加复杂的图形展示。
若想了解更多及源码获取,请参考原文