房價爬取+數據可視化


(一)、選題的背景

在當下社會住房成為人們生活的一個必需品,在生活中月來越重要本課題從該地區的人口,出生率,工人工資分析房價與他們的關系

(二)、主題式網絡爬蟲設計方案

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年的我在爬取的時候對於加密的數據沒法處理,如何去爬取經過加密的數據是今后要解決的問題。因為如此該數據不能很好反應今天的狀況。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM