七城市房价统计
在鏈家網上爬取北京、上海、廣州、深圳、天津、青島的房價,繪制熱力圖、箱線圖。
首先爬取房價信息。
from urllib import request from bs4 import BeautifulSoup as bs import re import pandas as pdtemp0 = [] temp0 = {"price": temp0} df = pd.DataFrame(temp0) #建立空dataframe用來后續存儲數據region = "hz" #地名簡寫 pages = 73 #鏈家網的房價頁數for i in range(1, pages+1):res = request.urlopen('https://' + region +'.fang.lianjia.com/loupan/pg' + str(i) + '/')html_data = res.read().decode('utf-8')Soup = bs(html_data, 'html.parser')print(i, "/", pages) #觀察進度p1 = Soup.find_all('div', class_="main-price") # 找到價格標簽,class后面要加下劃線price_str = str(p1)pattern = re.compile(r'.+\s.+元') #有些房子是按套賣,排除這些房子,只找按平米賣的房子temp = re.findall(pattern, price_str)temp2 = "".join(temp) #將list轉為strpattern2 = re.compile(r'\d{5,6}') #找出房價數據price = re.findall(pattern2, temp2)dic_price = {"price": price}df_temp = pd.DataFrame(dic_price)df = pd.concat([df, df_temp], axis=0, ignore_index=True) #按行合并兩個dataframeregion = region.upper() file_name = region + "HousePrice.csv" df.to_csv(file_name)熱力圖使用folium包繪制使用pip安裝folium
pip3 install folium導入需要的包
import pandas as pd import numpy as np import folium import webbrowser from folium.plugins import HeatMap import matplotlib.pyplot as plt整理爬取的房價數據,并平均值,畫出箱線圖。
df.columns = (["Beijing", "Shanghai", "Guangzhou", "Shenzhen", "Tianjin", "Qingdao", "Hangzhou"]) df.boxplot() plt.show()df.columns = (["北京市", "上海市", "廣州市", "深圳市", "天津市", "青島市", "杭州市"]) #設置列名 mean_price = df.mean() #求每列平均值 mean_price = pd.DataFrame(mean_price, columns=["price"]) #將求出的平均值存為dataframe并設置列名
下載中國城市的經緯度信息點擊打開鏈接,保存為csv。
cities = pd.read_csv("Cities.csv", sep=",") cities = cities[["cities", "lon", "lat"]] cities.set_index("cities", inplace=True) #修改index方便后面檢索將城市經緯度信息與房價均值放在一個dataframe中。
my_cities = pd.DataFrame(columns=["lon", "lat"]) #新建空dataframe保存城市經緯度和房價數據 for i in mean_price.index:new_position = []lat = cities["lat"][i] #獲取緯度值lon = cities["lon"][i] #獲取精度值new_position.append(lat)new_position.append(lon)my_cities.loc[i] = new_positionmy_cities = pd.concat([my_cities, mean_price], axis=1) #將經緯度與房價均價合并在一個dataframe my_cities.to_csv("mean_price.csv", encoding="utf_8_sig") #加上encoding="utf_8_sig"解決中文亂碼問題繪制熱力圖
lst = np.array(my_cities).tolist() #轉化dataframe為list,為后面畫熱力圖用,先轉成ndarray,在用tolist() map_osm = folium.Map(location=[35,110],zoom_start=5) #繪制Map,開始縮放程度是5倍 HeatMap(lst).add_to(map_osm) # 將熱力圖添加到前面建立的map里file_path = r"house_price.html" map_osm.save(file_path) # 保存為html文件webbrowser.open(file_path) # 默認瀏覽器打開總結
- 上一篇: 架构学习——原型图
- 下一篇: 那些年,我们一起做过的 Java 课后练