(一)、選題的背景
在當下社會住房成為人們生活的一個必需品,在生活中月來越重要本課題從該地區的人口,出生率,工人工資分析房價與他們的關系
(二)、主題式網絡爬蟲設計方案
1.主題式網絡爬蟲名稱
全國房價,人口爬取
1 url="https://www.gotohui.com/top/"
2.主題式網絡爬蟲爬取的內容與數據特征分析
爬取該網站的房價以及對應城市的人口,出生率,工人工資做分析
3.主題式網絡爬蟲設計方案概述(包括實現思路與技術難點)
爬取當前網站的房價與城市名稱並找到該標簽下的鏈接進行跳轉爬取下一個頁面的有關數據,再數據清洗,數據可視化。在對頁面標簽的再爬取采取的循化爬取會因為數據的不對稱報錯。具體的思路和分析通過下列代碼與圖片展示。
(三)、主題頁面的結構特征分析
1.主題頁面的結構與特征分析
2.Htmls 頁面解析
第一張圖可以發現所需要的數據存在於tobody標簽中的tr中的td下,tr中的第一個td里有該城市的具體數據,通過點擊進入到第二張圖,可以發現我們需要的數據鏈接在ul標簽的li下,找到該標簽點擊進入第3張圖,可以發現我們所需要的數據在tobody標簽的tr的td中,然而我們需要的數據還有人口從第2張圖重復即可該地方不再敘述下面用代碼展示。
3.節點(標簽)查找方法與遍歷方法
通過三循環第一個遍歷找到的有效tr標簽,第二個遍歷tr中的td得到數據和鏈接,第三個對得到的鏈接訪問遍歷爬取的數據取出。
(必要時畫出節點樹結構)
(四)、網絡爬蟲程序設計(60 分)
爬蟲程序主體要包括以下各部分,要附源代碼及較詳細注釋,並在每部分程序后
面提供輸出結果的截圖。
1.數據爬取與采集
1):所需要的庫
源碼:
1 from bs4 import BeautifulSoup 2 import requests 3 import pandas as pd 4 import csv 5 import matplotlib.pyplot as plt 6 from sklearn import metrics 7 import warnings 8 import seaborn as sns 9 import plotly 10 import plotly.express as px 11 import plotly.graph_objects as go 12 import plotly.io as pio 13 import numpy as np 14 warnings.filterwarnings("ignore")
截圖展示:
第1部分數據爬取和展示
源碼:
1 def getHTMLText(url): 2 try: 3 headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/\ 4 537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Edg/96.0.1054.34"} 5 r=requests.get(url,headers=headers) 6 r.raise_for_status()#如果狀態不是200,就會引發HTTPError異常 7 r.encoding = r.apparent_encoding 8 return r.text 9 except: 10 return "no" 11 def dataProcessing(html):#傳入Html數據 12 soup=BeautifulSoup(html) 13 #通過對頁面分析可以發現,每個城市房價數據存在於tbody下的td中我們只需要其中的三個數據 14 datas=[] 15 hrefs=[] 16 for i in soup.find_all("tr"): 17 data=i.find_all("td") #找到所有的td標簽返回一個集合 18 if len(data)==6: #必須要執行的判斷過濾數據 19 ranks=[] #創建一個集合用於存放每一個城市的數據 20 city=i.find("a").string#找到城市的名字 21 ranks.append(data[0].string) #房價排名存在data集合的第一個 22 ranks.append(city) #添加城市名稱 23 ranks.append(data[2].string)#房價信息存在於data的第3個 24 datas.append(ranks) #將這個城市的數據放入集合 25 #datas.append(ranks) 26 #datas.append(citys) 27 #datas.append(housePrices) 28 return datas 29 def hrefs(html): 30 hrefs=[] 31 soup=BeautifulSoup(html) 32 for i in soup.find_all("tr"): 33 data=i.find_all("td") #找到所有的td標簽返回一個集合 34 if len(data)==6: 35 hrefs.append(i.find("a").get("href"))#創建一個集合用於存放其他數據鏈接 36 return hrefs 37 url="https://www.gotohui.com/top/" 38 html_1=getHTMLText(url) 39 da=dataProcessing(html_1) 40 hrefs=hrefs(html_1) 41 df=pd.DataFrame(da) 42 df
截圖展示:
第二部分由於數據量大爬取網站多需要大概4分鍾跑完(這里盡量截取大部分代碼)
源碼:
1 a=1 2 dig_data=[] 3 for g in hrefs: 4 html_2=getHTMLText(g) 5 soup_2=BeautifulSoup(html_2) 6 f=[] 7 a_data=[] 8 hreds_data=soup_2.find_all("li")[46:51] 9 for b in hreds_data: 10 f.append(b.find("a").get("href")) 11 #f集合里的5條鏈接分別是GDP,人口,財政,工資,城建 12 #------------因為這些數據是在同一段數據下沒法單獨查找,但我只需要其中的2個鏈接---------------------------- 13 #每個數據的值都給出頁面對應的屬性 14 #因為這是對每個城市的后續鏈接進行訪問,后續鏈接的HTML格式一樣用循環可以去除大量的代碼 15 #-------------------------------------------#這是對人口數據的爬取這些數據最終都被添加於集合中 16 if len(f)==5: 17 html_3=getHTMLText(f[1]) 18 soup_3=BeautifulSoup(html_3) 19 people_data=[] 20 #這里捕捉異常因為在代碼運行中發現有些頁面並不存在這會導致索引錯誤 21 try: 22 for c in soup_3.find_all("tr")[7]: 23 people_data.append(c.string) 24 #年份,戶籍人口,常住人口,城鎮化率(%),增長率(‰),出生率‰ 25 #['\n','2014','\n','332.21','\n','1077.89','\n','100.00','\n','17.48','\n','19.89','\n'] 26 except: 27 people_data=["","","","","","","","","","","","",""] 28 finally: 29 if len(people_data)==13: 30 ok="ok" 31 else: 32 people_data=["","","","","","","","","","","","",""] 33 #-------------------------------------------#這是對工人每年平均工資的爬取這些數據最終都被添加於集合中 34 html_4=getHTMLText(f[3]) 35 soup_4=BeautifulSoup(html_4) 36 price_data=[] 37 #if soup_4.find_all("tr")==None: 38 #這里捕捉異常因為在代碼運行中發現有些頁面並不存在這會導致索引錯誤 39 try: 40 for d in soup_4.find_all("tr")[5]: 41 price_data.append(d.string) 42 except: 43 price_data=["","","","","","","","","","",""] 44 finally: 45 if len(price_data)==11: 46 ok="ok" 47 else: 48 price_data=["","","","","","","","","","",""] 49 #年份,職工平均工資(元/年),職工平均工資(元/月),職工人數(萬人),職工工資總額(億元) 50 #['\n','2015','\n','81034.00','\n','6752.83','\n','452.00','\n','3662.72','\n'] 51 a_data.append(people_data[3])#這是戶籍人口 52 a_data.append(people_data[5])#這是常住人口 53 a_data.append(people_data[11])#這是出生率 54 a_data.append(price_data[3])#這是當地職員工資 55 dig_data.append(a_data) 56 #這里可以對收集的數據展示,不需要可以刪除后面變量,這代碼爬取數據實在是太慢, 57 #print("ok",dig_data) 58 #因為數據是跳轉了多個網站數據在兩個不同的集合這里進行處理 59 big_data=[] 60 for gh in range(len(da)): 61 data=[] 62 data.extend(da[gh]) 63 data.extend(dig_data[gh]) 64 big_data.append(data) 65 #這里將數據寫入文件可以方便使用不需要多次爬取數據 66 big_data
截圖展示:
這里的數據並沒有整理好游戲數字還是字符串處理在下面進行
源碼:
1 with open("F:\\新建文件夾 (2)\\房價.csv","w",encoding="utf-8") as fi: 2 writer=csv.writer(fi) 3 writer.writerow(["排名","城市","房價","戶籍人口","常住人口","出生率","工人工資"])#給每列的數據列名 4 for a in big_data: 5 writer.writerow(a) 6 fi.close()#數據到此爬取完成
截圖展示:
6.數據持久化
數據保存,
2.對數據進行清洗和處理
源碼:
1 df=pd.read_csv("F:\\新建文件夾 (2)\\房價.csv") 2 df["戶籍人口"]=df["戶籍人口"].fillna(df["戶籍人口"].mean()) 3 df["常住人口"]=df["常住人口"].fillna(df["常住人口"].mean()) 4 df["出生率"]=df["出生率"].fillna(df["出生率"].mean()) 5 df["工人工資"]=df["工人工資"].fillna(df["工人工資"].mean()) 6 #df.loc[0:,"房價"].split(",")[0] 7 for h in range(300): 8 f=[] 9 f.extend(df.loc[h,"房價"].split(",")) 10 df.loc[h,"房價"]=".".join(f) 11 df["房價"]=df["房價"].apply(float) 12 df
截圖展示:
這里將保存的數據讀取出來並對空值補中位數(這個地方補中位數可能並不是很好)
3.文本分析(可選):jieba 分詞、wordcloud 的分詞可視化
4.數據分析與可視化(例如:數據柱形圖、直方圖、散點圖、盒圖、分布圖)
源碼:
1 plt.rcParams['font.sans-serif']=['Microsoft YaHei'] #顯示中文標簽,處理中文亂碼問題 2 #房價 3 plt.subplot(2,2,1) 4 plt.boxplot(df["房價"], 5 patch_artist=True, 6 meanline=True, 7 showmeans=True,) 8 plt.title("房價") 9 #常住人口 10 plt.subplot(2,2,2) 11 plt.boxplot(df["常住人口"], 12 patch_artist=True, 13 meanline=True, 14 showmeans=True,) 15 plt.title("常住人口") 16 #出生率 17 plt.subplot(2,2,3) 18 plt.boxplot(df["出生率"], 19 patch_artist=True, 20 meanline=True, 21 showmeans=True,) 22 plt.title("出生率") 23 #工人工資 24 plt.subplot(2,2,4) 25 plt.boxplot(df["工人工資"], 26 patch_artist=True, 27 meanline=True, 28 showmeans=True,) 29 plt.title("工人工資") 30 plt.show()
截圖展示:
通過盒圖可以觀察到4個數據的總體信息,
我國房價大部分在1萬5,工人工資年薪大部分在5萬。
源碼:
1 #對房價和出生率進行分析並擬合觀察房價的高低是否影響到房價 2 plt.rcParams['font.sans-serif']=['Microsoft YaHei'] #顯示中文標簽,處理中文亂碼問題 3 plt.plot(df["房價"], 4 df["出生率"], 5 label="房價-出生率") 6 sns.regplot(df["房價"], 7 df["出生率"], 8 label="預測曲線")#二次擬合 9 plt.xlabel("房價") 10 plt.ylabel("出生率") 11 plt.title('房價出生率分析') 12 plt.legend() 13 plt.grid() 14 plt.show()
1 #通過對工人工資分析與房價關系 2 plt.rcParams['font.sans-serif']=['Microsoft YaHei'] 3 plt.plot(df["工人工資"], 4 df["房價"], 5 label='工人工資-房價') 6 sns.regplot(df["工人工資"], 7 df["房價"], 8 label="擬合") 9 plt.xlabel("工人工資") 10 plt.ylabel("房價") 11 plt.title('房價出生率分析') 12 plt.legend() 13 plt.grid() 14 plt.show()
1 #通過對常住分析與房價關系 2 plt.rcParams['font.sans-serif']=['Microsoft YaHei'] 3 plt.plot(df["常住人口"], 4 df["房價"], 5 label='常住人口-房價') 6 sns.regplot(df["常住人口"], 7 df["房價"], 8 label='擬合') 9 plt.xlabel("常住人口") 10 plt.ylabel("房價") 11 plt.title('房價常住人口分析') 12 plt.legend() 13 plt.grid() 14 plt.show()
截圖展示:
通過折線圖擬合可以看出兩數據之間的關系
源碼:
1 #折線不能很好反應數據這里用散點擬合 2 plt.subplot(2,2,1) 3 plt.scatter(df["房價"], 4 df["常住人口"], 5 label="擬合", 6 color="b") 7 sns.regplot(df["房價"], 8 df["常住人口"], 9 label="擬合", 10 color="b") 11 plt.subplot(2,2,2) 12 plt.scatter(df["房價"], 13 df["出生率"]) 14 sns.regplot(df["房價"], 15 df["出生率"], 16 label="擬合", 17 color="r") 18 plt.subplot(2,2,3) 19 plt.scatter(df["工人工資"], 20 df["房價"]) 21 sns.regplot(df["工人工資"], 22 df["房價"], 23 label="擬合", 24 color="k") 25 plt.subplot(2,2,4) 26 plt.scatter(df["常住人口"], 27 df["工人工資"]) 28 sns.regplot(df["常住人口"], 29 df["工人工資"], 30 label="擬合", 31 color="g") 32 plt.show()
截圖展示:
通過散點圖擬合觀察數據的關系
源碼:
1 #print(df.describe())#這里可看各數據的中位數,最值 2 edu=[len(df[df["房價"]<5.62525]["房價"]), 3 len(df[df["房價"]>5.62525][df["房價"]<6.963]["房價"]), 4 len(df[df["房價"]>6.963][df["房價"]<9.073075]["房價"]), 5 len(df[df["房價"]>9.073075]["房價"])] 6 #-----------------------------------------------------------數據初處理用來觀察我國房價大部分處在什么位置 7 plt.rcParams['font.sans-serif']=['Microsoft YaHei'] #顯示中文標簽,處理中文亂碼問題 8 plt.rcParams['axes.unicode_minus']=False #坐標軸負號的處理 9 plt.axes(aspect='equal') #將橫、縱坐標軸標准化處理,確保餅圖是一個正圓,否則為橢圓 10 #構造數據 11 labels = ["0-25%", "25-50%", "50-75%", "75-100%"] 12 explode = [0, 0, 0, 0.1] #生成數據,用於凸顯房價大部分 13 colors = ['#9999ff', '#ff9999', '#7777aa', '#2442aa'] #自定義顏色 14 plt.pie(edu, #繪圖數據 15 explode=explode, #指定餅圖某些部分的突出顯示,即呈現爆炸式 16 labels=labels, #添加教育水平標簽 17 colors=colors, 18 autopct='%.2f%%', #設置百分比的格式,這里保留兩位小數 19 pctdistance=0.8, #設置百分比標簽與圓心的距離 20 labeldistance=1.1, #設置教育水平標簽與圓心的距離 21 startangle=180, #設置餅圖的初始角度 22 radius=1.2, #設置餅圖的半徑 23 counterclock=False, #是否逆時針,這里設置為順時針方向 24 wedgeprops={'linewidth':1.5, 'edgecolor':'green'}, #設置餅圖內外邊界的屬性值 25 textprops={'fontsize':10, 'color':'black'}, #設置文本標簽的屬性值 26 ) 27 #添加圖標題 28 plt.title('房價分布') 29 #顯示圖形 30 plt.show()
截圖展示:
這里通過餅圖了解房價的整體分布情況,感覺上還是比較合理,
源碼:
1 import pandas as pd 2 from pyecharts.charts import Geo 3 from pyecharts import options as opts 4 attr = df['城市'] 5 value = df['房價'] 6 #str(int(df["房價"][i])) 7 geo = Geo(is_ignore_nonexistent_coord = True) 8 geo.add_schema(maptype = "china", 9 ) 10 #for i in range(len(df["城市"])): 11 # try: 12 # geo.add("2014年全國各城市房價", 13 # [attr,str(int(value))], 14 # type_="scatter", 15 # ) 16 # except: 17 # pass 18 geo.add("2014年全國各城市房價", 19 list(zip(attr,value)), 20 type_="scatter", 21 blur_size=5, 22 point_size=10, 23 is_polyline=True 24 ).set_series_opts(label_opts=opts.LabelOpts(is_show=False) 25 ).set_global_opts(visualmap_opts=opts.VisualMapOpts(max_ = 67), #設置legend顯示的最大值 26 title_opts=opts. 27 TitleOpts(title="房價分析圖"), #左上角標題 28 ) 29 30 geo.render(path="F:\\2014年全國各城市房價.html")
截圖展示:
通過對對應的地區按房價繪制地圖發現我國房價大部分處於比較低的。這個圖是可以對左下標簽索引可以觀察區間的這里沒辦法展示。
源碼:
1 # 旭日圖 2 a=df[0:50] 3 px.sunburst(a[0:30], # 繪圖數據 4 path=["排名","城市"], 5 values='房價', # 數據大小:人口數 6 color='出生率', # 顏色 7 hover_data=['城市'] # 顯示數據 8 )
截圖展示:
通過旭日圖按房價分布繪圖前50發現房價高的地區高得離譜。
7.將以上各部分的代碼匯總,附上完整程序代碼
1 from bs4 import BeautifulSoup 2 import requests 3 import pandas as pd 4 import csv 5 import matplotlib.pyplot as plt 6 from sklearn import metrics 7 import warnings 8 import seaborn as sns 9 import plotly 10 import plotly.express as px 11 import plotly.graph_objects as go 12 import plotly.io as pio 13 import numpy as np 14 warnings.filterwarnings("ignore") 15 def getHTMLText(url): 16 try: 17 headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/\ 18 537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Edg/96.0.1054.34"} 19 r=requests.get(url,headers=headers) 20 r.raise_for_status()#如果狀態不是200,就會引發HTTPError異常 21 r.encoding = r.apparent_encoding 22 return r.text 23 except: 24 return "no" 25 def dataProcessing(html):#傳入Html數據 26 soup=BeautifulSoup(html) 27 #通過對頁面分析可以發現,每個城市房價數據存在於tbody下的td中我們只需要其中的三個數據 28 datas=[] 29 hrefs=[] 30 for i in soup.find_all("tr"): 31 data=i.find_all("td") #找到所有的td標簽返回一個集合 32 if len(data)==6: #必須要執行的判斷過濾數據 33 ranks=[] #創建一個集合用於存放每一個城市的數據 34 city=i.find("a").string#找到城市的名字 35 ranks.append(data[0].string) #房價排名存在data集合的第一個 36 ranks.append(city) #添加城市名稱 37 ranks.append(data[2].string)#房價信息存在於data的第3個 38 datas.append(ranks) #將這個城市的數據放入集合 39 #datas.append(ranks) 40 #datas.append(citys) 41 #datas.append(housePrices) 42 return datas 43 def hrefs(html): 44 hrefs=[] 45 soup=BeautifulSoup(html) 46 for i in soup.find_all("tr"): 47 data=i.find_all("td") #找到所有的td標簽返回一個集合 48 if len(data)==6: 49 hrefs.append(i.find("a").get("href"))#創建一個集合用於存放其他數據鏈接 50 return hrefs 51 url="https://www.gotohui.com/top/" 52 html_1=getHTMLText(url) 53 da=dataProcessing(html_1) 54 hrefs=hrefs(html_1) 55 df=pd.DataFrame(da) 56 a=1 57 dig_data=[] 58 for g in hrefs: 59 html_2=getHTMLText(g) 60 soup_2=BeautifulSoup(html_2) 61 f=[] 62 a_data=[] 63 hreds_data=soup_2.find_all("li")[46:51] 64 for b in hreds_data: 65 f.append(b.find("a").get("href")) 66 #f集合里的5條鏈接分別是GDP,人口,財政,工資,城建 67 #------------因為這些數據是在同一段數據下沒法單獨查找,但我只需要其中的2個鏈接---------------------------- 68 #每個數據的值都給出頁面對應的屬性 69 #因為這是對每個城市的后續鏈接進行訪問,后續鏈接的HTML格式一樣用循環可以去除大量的代碼 70 #-------------------------------------------#這是對人口數據的爬取這些數據最終都被添加於集合中 71 if len(f)==5: 72 html_3=getHTMLText(f[1]) 73 soup_3=BeautifulSoup(html_3) 74 people_data=[] 75 #這里捕捉異常因為在代碼運行中發現有些頁面並不存在這會導致索引錯誤 76 try: 77 for c in soup_3.find_all("tr")[7]: 78 people_data.append(c.string) 79 #年份,戶籍人口,常住人口,城鎮化率(%),增長率(‰),出生率‰ 80 #['\n','2014','\n','332.21','\n','1077.89','\n','100.00','\n','17.48','\n','19.89','\n'] 81 except: 82 people_data=["","","","","","","","","","","","",""] 83 finally: 84 if len(people_data)==13: 85 ok="ok" 86 else: 87 people_data=["","","","","","","","","","","","",""] 88 #-------------------------------------------#這是對工人每年平均工資的爬取這些數據最終都被添加於集合中 89 html_4=getHTMLText(f[3]) 90 soup_4=BeautifulSoup(html_4) 91 price_data=[] 92 #if soup_4.find_all("tr")==None: 93 #這里捕捉異常因為在代碼運行中發現有些頁面並不存在這會導致索引錯誤 94 try: 95 for d in soup_4.find_all("tr")[5]: 96 price_data.append(d.string) 97 except: 98 price_data=["","","","","","","","","","",""] 99 finally: 100 if len(price_data)==11: 101 ok="ok" 102 else: 103 price_data=["","","","","","","","","","",""] 104 #年份,職工平均工資(元/年),職工平均工資(元/月),職工人數(萬人),職工工資總額(億元) 105 #['\n','2015','\n','81034.00','\n','6752.83','\n','452.00','\n','3662.72','\n'] 106 a_data.append(people_data[3])#這是戶籍人口 107 a_data.append(people_data[5])#這是常住人口 108 a_data.append(people_data[11])#這是出生率 109 a_data.append(price_data[3])#這是當地職員工資 110 dig_data.append(a_data) 111 #這里可以對收集的數據展示,不需要可以刪除后面變量,這代碼爬取數據實在是太慢, 112 #print("ok",dig_data) 113 #因為數據是跳轉了多個網站數據在兩個不同的集合這里進行處理 114 big_data=[] 115 for gh in range(len(da)): 116 data=[] 117 data.extend(da[gh]) 118 data.extend(dig_data[gh]) 119 big_data.append(data) 120 #這里將數據寫入文件可以方便使用不需要多次爬取數據 121 big_data 122 with open("F:\\新建文件夾 (2)\\房價.csv","w",encoding="utf-8") as fi: 123 writer=csv.writer(fi) 124 writer.writerow(["排名","城市","房價","戶籍人口","常住人口","出生率","工人工資"])#給每列的數據列名 125 for a in big_data: 126 writer.writerow(a) 127 fi.close()#數據到此爬取完成 128 df=pd.read_csv("F:\\新建文件夾 (2)\\房價.csv") 129 df["戶籍人口"]=df["戶籍人口"].fillna(df["戶籍人口"].mean()) 130 df["常住人口"]=df["常住人口"].fillna(df["常住人口"].mean()) 131 df["出生率"]=df["出生率"].fillna(df["出生率"].mean()) 132 df["工人工資"]=df["工人工資"].fillna(df["工人工資"].mean()) 133 #df.loc[0:,"房價"].split(",")[0] 134 for h in range(300): 135 f=[] 136 f.extend(df.loc[h,"房價"].split(",")) 137 df.loc[h,"房價"]=".".join(f) 138 df["房價"]=df["房價"].apply(float) 139 plt.rcParams['font.sans-serif']=['Microsoft YaHei'] #顯示中文標簽,處理中文亂碼問題 140 #房價 141 plt.subplot(2,2,1) 142 plt.boxplot(df["房價"], 143 patch_artist=True, 144 meanline=True, 145 showmeans=True,) 146 plt.title("房價") 147 #常住人口 148 plt.subplot(2,2,2) 149 plt.boxplot(df["常住人口"], 150 patch_artist=True, 151 meanline=True, 152 showmeans=True,) 153 plt.title("常住人口") 154 #出生率 155 plt.subplot(2,2,3) 156 plt.boxplot(df["出生率"], 157 patch_artist=True, 158 meanline=True, 159 showmeans=True,) 160 plt.title("出生率") 161 #工人工資 162 plt.subplot(2,2,4) 163 plt.boxplot(df["工人工資"], 164 patch_artist=True, 165 meanline=True, 166 showmeans=True,) 167 plt.title("工人工資") 168 plt.show() 169 #對房價和出生率進行分析並擬合觀察房價的高低是否影響到房價 170 plt.rcParams['font.sans-serif']=['Microsoft YaHei'] #顯示中文標簽,處理中文亂碼問題 171 plt.plot(df["房價"], 172 df["出生率"], 173 label="房價-出生率") 174 sns.regplot(df["房價"], 175 df["出生率"], 176 label="預測曲線")#二次擬合 177 plt.xlabel("房價") 178 plt.ylabel("出生率") 179 plt.title('房價出生率分析') 180 plt.legend() 181 plt.grid() 182 plt.show() 183 #通過對工人工資分析與房價關系 184 plt.rcParams['font.sans-serif']=['Microsoft YaHei'] 185 plt.plot(df["工人工資"], 186 df["房價"], 187 label='工人工資-房價') 188 sns.regplot(df["工人工資"], 189 df["房價"], 190 label="擬合") 191 plt.xlabel("工人工資") 192 plt.ylabel("房價") 193 plt.title('房價出生率分析') 194 plt.legend() 195 plt.grid() 196 plt.show() 197 #通過對常住分析與房價關系 198 plt.rcParams['font.sans-serif']=['Microsoft YaHei'] 199 plt.plot(df["常住人口"], 200 df["房價"], 201 label='常住人口-房價') 202 sns.regplot(df["常住人口"], 203 df["房價"], 204 label='擬合') 205 plt.xlabel("常住人口") 206 plt.ylabel("房價") 207 plt.title('房價常住人口分析') 208 plt.legend() 209 plt.grid() 210 plt.show() 211 #折線不能很好反應數據這里用散點擬合 212 plt.subplot(2,2,1) 213 plt.scatter(df["房價"], 214 df["常住人口"], 215 label="擬合", 216 color="b") 217 sns.regplot(df["房價"], 218 df["常住人口"], 219 label="擬合", 220 color="b") 221 plt.subplot(2,2,2) 222 plt.scatter(df["房價"], 223 df["出生率"]) 224 sns.regplot(df["房價"], 225 df["出生率"], 226 label="擬合", 227 color="r") 228 plt.subplot(2,2,3) 229 plt.scatter(df["工人工資"], 230 df["房價"]) 231 sns.regplot(df["工人工資"], 232 df["房價"], 233 label="擬合", 234 color="k") 235 plt.subplot(2,2,4) 236 plt.scatter(df["常住人口"], 237 df["工人工資"]) 238 sns.regplot(df["常住人口"], 239 df["工人工資"], 240 label="擬合", 241 color="g") 242 plt.show() 243 244 #print(df.describe())#這里可看各數據的中位數,最值 245 edu=[len(df[df["房價"]<5.62525]["房價"]), 246 len(df[df["房價"]>5.62525][df["房價"]<6.963]["房價"]), 247 len(df[df["房價"]>6.963][df["房價"]<9.073075]["房價"]), 248 len(df[df["房價"]>9.073075]["房價"])] 249 #-----------------------------------------------------------數據初處理用來觀察我國房價大部分處在什么位置 250 plt.rcParams['font.sans-serif']=['Microsoft YaHei'] #顯示中文標簽,處理中文亂碼問題 251 plt.rcParams['axes.unicode_minus']=False #坐標軸負號的處理 252 plt.axes(aspect='equal') #將橫、縱坐標軸標准化處理,確保餅圖是一個正圓,否則為橢圓 253 #構造數據 254 labels = ["0-25%", "25-50%", "50-75%", "75-100%"] 255 explode = [0, 0, 0, 0.1] #生成數據,用於凸顯房價大部分 256 colors = ['#9999ff', '#ff9999', '#7777aa', '#2442aa'] #自定義顏色 257 plt.pie(edu, #繪圖數據 258 explode=explode, #指定餅圖某些部分的突出顯示,即呈現爆炸式 259 labels=labels, #添加教育水平標簽 260 colors=colors, 261 autopct='%.2f%%', #設置百分比的格式,這里保留兩位小數 262 pctdistance=0.8, #設置百分比標簽與圓心的距離 263 labeldistance=1.1, #設置教育水平標簽與圓心的距離 264 startangle=180, #設置餅圖的初始角度 265 radius=1.2, #設置餅圖的半徑 266 counterclock=False, #是否逆時針,這里設置為順時針方向 267 wedgeprops={'linewidth':1.5, 'edgecolor':'green'}, #設置餅圖內外邊界的屬性值 268 textprops={'fontsize':10, 'color':'black'}, #設置文本標簽的屬性值 269 ) 270 #添加圖標題 271 plt.title('房價分布') 272 #顯示圖形 273 plt.show() 274 import pandas as pd 275 from pyecharts.charts import Geo 276 from pyecharts import options as opts 277 attr = df['城市'] 278 value = df['房價'] 279 #str(int(df["房價"][i])) 280 geo = Geo(is_ignore_nonexistent_coord = True) 281 geo.add_schema(maptype = "china", 282 ) 283 #for i in range(len(df["城市"])): 284 # try: 285 # geo.add("2014年全國各城市房價", 286 # [attr,str(int(value))], 287 # type_="scatter", 288 # ) 289 # except: 290 # pass 291 geo.add("2014年全國各城市房價", 292 list(zip(attr,value)), 293 type_="scatter", 294 blur_size=5, 295 point_size=10, 296 is_polyline=True 297 ).set_series_opts(label_opts=opts.LabelOpts(is_show=False) 298 ).set_global_opts(visualmap_opts=opts.VisualMapOpts(max_ = 67), #設置legend顯示的最大值 299 title_opts=opts. 300 TitleOpts(title="房價分析圖"), #左上角標題 301 ) 302 303 geo.render(path="F:\\2014年全國各城市房價.html") 304 # 旭日圖 305 a=df[0:50] 306 px.sunburst(a[0:30], # 繪圖數據 307 path=["排名","城市"], 308 values='房價', # 數據大小:人口數 309 color='出生率', # 顏色 310 hover_data=['城市'] # 顯示數據 311 )
(五)、總結(10 分)
1.經過對主題數據的分析與可視化,可以得到哪些結論?是否達到預期的目標?
對我國房價對比大部分處於還是比較正常的位置,但多數處於南方地區,但這只是對我們國家里面的房價對比,也許不太合理。我國今后的住房建設可以向西北地區傾斜。
2.在完成此設計過程中,得到哪些收獲?以及要改進的建議?
進一步了解的python在大數據方面的優越,對基礎語法更加了解,該爬蟲的后續可以通過於世界房價的比較進一步總結,又因為該數據是2014年的我在爬取的時候對於加密的數據沒法處理,如何去爬取經過加密的數據是今后要解決的問題。因為如此該數據不能很好反應今天的狀況。