版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
33摘要近年來,隨著城市化水平進程的加快,以及土地價格上漲,房價節(jié)節(jié)攀升,對于絕大多數(shù)剛?cè)肼殘龅膽?yīng)屆畢業(yè)生而言,租房成為滿足居住需求的第一選擇?;ヂ?lián)網(wǎng)的發(fā)展帶動了傳統(tǒng)行業(yè)轉(zhuǎn)型,房屋租賃市場由傳統(tǒng)的房東直租和中介租房轉(zhuǎn)換為以線上租房平臺為代表的新租房模式。如何在眾多租房信息中精準篩選出滿足自己需求的房源顯得越來越重要。本文使用基于Python的網(wǎng)絡(luò)爬蟲技術(shù)獲取鏈家租房平臺上北京、上海、廣州、深圳、蘇州五個城市的相關(guān)租房數(shù)據(jù),數(shù)據(jù)存儲為CSV格式,并使用Pandas庫將數(shù)據(jù)進行清洗、分析,使用Pyecharts庫將分析結(jié)果進行可視化,以期對租房用戶和房東定價提供參考。關(guān)鍵詞:租房網(wǎng)站;數(shù)據(jù)采集;數(shù)據(jù)分析與可視化;Python;Pandas;Pyecharts前言近年來,隨著公路里程和高鐵里程的不斷增加,交通變得越來越發(fā)達,流動人口越來越多。據(jù)統(tǒng)計,2017年流動人口達到2.5億。而且城市化建設(shè)步伐加快,一、二線城市吸納了全國各地大量的人才,帶動了租房市場的發(fā)展,租賃人口也隨之不斷增加。各大城市對應(yīng)屆大學生租房補貼等利好政策也促進了住房租賃市場的發(fā)展。然而傳統(tǒng)的租房模式存在房源信息不對稱、缺乏法律保障、中介費高、中介管理混亂等問題。在這樣的環(huán)境下,為了開擴市場,提升核心競爭力,房屋租賃市場與互聯(lián)網(wǎng)相結(jié)合,以線上租房平臺為代表的新租房模式迅速發(fā)展了起來。目前線上租房平臺大體上可以分為兩類模式。一類是業(yè)主自營模式,以Airbnb為代表,平臺只是為房主和房客提供一個交易的平臺,不對房源做出任何干預(yù)。第二類是平臺自營,例如自如、鏈家等,這類平臺會對房源做出一定的干預(yù),房東將房源交給平臺,平臺對房源進行一定的包裝并統(tǒng)一運營管理。但是線上租房平臺信息繁多,如何精準地獲取數(shù)據(jù)并根據(jù)用戶需求找到適合的房源是本文研究的重點。綜上所述,本文選取鏈家網(wǎng)北京、上海、廣州、深圳、蘇州五個城市的租房信息作為研究對象,通過數(shù)據(jù)采集技術(shù)獲取租房信息,并且通過數(shù)據(jù)分析與可視化技術(shù)研究房源分布、價格、面積、樓層、戶型等租房相關(guān)因素。緒論1.1課題背景近年來,隨著公路里程和高鐵里程的不斷增加,交通變得越來越發(fā)達,流動人口越來越多。據(jù)統(tǒng)計,2017年流動人口達到2.5億。而且城市化建設(shè)步伐加快,一、二線城市吸納了全國各地大量的人才,帶動了租房市場的發(fā)展,租賃人口也隨之不斷增加。各大城市對應(yīng)屆大學生租房補貼等利好政策也促進了住房租賃市場的發(fā)展。然而傳統(tǒng)的租房模式存在房源信息不對稱、缺乏法律保障、中介費高、中介管理混亂等問題。在這樣的環(huán)境下,為了開擴市場,提升核心競爭力,房屋租賃市場與互聯(lián)網(wǎng)相結(jié)合,以線上租房平臺為代表的新租房模式迅速發(fā)展了起來。目前線上租房平臺大體上可以分為兩類模式。一類是業(yè)主自營模式,以Airbnb為代表,平臺只是為房主和房客提供一個交易的平臺,不對房源做出任何干預(yù)。第二類是平臺自營,例如自如、鏈家等,這類平臺會對房源做出一定的干預(yù),房東將房源交給平臺,平臺對房源進行一定的包裝并統(tǒng)一運營管理。但是線上租房平臺信息繁多,如何精準地獲取數(shù)據(jù)并根據(jù)用戶需求找到適合的房源是本文研究的重點。綜上所述,本文選取鏈家網(wǎng)北京、上海、廣州、深圳、蘇州五個城市的租房信息作為研究對象,通過數(shù)據(jù)采集技術(shù)獲取租房信息,并且通過數(shù)據(jù)分析與可視化技術(shù)研究房源分布、價格、面積、樓層、戶型等租房相關(guān)因素。1.2課題意義根據(jù)CBNData的2018年輕人租房大數(shù)據(jù)報告,90后95后年輕人初入職場,成為了租房主力軍。報告指出,預(yù)計住房租賃市場未來將持續(xù)增長,至2023年預(yù)計租賃人口將達到2.48億人。隨著租房的需求持續(xù)增加,催生出了越來越多的中介服務(wù),而線上租房平臺也乘著互聯(lián)網(wǎng)的東風迅速發(fā)展,比較知名的互聯(lián)網(wǎng)租房平臺有鏈家、自如、Airbnb等。對于初入職場的95后而言,為了避免黑中介扣押金的問題,往往會選擇較為透明的線上租房,除此以外,通過線上租房平臺,還可以通過搜索、篩選功能精確的找到符合自己要求的住房。在此背景下,對線上租房平臺進行數(shù)據(jù)分析就顯得尤為重要。本文對當下年輕人租房所需要考慮的因素,例如房源地理分布、戶型、租金、面積等進行數(shù)據(jù)分析與可視化處理。并以北京、上海、廣州、深圳、蘇州為例,通過數(shù)據(jù)分析得出相對客觀的結(jié)果,并將結(jié)果進行可視化呈現(xiàn)。通過對租房數(shù)據(jù)的分析,可以清晰地發(fā)現(xiàn)房源的各項信息,為用戶租房提供借鑒;可以了解同一區(qū)域內(nèi)房租均價、每平米均價、每居室均價等,為房東定價提供參考。
相關(guān)環(huán)境和技術(shù)2.1Python簡介Python是一門語法簡潔但是功能強大的解釋型編程語言,因其簡單如上手的特點,廣受開發(fā)者喜愛,曾多次獲得TIOBE最佳年度語言排名第一名。它擁有簡潔但高效的數(shù)據(jù)結(jié)構(gòu),例如列表相當于長度可變的數(shù)組,因此能用使用簡單的而又高效的語言進行開發(fā)。Python以其開發(fā)效率著稱,致力于用最短、最優(yōu)雅的方式完成任務(wù)。盡管Python的運行效率受人詬病,但被被稱為“膠水語言”的它可以調(diào)用C/C++程序,將耗時的部分轉(zhuǎn)移給C/C++運行,然后由Python來整合,這樣就可以兼顧開發(fā)高效與運行高效。本文使用的Pandas庫就是基于C語言開發(fā),在大多數(shù)數(shù)據(jù)分析部分,運行效率已經(jīng)不輸C語言。2.2Requests簡介使用Python進行網(wǎng)絡(luò)爬蟲通常有兩種常用的庫,一種是urllib,一種是requests。使用urllib的request模塊就可以方便地實現(xiàn)發(fā)送請求并得到響應(yīng)。然而urllib仍有不足之處,例如使用urllib添加cookies時就需要另外寫opener和handler。而requests則可以很好的解決這個問題,使用requests庫可以更方便地實現(xiàn)添加cookie,處理登錄驗證、設(shè)置代理等,也因此requests庫成為了使用頻率最高的爬蟲庫。2.3BeautifulSoup簡介BeautifulSoup庫是Python的一個解析HTML或XML的第三方程序庫,可以用它來方便地提取數(shù)據(jù)。它的優(yōu)點有很多,例如自動將輸入文檔轉(zhuǎn)換為Unicode編碼,輸出文檔為UTF-8編碼,開發(fā)者無需擔心編碼的問題,它提供了一些簡單的函數(shù)來解析文檔、選擇元素、搜索數(shù)據(jù)。使用beautifulsoup庫可以處理不規(guī)范的標簽,并生成解析樹,使用方法選擇器的find_all()方法可以快速獲取內(nèi)容,大大節(jié)約編程時間。2.4Pandas簡介Pandas是Python的一個用于數(shù)據(jù)處理的第三方程序庫。它不僅提供了豐富的數(shù)據(jù)結(jié)構(gòu),例如DataFrame、series等,同時也為處理數(shù)據(jù)表和時間序列提供了相應(yīng)的函數(shù)。使用Pandas可以很便利地操作不同來源的數(shù)據(jù),例如CSV文件、MySQL數(shù)據(jù)庫、MongoDB數(shù)據(jù)庫、Pickle文件、excel表格、txt文本、json數(shù)據(jù)等,支持類似于SQL的增、刪、改、查,支持豐富的數(shù)據(jù)處理函數(shù),支持靈活處理缺失數(shù)據(jù)和異常數(shù)據(jù)等,是Python的最強大的數(shù)據(jù)分析與處理的工具。2.5Pyecharts簡介Echarts是百度開發(fā)的一款可視化JS庫,不僅擁有豐富的基本圖標,還支持地理數(shù)據(jù)可視化,卻提供了中文文檔,是近年來較為流行的可視化JS庫。而Pyecharts是結(jié)合了Python與Echarts的第三方庫,擁有Python簡潔優(yōu)雅的語法,提供了眾多API,幾乎完美支持全部的Echarts圖表,相對Echarts來說,使用Pyecharts進行數(shù)據(jù)可視化,不需要使用WEB框架即可直接使用。第三章需求分析3.1可行性分析通過對本論文實現(xiàn)的網(wǎng)絡(luò)爬蟲和數(shù)據(jù)可視化功能進行可行性分析,可以讓我們對整體的一個項目結(jié)構(gòu)有一個明確的認知。并且對其進行可行性分析的過程中,我們可以預(yù)先發(fā)現(xiàn)一些日后可能存在的程序問題,并對其進行優(yōu)化。本論文在軟件方面,主要采用Pycharm這款工具來進行python語言的編寫,并且可以在PyCharm軟件中下載本文中需要的第三方庫,例如BeautifulSoup4、Requests、Pyecharts等第三方工具庫。這使得我們在編程環(huán)境上大大節(jié)省了時間和安裝第三方庫所額外花費的精力。 在技術(shù)方面,本文采用python語言為編程語言,主要因為其語言的簡潔性、易用性以及其對第三方庫友好的支持性。采用requests庫來發(fā)送請求并得到響應(yīng),使用BeautifulSoup來對數(shù)據(jù)進行解析,使用pandas庫對數(shù)據(jù)進行清洗,以及使用Pyecharts來實現(xiàn)數(shù)據(jù)的可視化。3.2需求分析本文旨在分析一線城市的房源信息,為租戶租房和房東定價提供參考。在對鏈家網(wǎng)的數(shù)據(jù)采集中,主要選取北京、上海、廣州、深圳、蘇州這五個城市作為主要的研究對象,分別對房屋概況、地理位置、面積大小、朝向、戶型、樓層以及租金等方面的信息進行采集,接著對采集的數(shù)據(jù)進行數(shù)據(jù)清洗,提取出有用的信息,并將數(shù)據(jù)格式進行處理,然后通過數(shù)據(jù)可視化技術(shù)對租房信息進行分析。整體流程如下圖所示:圖3-1數(shù)據(jù)分析流程圖數(shù)據(jù)獲取與存儲,即通過網(wǎng)絡(luò)爬蟲技術(shù),獲取本文研究對象所需的數(shù)據(jù),并將這些數(shù)據(jù)存儲在本地。網(wǎng)絡(luò)爬蟲技術(shù)采集的原始數(shù)據(jù)的組織形式可能有很多鐘形態(tài),但大多數(shù)時候數(shù)據(jù)是以json格式傳輸?shù)?。為了便于后續(xù)分析與處理,在數(shù)據(jù)獲取與存儲階段,應(yīng)該盡量保持數(shù)據(jù)原有的存儲結(jié)構(gòu),不進行額外的處理,以防止出現(xiàn)臟數(shù)據(jù)。本文的數(shù)據(jù)采集部分,主要使用Python語言對鏈家租房網(wǎng)站的北京、上海、廣州、深圳、蘇州五個城市進行數(shù)據(jù)采集,獲取了租房信息中的地理位置、面積大小、朝向、租金、戶型、樓層等關(guān)鍵信息并將獲取到的數(shù)據(jù)按照城市名保存為CSV文件。采集的具體流程為:1、解析網(wǎng)頁結(jié)構(gòu),確定網(wǎng)絡(luò)爬蟲方案;2、拼接URL,用于獲取各城市的各行政區(qū)的房源數(shù)據(jù);3、偽造請求頭,向服務(wù)器發(fā)起;4、請求解析服務(wù)器返回的響應(yīng)信息5、保存文件數(shù)據(jù)采集具體流程圖如下圖所示:圖3-2數(shù)據(jù)采集流程圖數(shù)據(jù)清洗與預(yù)處理,通常是指對采集到的數(shù)據(jù)進行一定的處理,以便后續(xù)的數(shù)據(jù)分析與可視化。數(shù)據(jù)預(yù)處理的主要目的是清除、處理一些異常值。這些異常值可能是數(shù)據(jù)采集時由于網(wǎng)絡(luò)io阻塞導(dǎo)致的重復(fù)值,也有可能是系統(tǒng)錯誤導(dǎo)致的異常值,也有可能是網(wǎng)站反爬蟲技術(shù)導(dǎo)致的無效值和缺失值。將這些沒有價值的數(shù)據(jù)和異常的數(shù)據(jù)清洗掉,能更顯著地反映出各個字段之間的潛在聯(lián)系,便于后續(xù)分析。通常情況下,數(shù)據(jù)清洗的策略有丟棄法和替換法。例如,丟棄法包括重復(fù)值去重、空值丟棄、去掉異常的最值等。替換法包括用均值、插值法替換缺失值。在本文的數(shù)據(jù)清洗與預(yù)處理部分中,主要使用Pandas庫進行數(shù)據(jù)清洗工作,需要將樓層中的異常值所在的該條記錄去掉,例如樓層中存在“未知”和“地下室”等記錄,可以使用Pandas的反向索引刪除異常值。由于這些記錄不多,不會影響整體的分析,因此可以直接去掉。此外,樓層字段和面積大小字段也存在“0”和“未知”等無效屬性,需要刪除記錄。初步清洗掉無效屬性以后,需要規(guī)整數(shù)據(jù),提取出有效數(shù)據(jù)。例如摘要字段只需要提取整租/合租類型,位置字段只需要提取所在行政區(qū),不需要具體的地址。樓層字段和房型字段,通過正則表達式提取數(shù)值,用于說明所在的樓層和房型是幾室的,其他無效文字剔除。面積大小和樓層字段,需要去除數(shù)值單位,只保留數(shù)值,以便進行數(shù)值計算與排序。具體清洗流程如下圖所示:圖3-3數(shù)據(jù)清洗流程圖數(shù)據(jù)探索性分析與可視化,即通過一些分析方法充分認識已經(jīng)清洗完的干凈數(shù)據(jù),而后根據(jù)租戶最關(guān)心的問題,試圖從數(shù)據(jù)中發(fā)現(xiàn)潛在的聯(lián)系并得出分析結(jié)論。而數(shù)據(jù)可視化只是數(shù)據(jù)分析的輔助手段,用于更好地展示數(shù)據(jù)。在探索性數(shù)據(jù)分析中,數(shù)據(jù)可視化可以輔助分析者,使得分析過程更加形象、立體。數(shù)據(jù)可視化是讓分析者認識數(shù)據(jù)、理解數(shù)據(jù)最直接、最形象、最容易的方式,能夠使分析過程更加簡單。本文的數(shù)據(jù)分析與可視化部分,采用Pyecharts繪圖庫,繪制了餅圖、柱狀圖、地圖、條形圖等,結(jié)合圖表詳細分析了整租和合租的占比情況、房屋朝向?qū)ψ饨鸬挠绊?、房源的分布情況、不同區(qū)域的平均租金和每平米租金以及哪些戶型最受到歡迎。經(jīng)過上述可視化分析,使得租戶和房東能夠更加直觀地了解房源信息。數(shù)據(jù)分析與可視化流程如下:圖3-4數(shù)據(jù)分析與可視化流程圖
第四章數(shù)據(jù)采集4.1整體設(shè)計本文對鏈家租房網(wǎng)站的房源信息進行采集,包括如下字段:摘要、位置、大小、朝向、戶型、樓層、價格。爬蟲整體的設(shè)計思路為向服務(wù)器發(fā)送請求,解析返回的html元素,使用beautifulsoup庫提取出有價值的信息,然后使用循環(huán)拼接url的方式獲取下一頁的數(shù)據(jù)。主要分為如下幾個部分:分析網(wǎng)頁結(jié)構(gòu),找到對應(yīng)的請求地址偽造請求頭,向網(wǎng)站請求數(shù)據(jù)解析響應(yīng)的數(shù)據(jù)獲取各市的區(qū)域范圍5.保存數(shù)據(jù)4.2分析網(wǎng)頁與請求數(shù)據(jù)首先打開鏈家網(wǎng)站,切換到租房選項卡,然后將地點定位在北京,此時通過Chrome瀏覽器的開發(fā)者模式我們可以發(fā)現(xiàn)此時的URL地址是/zufang/。很明顯,bj是北京的縮寫,因此如果是別的城市,只需要將bj修改為其他城市的拼音首字母即可。例如上海租房,即為/zufang/,不同的城市有不同的域名。這是在數(shù)據(jù)采集工作前需要考慮的第一點。使用Chrome瀏覽器的開發(fā)者工具查看當前網(wǎng)頁的cookie,可以發(fā)現(xiàn)有一個名為select_city的字段,北京的值為110000。如圖3-1所示。如果是其他城市,這個值也會發(fā)生變化,也就是說不同城市有不同的站點對應(yīng)著不同的cookie。這是數(shù)據(jù)采集工作前第二個注意點。圖4-1Chrome瀏覽器中cookie信息圖第三個注意點是區(qū)域劃分。一個市可以劃分為若干個行政區(qū),每個行政區(qū)還可以分為若干個商圈。以北京市為例,區(qū)域選擇東城,東城還包含多個商圈。如下圖所示:圖4-2區(qū)域范圍圖此時URL為/zufang/dongcheng/,如果選擇其中的一個商圈,例如安定門,則URL變?yōu)?zufang/andingmen/。體現(xiàn)在URL上,行政區(qū)和所屬商圈并非是父節(jié)點與子節(jié)點的關(guān)系,但是必須要先獲得上一級的區(qū)域,才能獲取到具體的商圈,然后才可以針對該商圈內(nèi)的房源數(shù)據(jù)進行數(shù)據(jù)采集。也就是說,在設(shè)計爬蟲函數(shù)時,需要先設(shè)計一個函數(shù)獲取行政區(qū)的頁面數(shù)據(jù),然后再設(shè)計一個函數(shù)從頁面數(shù)據(jù)中提取出各商圈的URL。最后通過拼接URL的方式向服務(wù)發(fā)送請求。如果不按照區(qū)域劃分來進行爬蟲,那么僅能獲取到前100頁的房源數(shù)據(jù)。請求數(shù)據(jù)首先需要偽造請求頭,鏈家網(wǎng)站定位不同地區(qū)就會切換到對應(yīng)的站點,每個站點的cookie都有不同,因此在爬蟲程序開始之前需要先通過瀏覽器的開發(fā)者工具獲取當前站點的cookie,然后才能進行爬蟲。除此以外還對異常進行處理,防止出現(xiàn)網(wǎng)絡(luò)堵塞的情況,以及適當添加請求延遲,防止被網(wǎng)站反爬蟲檢測到。代碼如下:def
get_res(url):
head
=
{
"User-Agent":
"Mozilla/5.0
(Windows
NT
10.0;
Win64;
x64)
AppleWebKit/537.36
(KHTML,
like
Gecko)
Chrome/81.0.4044.138
Safari/537.36
Edg/81.0.416.77",
"Cookie":
"lianjia_uuid=7a8a36e1-876a-48c4-bd6b-8856a1ce21ff;
UM_distinctid=174fb463ffe3c2-0801c61ab79807-7e647b6e-1fa400-174fb463fff57a;
_ga=GA1.2.55439363.1601943522;
_smt_uid=5f7bb7e7.48e89141;
sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22174fb464d382ff-0b5f27dc617831-7e647b6e-2073600-174fb464d3a193%22%2C%22%24device_id%22%3A%22174fb464d382ff-0b5f27dc617831-7e647b6e-2073600-174fb464d3a193%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_referrer%22%3A%22%22%2C%22%24latest_referrer_host%22%3A%22%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%7D%7D;
_gid=GA1.2.1284386193.1602169686;
lianjia_ssid=055b7ef2-6dd2-40a7-aa3b-fe91cf909a59;
select_city=110000;
User-Realip=;
srcid=eyJ0Ijoie1wiZGF0YVwiOlwiODM5MzY1MmE2NDIwZWRiOGZjNDM4YzQxZjIwOWM1M2Q2ZThmOTM2ZjBmMjUwMjJkMmIzMjMzYmFhZjBkZDIwZmJmZmJmZWI2ODRlMDNmNGJkMTk5OGRhMWVlMDUzYmQ2OWEyYjE5NjIzNTIxNDVkOGExNjYzZWY2NjgzNzBmMWU4M2JiYTA3N2Q2ZjQ4YTI0NTYwNWUwMGZkMDg2YzM4NTJhY2YwNGIzOTRmYWMzMWIxNTZiODdmMTNjZTk3Y2Y3YmY2NzUzYzI2YmQ0YmQwYWM3OTdlNTUyMzhlYTU0NzFhNDU5YmRlNzI1MTMxNGQwZmE3NWNlZTlhYzJiODQ0ZTVhMGZmOTFkMGVkMmJjYTk1ZTA5MTA2YTgxNzRhY2FhNDkzZjVmMmI0YTA0Mjk5MTBhNzQ3NGEyYjNmMDhlMTVhYjFkOGYxY2Y2YzFkZDcwNmEzZTFhMWIxNGZmODMwMFwiLFwia2V5X2lkXCI6XCIxXCIsXCJzaWduXCI6XCIyMDE4NThjZlwifSIsInIiOiJodHRwczovL2JqLmxpYW5qaWEuY29tL3p1ZmFuZyIsIm9zIjoid2ViIiwidiI6IjAuMSJ9",
"Connection":
"keep-alive"
}
try:
response
=
requests.get(url,
headers=head,
timeout=10)
return
response.text
except
requests.exceptions.RequestException
as
e:
print('第二次嘗試獲取
',
url)
try:
response
=
requests.get(url,
headers=head,
timeout=10)
return
response.text
except
requests.exceptions.RequestException
as
e:
print('獲取',
url,
'失敗')
4.3解析響應(yīng)數(shù)據(jù)與獲取區(qū)域范圍使用beautifulsoup庫處理返回以后的響應(yīng)數(shù)據(jù),可以提取出本文研究對象所需要的數(shù)據(jù)。這部分定義了一個getData函數(shù),在函數(shù)內(nèi)部調(diào)用了上一模塊的請求函數(shù),然后對返回的信息進行處理。使用beautifulsoup庫找到本文研究對象所需要的信息所在的頁面層級。例如,在本例中爬取的信息都在名為content__list--item--main的div中,返回的是tag組成的列表。接下來再對該列表進行查找即可找到所需的信息。代碼如下所示:def
getData(url):
datalist
=
[]
html
=
get_res(url)
if
html
==
'':
return
''
bs
=
BeautifulSoup(html,
"html.parser")
list
=
bs.find_all("div",
class_="content__list--item--main")
for
item
in
list:
try:
info1
=
item.contents[1].contents[1].string.strip()
info2
=
item.contents[3].contents[1].string.strip()
+
"-"
+
item.contents[3].contents[3].string.strip()
+
"-"
+
\
item.contents[3].contents[5].string.strip()
info3
=
item.contents[3].contents[8].string.strip()
info4
=
item.contents[3].contents[10].string.strip()
if
'南'
in
info4
or
'北'
in
info4
or
'東'
in
info4
or
'西'
in
info4:
info5
=
item.contents[3].contents[12].string.strip()
info6
=
item.contents[3].contents[13].contents[2].string.replace("
",
"").replace("\n",
"")
else:
info4
=
''
info5
=
item.contents[3].contents[10].string.strip()
info6
=
item.contents[3].contents[11].contents[2].string.replace("
",
"").replace("\n",
"")
info7
=
item.contents[9].contents[0].contents[0]
except:
print(url,
'數(shù)據(jù)篩選出現(xiàn)了問題')
continue
datalist.append([info1,
info2,
info3,
info4,
info5,
info6,
info7])
return
datalist
獲取區(qū)域范圍區(qū)域范圍可以劃分為大區(qū)域和小區(qū)域。大區(qū)域是行政區(qū),小區(qū)域是商圈,先請求主站點,獲取行政區(qū)的跳轉(zhuǎn)URL,然后拼接URL,依次請求行政區(qū)的地址,獲取該行政區(qū)的商圈URL,通過循環(huán)遍歷即可獲取所有大小區(qū)域的URL。代碼如下所示:def
getBigAreaList(url):
bigAreaList
=
[]
html
=
get_res(url)
bs
=
BeautifulSoup(html,
"html.parser")
list
=
bs.find_all("li",
class_="filter__item--level2")
for
item
in
list:
href
=
item.contents[1].get('href')
if
'ditie'
in
href
or
href
==
"/zufang/":
continue
bigAreaList.append(href)
return
bigAreaList
def
getSamllAreaList(bigAreaList):
samllAreaList
=
[]
for
bhref
in
bigAreaList:
url
=
""
+
bhref
html
=
get_res(url)
bs
=
BeautifulSoup(html,
"html.parser")
list
=
bs.find_all("li",
class_="filter__item--level3")
for
item
in
list:
href
=
item.contents[1].get("href")
if
href
==
bhref:
continue
samllAreaList.append(href)
return
samllAreaList
4.4保存文件與主函數(shù)CSV是以純文本形式存儲數(shù)據(jù),由任意數(shù)目的記錄組成,每條記錄由若干字段組成,相當于一個結(jié)構(gòu)化表。而爬蟲爬取的數(shù)據(jù)一般情況下為結(jié)構(gòu)化數(shù)據(jù),因此使用CSV儲存數(shù)據(jù)。代碼如下所示:def
saveData(datalist):
#
headers
=
['摘要',
'位置',
'大小',
'朝向',
'戶型',
'樓層',
'價格(元/月)']
file
=
open('databj.csv',
'a',
newline='',
encoding='UTF-8')
csvf
=
csv.writer(file)
csvf.writerows(datalist)
主函數(shù)主函數(shù)主要是調(diào)用函數(shù),傳入大小區(qū)域列表,獲取頁面數(shù)拼接請求URL等。主函數(shù)代碼如下所示:import
requests
import
csv
import
time
import
random
from
bs4
import
BeautifulSoup
#
網(wǎng)頁解析
if
__name__
==
"__main__":
baseurl
=
"/zufang"
counter
=
0
start
=
time.time()
failedUrls
=
[]
print('開始獲取網(wǎng)頁列表')
list
=
getSamllAreaList(getBigAreaList(baseurl))
print('獲取網(wǎng)頁列表結(jié)束')
for
href
in
list:
url
=
""
+
href
print(url,
'開始獲取房數(shù)')
html
=
get_res(url)
if
html
==
'':
failedUrls.append(url)
continue
bs
=
BeautifulSoup(html,
"html.parser")
num
=
int(bs.find("span",
class_="content__title--hl").string)
print('共有
',
num,
'
套')
if
num
==
0:
continue
for
i
in
range(1,
num
//
30
+
2):
counter
=
counter
+
1
print('開始獲取',
url
+
"pg"
+
str(i))
datalist
=
getData(url
+
"pg"
+
str(i))
if
datalist
==
'':
print('沒有獲取到')
failedUrls.append(url
+
"pg"
+
str(i))
counter
=
counter
-
1
continue
saveData(datalist)
print('第
'
+
str(counter)
+
'
個頁面數(shù)據(jù)已保存')
time.sleep(random.random())
end
=
time.time()
print('總共用時:',
int((end
-
start)
//
60),
'
分鐘',
int((end
-
start)
%
60),
'秒')
print('請求失敗連接數(shù):',
len(failedUrls))
第五章數(shù)據(jù)預(yù)處理5.1數(shù)據(jù)清洗獲取到數(shù)據(jù)之后需要對一些臟數(shù)據(jù)進行處理。例如樓層這一列,本應(yīng)該是數(shù)值型的字段,但是出現(xiàn)了“未知”、“地下室”等,這些需要被清洗掉。這里使用的是pandas的反向索引。代碼如下所示:df
=
df[~df["樓層"].str.contains("地下室")]
df
=
df[~df["樓層"].str.contains("未知")]
在摘要信息中,只需要知道整租還是合租即可,即提取出包含整租或合租的記錄即可,再將該列名稱修改為租房方式。租房面積這一列中,大小為0的記錄顯然是臟數(shù)據(jù),需要刪除掉。除此以外還有戶型字段,需要刪除戶型為“未知”的記錄。代碼如下所示:df
=
df[df["摘要"].str.contains("整租|合租")]
df.rename(columns={"摘要":
"租房方式"},
inplace=True)
df
=
df[~df["大小"].str.contains("0")]
df
=
df[~df["戶型"].str.contains("未知")]
5.2提取有效數(shù)據(jù)對數(shù)據(jù)進行預(yù)處理以后就可以提取出有效數(shù)據(jù)了。首先來預(yù)覽一下數(shù)據(jù),如下圖所示:圖5-1數(shù)據(jù)預(yù)覽圖首先需要添加列名,然后對摘要列提取出整租/合租,其他無關(guān)信息都要刪除掉。第二列的地區(qū)只需要保留xx區(qū),不需要具體地址。第三列面積大小需要提取出數(shù)值,第五列在本文中只需要知道是幾室即可,通過正則表達式提取出數(shù)值。第六列提取處樓層數(shù)。代碼如下所示:def
process_data(filename):
df
=
pd.read_csv(filename)
df.columns
=
['摘要',
'位置',
'大小',
'朝向',
'戶型',
'樓層',
'價格(元/月)']
#
提取租房方式
df
=
df[df["摘要"].str.contains("整租|合租")]
df["摘要"]
=
[x[:2]
for
x
in
df["摘要"]]
#
修改列名
df.rename(columns={"摘要":
"租房方式"},
inplace=True)
#
提取地區(qū)
#
df["位置"]=[x.replace("區(qū)","")
for
x
in
df["位置"]]
df["位置"]
=
[x[:2]
for
x
in
df["位置"]]
#
提取面積大小
df["大小"]
=
[re.search(r"\d+",
x)[0]
for
x
in
df["大小"]]
df
=
df[~df["大小"].str.contains("0")]
#
提取戶型
df
=
df[~df["戶型"].str.contains("未知")]
df["戶型"]
=
[x[:1]
for
x
in
df["戶型"]]
#
提取樓層數(shù)
#
可能存在層高不一致的問題,因此不能用簡單的高樓層低樓層區(qū)分
df
=
df[~df["樓層"].str.contains("地下室")]
df
=
df[~df["樓層"].str.contains("未知")]
df["樓層"]
=
[re.findall(r"\d+",
x)[0]
for
x
in
df['樓層']]
return
df
第六章數(shù)據(jù)分析與可視化6.1整租與合租占比經(jīng)過北京的群租房事件,平臺已不顯示北京地區(qū)和上海地區(qū)的合租房信息。因此這部分只有廣州和深圳兩個城市參與分析。使用pandas的value_counts()可以快速分組,然后將數(shù)據(jù)處理成[(key,value),(key,value)]的形式,以便后續(xù)pyecharts調(diào)用。如下是代碼及效果圖:#
1.
整租
合租占比
#
深圳
sz_type
=
sz_clean["租房方式"].value_counts()
sz_type_data
=
[i
for
i
in
zip(["整租",
"合租"],
[int(sz_type["整租"]),
int(sz_type["合租"])])]
#
上海
sh_type
=
sh_clean["租房方式"].value_counts()
#
上海無合租
sh_type_data
=
[("整租",
sh_type["整租"])]
#
廣州
gz_type
=
gz_clean["租房方式"].value_counts()
gz_type_data
=
[i
for
i
in
zip(["整租",
"合租"],
[int(gz_type["整租"]),
int(gz_type["合租"])])]
#
北京
bj_type
=
bj_clean["租房方式"].value_counts()
#
北京無合租
bj_type_data
=
[("整租",
bj_type["整租"])]
#
蘇州
su_type
=
su_clean["租房方式"].value_counts()
su_type_data
=
[i
for
i
in
zip(["整租",
"合租"],
[int(su_type["整租"]),
int(su_type["合租"])])]
def
draw_type_pie(data,
name):
pie
=
Pie(init_opts=opt.InitOpts(width="600px",
height="600px"))
pie.add(series_name="租房方式占比",
data_pair=data,
radius=[120,
240])
pie.set_global_opts(title_opts=opt.TitleOpts(name
+
"租房類型對比"))
pie.set_series_opts(
label_opts=opt.LabelOpts(position="inside",
is_show=True,
formatter=":
{c}
(i6qkaa6%)",
font_size=14),
tooltip_opts=opt.TooltipOpts(is_show=False))
return
pie
draw_type_pie(sz_type_data,
"深圳").render("深圳租房類型對比.html")
draw_type_pie(gz_type_data,
"廣州").render("廣州租房類型對比.html")
draw_type_pie(su_type_data,
"蘇州").render("蘇州租房類型對比.html")
圖6-1深圳租房類型對比圖圖6-2廣州租房類型對比圖圖6-3蘇州租房類型對比圖由上圖可知,廣州、深圳、蘇州三地大多數(shù)都是整租的房源。在以往的認知中,剛進入職場的年輕人大多數(shù)會選擇合租以降低租房成本。然而根據(jù)圖表得出結(jié)果卻與此相悖。從平臺角度和市場需求角度分析其可能得原因,一是經(jīng)過北京的群租房事件,平臺為規(guī)避風險,不會上架過多的合租房源,其二可能是如今的年輕人更渴望私密的個人空間,不愿意與陌生人合租,體現(xiàn)在平臺上則整租房源數(shù)量遠大于合租。6.2房屋的朝向?qū)Ρ确课莩蛞彩窍鄬Ρ容^重要的一個租房因素,因為房屋的朝向與租金直接掛鉤,也許租戶不會太在意朝向,但是不會不在意房租。以下是代碼及效果圖:#
2.
房屋朝向占比
餅圖
def
get_direction_data(data):
dir
=
data["朝向"].value_counts()
return
[("南",
int(dir["南"])),
("東南",
int(dir["東南"])),
("西南",
int(dir["西南"])),
("北",
int(dir["北"])),
("東",
int(dir["東"])),
("其他",
len(data)
-
int(
dir["南"])
-
int(dir["東南"])
-
int(dir["西南"])
-
int(dir["北"])
-
int(
dir["東"]))]
def
draw_direct_pie(data,
name):
pie
=
Pie(init_opts=opt.InitOpts(width="600px",
height="600px"))
pie.add("房間朝向?qū)Ρ?,
data,
radius=[120,
240],
)
pie.set_series_opts(
label_opts=opt.LabelOpts(position="inside",
is_show=True,
formatter=":
{c}
(e6qyako%)",
font_size=14),
tooltip_opts=opt.TooltipOpts(is_show=False))
pie.set_global_opts(title_opts=opt.TitleOpts("{}房屋朝向".format(name)))
pie.render("{}房屋朝向.html".format(name))
draw_direct_pie(get_direction_data(bj_clean),
"北京")
draw_direct_pie(get_direction_data(sh_clean),
"上海")
draw_direct_pie(get_direction_data(gz_clean),
"廣州")
draw_direct_pie(get_direction_data(sz_clean),
"深圳")
draw_direct_pie(get_direction_data(su_clean),
"蘇州")
圖6-4北京市房源房屋朝向?qū)Ρ葓D圖6-5上海市房源房屋朝向?qū)Ρ葓D圖6-6廣州市房源房屋朝向?qū)Ρ葓D圖6-7深圳市房源房屋朝向?qū)Ρ葓D圖6-8蘇州市房源房屋朝向?qū)Ρ葓D根據(jù)上圖,除了蘇州、上海以外,其他三個城市的朝南方向的房源數(shù)據(jù)并沒有占據(jù)壓倒性的優(yōu)勢。一則是由于統(tǒng)計方式導(dǎo)致的,因為在統(tǒng)計時房源朝向時,整租房源有多個房間的朝向歸類為其他,尤其是北京市,整租房源占比較多的情況下,擁有多個房間朝向的“其他”分類遠超其他朝向。二是上文提到的,對一些租戶來說更在意租金而不是房間朝向,同一套房源的朝北房間一般都會比朝南房間便宜一些,尤其是在廣深兩市,平臺提供了相當大比例的朝北房間,反映了市場有這樣的需求。 而蘇州和上海兩地建筑風格相似,都流行“板式住宅”?!鞍迨阶≌钡奶攸c是東西長、南北短,采光好,南北通透,基本每戶都有朝南的臥室。這也解釋了為什么蘇州、上海兩地朝南戶型占據(jù)大多數(shù)。6.3房源分布情況房源分布,也就是說租房房源在城市的哪個區(qū)域更多,可以一定程度上反映哪些區(qū)域的房源房租適合,交通便利。這個部分使用地圖顯示大致的房源數(shù)量的多寡,使用柱狀圖顯示詳細的房源數(shù)量。以下是代碼及效果圖:#
3.
房源分布圖(按區(qū)分組)
#
蘇州
su_area
=
[]
for
i
in
su_clean["位置"]:
if
i
==
"工業(yè)":
su_area.append(i
+
"園區(qū)")
elif
i
==
"昆山":
su_area.append(i
+
"市")
else:
su_area.append(i
+
"區(qū)")
su_clean["位置"]
=
su_area
su_clean["累計"]
=
0
su_amount
=
su_clean[["位置",
"累計"]].groupby(by=["位置"]).count().reset_index()
su_amount.sort_values(by=["累計"],
inplace=True,
ascending=False)
def
get_amount(data):
area
=
[i
+
"區(qū)"
for
i
in
data["位置"]]
data["位置"]
=
area
data["累計"]
=
0
new_data
=
data[["位置",
"累計"]].groupby(by=["位置"]).count().reset_index()
new_data.sort_values(by=["累計"],
inplace=True,
ascending=False)
return
new_data
gz_amount
=
get_amount(gz_clean)
bj_amount
=
get_amount(bj_clean)
sz_amount
=
get_amount(sz_clean)
def
draw_amount_bar(x_data,
y_data,
name):
bar
=
Bar()
bar.add_xaxis(x_data)
bar.add_yaxis(series_name="",
y_axis=y_data)
bar.set_global_opts(title_opts=opt.TitleOpts("{}房源數(shù)量分布".format(name)),
xaxis_opts=opt.AxisOpts(axislabel_opts=opt.LabelOpts(interval=0,
font_size=14,
rotate=-15)),
yaxis_opts=opt.AxisOpts(axislabel_opts=opt.LabelOpts(formatter="{value}套",
font_size=14))
)
return
bar.render("{}各區(qū)租房數(shù)量柱狀圖.html".format(name))
draw_amount_bar([i
for
i
in
bj_amount["位置"]],
[int(i)
for
i
in
bj_amount['累計']],
"北京")
draw_amount_bar([i
for
i
in
sh_amount["位置"]],
[int(i)
for
i
in
sh_amount['累計']],
"上海")
draw_amount_bar([i
for
i
in
gz_amount["位置"]],
[int(i)
for
i
in
gz_amount['累計']],
"廣州")
draw_amount_bar([i
for
i
in
sz_amount["位置"]],
[int(i)
for
i
in
sz_amount['累計']],
"深圳")
draw_amount_bar([i
for
i
in
su_amount["位置"]],
[int(i)
for
i
in
su_amount['累計']],
"蘇州")
#
房源數(shù)量分布熱力圖
def
draw_amount_map(data,
name,
pieces):
map
=
Map(init_opts=opt.InitOpts(width="900px",
height="900px"))
map.add("房源數(shù)量",
data,
name)
map.set_global_opts(title_opts=opt.TitleOpts(name
+
"房源地理分布"))
map.set_global_opts(visualmap_opts=opt.VisualMapOpts(is_piecewise=True,
pieces=pieces))
return
map.render("{}房源數(shù)量分布圖.html".format(name))
piece_sz
=
[
{'max':
1000,
'color':
'#FFFFF0'},
{'min':
1000,
'max':
1999,
'color':
'#FFE0E0'},
{'min':
2000,
'max':
2999,
'color':
'#FEC0C0'},
{'min':
3000,
'max':
3999,
'color':
'#FD9090'},
{'min':
4000,
'max':
4999,
'color':
'#FC6060'},
{'min':
5000,
'max':
5999,
'color':
'#C92C34'},
{'min':
6000,
'color':
'#6F171F'},
]
draw_amount_map([i
for
i
in
zip(sh_amount["位置"],
sh_amount["累計"])],
"上海",
piece_sh)
draw_amount_map([i
for
i
in
zip(bj_amount["位置"],
bj_amount["累計"])],
"北京",
piece_bj)
draw_amount_map([i
for
i
in
zip(gz_amount["位置"],
gz_amount["累計"])],
"廣州",
piece_gz)
draw_amount_map([i
for
i
in
zip(sz_amount["位置"],
sz_amount["累計"])],
"深圳",
piece_sz)
draw_amount_map([i
for
i
in
zip(su_amount["位置"],
su_amount["累計"])],
"蘇州",
piece_su)
圖6-9北京市房源分布柱狀圖圖6-10北京市房源分布地理圖圖6-11上海市房源分布柱狀圖圖6-12上海市房源分布地理圖圖6-13廣州市房源分布柱狀圖圖6-14廣州市房源分布地理圖圖6-15深圳市房源分布柱狀圖圖6-16深圳市房源分布地理圖圖6-17蘇州市房源分布柱狀圖圖6-18蘇州市房源分布地理圖通過上述的圖,可以發(fā)現(xiàn),房源密集的區(qū)域無一不是企業(yè)較多,交通便利的地方。以北京市為例,除了周邊的通州、大興、昌平、順義、房山等區(qū)有較多房源外,房源集中在朝陽區(qū)、豐臺、海淀、東城、西城等中心城區(qū),當然這片區(qū)域也是最貴的。其中朝陽區(qū)的房源最多,幾乎是排名第二的豐臺區(qū)房源的兩倍。上海也是一樣,除了周邊的寶山、嘉定、松江、青浦、奉賢等區(qū)有較多房源以外,房源主要集中在中心城區(qū)及浦東新區(qū)。廣州的房源數(shù)量在四個城市中是最多的,共有88932條,主要集中在天河、番禺、白云、黃埔及越秀區(qū),房源數(shù)量均超過6000條,選擇眾多。由地圖可知,這些房源都較為集中,給附近的公共交通帶來巨大的壓力。深圳的房源主要集中在龍崗區(qū)、福田區(qū)及南山區(qū),房租相對便宜一些的龍崗區(qū)的房源數(shù)量是最多的,有將近7000套,占比近20%。雖然蘇州市的房源數(shù)量是四個城市中最少,但作為新一線城市,蘇州的房源主要集中在昆山市和吳中區(qū)。由于工業(yè)園區(qū)并不屬于行政區(qū),因此在地圖上難以體現(xiàn),吳中區(qū)和工業(yè)園區(qū)的地理位置高度重疊,可以粗略地將二者相加,房源數(shù)量超過一萬套。不論是工業(yè)園區(qū)還是排在后面的高新區(qū),都是企業(yè)較多的行政區(qū),而昆山市因其常年位居百強縣第一名,吸引眾多外來打工者。并且,上海11號線地鐵通往昆山花橋站,有不少人在上海工作的人選擇在昆山租房,因此房源數(shù)量也是相當多。6.4租金分析以上的分析還不是最重要的,房源的地理分布透露的信息也不算多,租金才是租戶更關(guān)心的因素。為此,本文分析了各區(qū)平均租金、各區(qū)每平米平均租金、各區(qū)每居室平均租金等。各區(qū)平均租金各區(qū)的平均租金可以看出各區(qū)整體的房租分布情況。由于北京的密云區(qū),蘇州的太倉市、常熟市、張家港市的樣本太少,因此不計算在內(nèi)。以下是代碼及效果圖:#
4.
各區(qū)平均租金
bj_avg_price
=
bj_clean[["位置",
"價格(元/月)"]].groupby(by=["位置"],
as_index=False).mean().sort_values(by=["價格(元/月)"],
ascending=False)
sh_avg_price
=
sh_clean[["位置",
"價格(元/月)"]].groupby(by=["位置"],
as_index=False).mean().sort_values(by=["價格(元/月)"],
ascending=False)
gz_avg_price
=
gz_clean[["位置",
"價格(元/月)"]].groupby(by=["位置"],
as_index=False).mean().sort_values(by=["價格(元/月)"],
ascending=False)
sz_avg_price
=
sz_clean[["位置",
"價格(元/月)"]].groupby(by=["位置"],
as_index=False).mean().sort_values(by=["價格(元/月)"],
ascending=False)
su_avg_price
=
su_clean[["位置",
"價格(元/月)"]].groupby(by=["位置"],
as_index=False).mean().sort_values(by=["價格(元/月)"],
ascending=False)
def
draw_avgpri_bar(data,
name):
bar
=
Bar()
bar.add_xaxis([i
for
i
in
data["位置"]])
bar.add_yaxis(series_name="平均租金",
y_axis=[int(i)
for
i
in
data["價格(元/月)"]])
bar.set_global_opts(title_opts=opt.TitleOpts("{}各區(qū)平均租金".format(name)),
xaxis_opts=opt.AxisOpts(axislabel_opts=opt.LabelOpts(interval=0,
font_size=14,
rotate=-15)),
yaxis_opts=opt.AxisOpts(axislabel_opts=opt.LabelOpts(formatter="{value}元/月",
font_size=14)))
return
bar.render("{}各區(qū)平均租金.html".format(name))
draw_avgpri_bar(bj_avg_price,
"北京")
draw_avgpri_bar(sh_avg_price,
"上海")
draw_avgpri_bar(gz_avg_price,
"廣州")
draw_avgpri_bar(sz_avg_price,
"深圳")
draw_avgpri_bar(su_avg_price,
"蘇州")
圖6-19北京各區(qū)平均租金柱狀圖圖6-20上海市各區(qū)平均租金柱狀圖圖6-21廣州市各區(qū)平均租金柱狀圖圖6-22深圳市各區(qū)平均租金柱狀圖圖6-23蘇州市各區(qū)平均租金柱狀圖由上圖可以看出北京市朝陽區(qū)的平均租金最高,海淀區(qū)、西城區(qū)、東城區(qū)緊隨其后,這四個區(qū)是北京市最發(fā)達的城區(qū),東城區(qū)和西城區(qū)是政治文化中心,海淀是高科技產(chǎn)業(yè)、教育產(chǎn)業(yè)、高校聚集地,而朝陽區(qū)則是經(jīng)濟中心,因此這四個區(qū)的房價遙遙領(lǐng)先也不奇怪了。上海市黃浦區(qū)的平均租金最高,長寧區(qū)與浦東新區(qū)次之。黃浦區(qū)位于上海市中心,是上海的經(jīng)濟、行政和文化中心,經(jīng)濟實力過硬。長寧區(qū)是被被稱為上海的富人區(qū),房租普遍更貴,且長寧區(qū)吸引了來自全球各地的外籍人士及港澳臺同胞等,成為眾多境外人士首選的居住地。而浦東新區(qū)自改革開放以來發(fā)生了翻天覆地的變化,坐擁陸家嘴金融圈,可以說是上海經(jīng)濟最強的區(qū),因此房租也是高居不下。廣州市天河區(qū)的平均租金最高,隨后是越秀區(qū)和海珠區(qū),從地圖上看,這三個區(qū)聚集在一處,位于地鐵沿線,交通便利,且三個區(qū)面積不大,通勤時間短,不失為租房的好地方,房租也因此水漲船高。深圳市南山區(qū)的平均租金最高,遠超排名第二的福田區(qū),平均房租排名前三的區(qū)也是GDP排名前三的區(qū)??紤]到南山區(qū)有眾多高科技公司,例如中興、騰訊等,因此平均房租高也正常。蘇州市工業(yè)園區(qū)的平均租金最高,為5232元/月,遠超其他區(qū)的平均3000元/月的平均租金。原因在于工業(yè)園區(qū)聚集了大量高科技企業(yè)及外資企業(yè),且交通便利,環(huán)境優(yōu)美。從總體上看,蘇州市、廣州市平均租金較低,非常適合年輕人打拼,而上海市月平均租金破萬的就有7個區(qū),遠遠超過其他三個城市,即使是北京,也僅有朝陽區(qū)月平均房租堪堪超過一萬元,也許是上海作為全國的經(jīng)濟中心,聚集了大量的“后浪”,也僅有“后浪”才能負擔得起這么昂貴的房租。各區(qū)每平米租金各區(qū)每平米租金代碼及效果圖如下所示:#
5.每平米租金
分區(qū)
柱狀圖
地圖
def
get_rent_psm(data):
data["每平米租金"]
=
np.round(data["價格(元/月)"]
/
data["大小"].astype(int),
1)
rent_psm_area
=
data[["每平米租金",
"位置"]].groupby(by=["位置"],
as_index=False).mean()
rent_psm_area["每平米租金"]
=
rent_psm_area["每平米租金"].astype(int)
rent_psm_area.sort_values(by=["每平米租金"],
ascending=False,
inplace=True)
return
rent_psm_area
bj_rent_psm
=
get_rent_psm(bj_clean)
#
bj_rent_psm
=
bj_rent_psm[~bj_rent_psm["位置"].str.contains("密云區(qū)")]
sh_rent_psm
=
get_rent_psm(sh_clean)
gz_rent_psm
=
get_rent_psm(gz_clean)
sz_rent_psm
=
get_rent_psm(sz_clean)
su_rent_psm
=
get_rent_psm(su_clean)
def
draw_rent_psm_bar(data,
name):
bar
=
Bar()
bar.add_xaxis([i
for
i
in
data["位置"]])
bar.add_yaxis("",
y_axis=[i
for
i
in
data["每平米租金"]]).reversal_axis()
bar.set_series_opts(label_opts=opt.LabelOpts(position="right"))
bar.set_global_opts(title_opts=opt.TitleOpts("{}每平米租金".format(name)),
xaxis_opts=opt.AxisOpts(axislabel_opts=opt.LabelOpts(formatter="{value}元/每平米",
font_size=14)),
yaxis_opts=opt.AxisOpts(axislabel_opts=opt.LabelOpts(font_size=14)))
bar.render("{}每平米租金_柱狀圖.html".format(name))
draw_rent_psm_bar(bj_rent_psm,
"北京")
draw_rent_psm_bar(sh_rent_psm,
"上海")
draw_rent_psm_bar(gz_rent_psm,
"廣州")
draw_rent_psm_bar(sz_rent_psm,
"深圳")
draw_rent_psm_bar(su_rent_psm,
"蘇州")
#
每平米租金
分區(qū)
地圖
def
draw_rent_psm_map(data,
name):
map
=
Map(init_opts=opt.InitOpts(width="900px",
height="900px"))
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- CCAA - 環(huán)境管理體系基礎(chǔ)摸底考試二答案及解析 - 詳解版(65題)
- 山西省陽泉市盂縣2025-2026學年七年級上學期期末生物學試題(無答案)
- 2025-2026學年湖南省長沙市高三第一次模擬考試試卷數(shù)學試題(人教A版)(原卷版)
- 養(yǎng)老院入住老人法律權(quán)益保護制度
- 老年終末期尿失禁的護理干預(yù)方案循證推廣
- 皮具制作工崗前技術(shù)突破考核試卷含答案
- 我國上市公司社會責任信息披露的價值相關(guān)性探究:基于理論、現(xiàn)狀與實踐的多維度分析
- 我國上市公司獨立監(jiān)事制度的困境與突破:基于公司治理視角的深度剖析
- 保健調(diào)理師崗前跨界整合考核試卷含答案
- 我國上市公司內(nèi)部控制自我評價:現(xiàn)狀、挑戰(zhàn)與優(yōu)化路徑研究
- (一模)烏魯木齊地區(qū)2026年高三年級第一次質(zhì)量監(jiān)測物理試卷(含答案)
- 江蘇省南通市如皋市創(chuàng)新班2025-2026學年高一上學期期末數(shù)學試題+答案
- 2026年年長租公寓市場分析
- 生態(tài)環(huán)境監(jiān)測數(shù)據(jù)分析報告
- 浙江省杭州市蕭山區(qū)2024-2025學年六年級上學期語文期末試卷(含答案)
- 學堂在線 雨課堂 學堂云 實繩結(jié)技術(shù) 章節(jié)測試答案
- 屋頂光伏安全專項施工方案
- 醫(yī)療器械拓展性臨床試驗管理規(guī)定(試行)YY/T-0292.1-2020《醫(yī)用診斷X射線輻射防護器具》
- 《中國古代文學通識讀本》pdf
- 罐區(qū)加溫操作規(guī)程
- 國有企業(yè)干部選拔任用工作系列表格優(yōu)質(zhì)資料
評論
0/150
提交評論