版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
目錄
1引言1
1.1項(xiàng)目背景1
1.2開發(fā)環(huán)境與工具1
1.2.1Python簡介2
1.2.2數(shù)據(jù)可視化簡介2
1.2.3Jypyternotebook簡介2
2需求分析3
2.1可行性需求分析3
2.2采集目標(biāo)功能分析3
2.3關(guān)鍵技術(shù)分析4
2.3.1網(wǎng)絡(luò)爬蟲技術(shù)4
2.3.2文件存取技術(shù)4
2.3.3可視化技術(shù)4
3數(shù)據(jù)采集5
3.1采集頁面分析5
3.2字段分析8
3.2.1車輛名稱字段分析9
3.2.2車輛日期字段分析9
3.2.3車輛里程字段分析10
3.2.4車輛售價(jià)字段分析11
3.3編程實(shí)現(xiàn)12
4數(shù)據(jù)清洗與處理15
4.1數(shù)據(jù)清洗16
4.2數(shù)據(jù)儲存18
4.3編程實(shí)現(xiàn)19
5數(shù)據(jù)統(tǒng)計(jì)與分析20
5.1數(shù)據(jù)準(zhǔn)備20
I
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
5.2數(shù)據(jù)分析與展示20
5.2.1依據(jù)年統(tǒng)計(jì)總里程和總售價(jià)21
5.2.2依據(jù)年份對車輛總數(shù)進(jìn)行統(tǒng)計(jì)26
5.2.3依據(jù)車型對車輛進(jìn)行統(tǒng)計(jì)27
6小結(jié)31
參考資料32
II
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
基于Python的人人車網(wǎng)絡(luò)平臺數(shù)據(jù)采集與分析
1引言
在時(shí)代高速發(fā)展的今天,信息已經(jīng)成為了當(dāng)今人們身邊的重要組成部分。
不管是人手一臺的手機(jī)電腦還是企業(yè)之間的數(shù)據(jù)和運(yùn)作都需要用到信息。大量
的數(shù)據(jù)和信息需要存儲并做出一定的處理。大數(shù)據(jù)需要特殊的技術(shù),以有效地
處理大量的數(shù)據(jù)。
1.1項(xiàng)目背景
隨著云時(shí)代的來臨,信息已經(jīng)成為了重要的數(shù)據(jù)。在互聯(lián)網(wǎng),數(shù)據(jù)庫,大
數(shù)據(jù)技術(shù)不斷完善的今天,為我們進(jìn)行大數(shù)據(jù)分析和數(shù)據(jù)挖掘提供了強(qiáng)大支撐。
人人車在2014年四月成立,以其首創(chuàng)的二手車C2C交易模式作為切入點(diǎn),
現(xiàn)已發(fā)展成為二手車、新車交易,金融服務(wù),售后等為一體的綜合型汽車交易
服務(wù)平臺。
2017年9月,中國汽車業(yè)協(xié)會與人人車簽訂了全國二手車檢驗(yàn)標(biāo)準(zhǔn)“行認(rèn)
證”,并在全國范圍內(nèi)開展了第一個(gè)二手車電商平臺的戰(zhàn)略合作,對新車進(jìn)行
了全面的檢驗(yàn),確保了新車的質(zhì)量。在2021年七月十三日,人人汽車與中國女
足正式簽訂了合作協(xié)議,并與中國女足正式簽約。
通過對人人車二手車網(wǎng)的數(shù)據(jù)采集,我們可以更好的了解二手車市場的趨
勢。
我的畢業(yè)設(shè)計(jì)就是使用Python語言針對人人車網(wǎng)站進(jìn)行大數(shù)據(jù)二手車的
信息爬取、清洗和可視化,從而可以獲得各個(gè)車輛的價(jià)格、里程與時(shí)間,也可
以讓想買二手車的人更好的找到自己所需。
1.2開發(fā)環(huán)境與工具
人人車二手車網(wǎng)數(shù)據(jù)的采集與分析,并對數(shù)據(jù)進(jìn)行一個(gè)可視化,所以我使用了
Python爬蟲技術(shù)、Python可視化。用的是谷歌瀏覽器和360安全瀏覽器,使用
的Python軟件是PyCharmCommunityEdition2020.3.2x64。使用的環(huán)境是谷歌
瀏覽版本110.0.5481.178(正式版本)(64位),所以chromedriver驅(qū)動版本
要110的。
1
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
1.2.1Python簡介
Python是一種新的解釋性腳本語言,它的創(chuàng)立者吉多·范羅薩姆于1989年
在阿姆斯特丹過圣誕節(jié),當(dāng)時(shí)他正處于百無聊賴的狀態(tài),在ABC的基礎(chǔ)上,發(fā)
展出了一種全新的解釋性腳本語言。
至于“python”這個(gè)名字,則是源自于英國1970年代的一部著名連續(xù)劇
《蒙提.派森的飛行馬戲團(tuán)》,龜叔就是這部電影的鐵桿粉絲。
Python是一種簡單、明了、而且具有很高一致性的程序模式。正因?yàn)樗?/p>
簡單、開放,所以它也是當(dāng)前最主要的一種編程語言。
Python提供了高效的高級數(shù)據(jù)結(jié)構(gòu),還能簡單有效地面向?qū)ο缶幊獭ython
語法和動態(tài)類型,以及解釋型語言的本質(zhì),使它成為多數(shù)平臺上寫腳本和快速
開發(fā)應(yīng)用的編程語言。
Python的代碼大寶化為模塊、軟件包,便于管理、分發(fā),是一個(gè)很好的團(tuán)
隊(duì)協(xié)作開發(fā)的好地方。
1.2.2數(shù)據(jù)可視化簡介
數(shù)據(jù)可視化是圖形表示的數(shù)據(jù)。它包括生成一幅圖片,該圖片向圖片瀏覽
者傳遞所代表的數(shù)據(jù)間的關(guān)系。在可視化處理中,利用圖元與資料數(shù)值間的系
統(tǒng)對應(yīng)關(guān)系,可達(dá)到此目的。這個(gè)地圖決定了一個(gè)數(shù)據(jù)的數(shù)值是怎樣被可視化
的,決定了一個(gè)圖形標(biāo)簽的屬性是怎樣和怎樣被改變來反應(yīng)參考數(shù)值的變化。
為了更清楚、更高效地表達(dá)信息,數(shù)據(jù)的可視化可以使用統(tǒng)計(jì)圖,圖表,
資訊圖,以及其它的工具。數(shù)碼資料可藉由點(diǎn)、線或條狀來以視覺方式傳遞量
化訊息。高效的可視化可以幫助使用者對數(shù)據(jù)及證據(jù)進(jìn)行分析與推理。它使得
更容易訪問,理解,并使用了復(fù)雜的數(shù)據(jù)。使用者可以根據(jù)圖表的設(shè)計(jì)原則(也
就是展示對比結(jié)果或展示結(jié)果),來做一些具體的分析工作,比如做一些比較
或者理解一些原因。一般情況下,用戶可以在表格中找到具體的指標(biāo),而不同
的圖形則被用來展示一個(gè)或者多個(gè)變量之間的圖案或者關(guān)系。
1.2.3Jypyternotebook簡介
Jupyternotebook是一款基于Web的交互式計(jì)算軟件。其中,所有的互動
計(jì)算,編寫說明性文件,數(shù)學(xué)公式,圖片,以及其它富媒體的輸入與輸出,都
以文件的方式呈現(xiàn)出來。這樣的文件不但可以很容易地進(jìn)行版本管理,而且可
以很容易地與別人分享。它可以用于整個(gè)流程的計(jì)算,包括開發(fā),文檔的編寫,
2
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
代碼的運(yùn)行,以及結(jié)果的顯示。利用LaTeX,Jupyternotebook也可以用來寫數(shù)
學(xué)注釋。
Jupyternotebook通過語法突出顯示,縮進(jìn)和標(biāo)簽填充來編寫程序。您可
以在瀏覽器中直接執(zhí)行此程式碼,執(zhí)行的結(jié)果會顯示在程式碼的下方。當(dāng)你為
你的代碼撰寫指令文件或者聲明時(shí),你可以使用標(biāo)記文法。
Jupyternotebook是專門為數(shù)據(jù)清洗而設(shè)計(jì)的,它可以用于數(shù)據(jù)清洗,搜
索,大數(shù)據(jù)分析。
2需求分析
2.1可行性需求分析
1.技術(shù)可行性
由于python語言的通俗易懂,我將使用python3.8(64-bit)對網(wǎng)頁進(jìn)行
Python爬蟲數(shù)據(jù)的獲取,然后通過Jupyternotebook和PyCharmCommunity
Edition2020.3.2x64對數(shù)據(jù)進(jìn)行數(shù)據(jù)可視化和數(shù)據(jù)清洗。
2.項(xiàng)目可行性
人們普遍的話題有就業(yè)、車輛、房屋等問題,其中車輛問題是近幾年一直
討論的話題,在就業(yè)壓力極大、工資普遍不高、消費(fèi)逐漸變高、車輛需求量變
大的環(huán)境下,選擇車輛就尤為重要。本次項(xiàng)目利用數(shù)據(jù)采集對人人車二手車網(wǎng)
進(jìn)行一個(gè)統(tǒng)計(jì)分析,對于爬取人人車網(wǎng)上的車輛信息、價(jià)格、里程,通過一些
統(tǒng)計(jì)描述和分析,進(jìn)行數(shù)據(jù)清洗和處理,最后將其可視化,從而滿足我們對車
輛的需求。
2.2采集目標(biāo)功能分析
這次項(xiàng)目的數(shù)據(jù)來源于人人車二手車網(wǎng),是通過Python爬取人人車二手車
網(wǎng)的車輛各信息。爬取332頁的車輛信息,數(shù)據(jù)清洗后共1886條記錄,以此盡
可能保證數(shù)據(jù)可靠性。
本次爬人人車二手車網(wǎng),獲得了以下信息:車輛名稱、車輛日期、車輛里
程、車輛售價(jià)。主要是通過實(shí)際數(shù)據(jù)來分析描述車輛的日期以及售價(jià);比如:
這個(gè)地方的二手車輛有多少,其中哪一輛車的名稱、上架日期啊、總共跑了多
少里程啊以及出售的價(jià)格,這樣我們就能了解到每一年的二手車輛銷售數(shù)據(jù),
3
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
從而分析二手車的市場。
2.3關(guān)鍵技術(shù)分析
2.3.1網(wǎng)絡(luò)爬蟲技術(shù)
在FOAF的圈子里,也有很多人把它叫做“頁面捕食者”,它是一種軟件,
可以根據(jù)某種規(guī)律,自動抓取萬維網(wǎng)上的信息。網(wǎng)絡(luò)爬蟲從其體系結(jié)構(gòu)及實(shí)現(xiàn)
技術(shù)上可以劃分為通用式、聚焦式、增量式、深度式等幾種。但是嚴(yán)格意義來
講根據(jù)使用場景只有通用爬蟲和聚焦爬蟲之分。
2.3.2文件存取技術(shù)
在數(shù)據(jù)分析過程中,常常會出現(xiàn)這樣的問題,那就是我們所要分析的數(shù)據(jù)
不是直接寫進(jìn)程序,而是通過各種手段把它讀入內(nèi)存中,這種情況下,就會導(dǎo)
致程序代碼冗長,可用性差。通常的處理方式是:先把要被分析的數(shù)據(jù)存入本
地,然后再從存儲器中讀出。
一般保存數(shù)據(jù)的方式有文本文件、excel文件與數(shù)據(jù)庫保存。
Python使用open函數(shù)保存如圖2-1顯示:
圖2-1python的open函數(shù)保存
2.3.3可視化技術(shù)
數(shù)據(jù)可視化技術(shù)是用圖形的方式來表達(dá)數(shù)據(jù)和信息。它的目標(biāo)是將信息清
晰而高效地傳遞給用戶。這是數(shù)據(jù)分析和數(shù)據(jù)科學(xué)的其中一個(gè)步驟。據(jù)
VitalyFriedma所言,“數(shù)據(jù)可視化的首要目的就是要用一種圖解的方式來表達(dá)
清楚而高效的信息。這并不是說,數(shù)據(jù)視覺化就一定要讓人覺得枯燥乏味,或
者看上去很漂亮。要想把想法高效地表達(dá)出來,審美的形式和功能必須同時(shí)進(jìn)
行,用更加直觀的方式表達(dá)出對稀疏而復(fù)雜的數(shù)據(jù)集的洞察力。但是,設(shè)計(jì)者
往往不能在形式與功能之間找到一個(gè)平衡點(diǎn),花哨的數(shù)據(jù)可視化不能實(shí)現(xiàn)它的
主要目標(biāo)-傳遞信息?!?/p>
這里使用到了第三方庫如下:
4
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
Pyecharts:ECharts是EnterpriseCharts的縮寫,它是一種商業(yè)級數(shù)據(jù)
圖表,它是一種純Javascript的圖表庫,它可以流暢地運(yùn)行在PC和移動設(shè)備
上,并且與目前絕大多數(shù)瀏覽器相兼容,它可以提供一種直觀、生動、可互動、
可高度個(gè)性化定制的數(shù)據(jù)可視化圖表。其創(chuàng)新性的“拖動再計(jì)算”、“數(shù)據(jù)視
圖”、“價(jià)值域漫游”等功能,極大地提高了用戶的使用體驗(yàn),使用戶能夠更
好地挖掘和整合數(shù)據(jù)。
Matplotlib:這是一款基于Python的二維繪圖軟件包,可以為用戶提供多
種硬復(fù)制格式的、可交互的、多個(gè)平臺的、交互的、可供選擇的圖片。利用
Matplotlib,開發(fā)者只需要用到幾行代碼,就可以生成繪圖,直方圖,功率圖,
條形圖,錯(cuò)誤圖,散點(diǎn)圖等。
Pandas:Pandas是一個(gè)免費(fèi)、開源的第三方Python類庫,是Python數(shù)據(jù)
分析中的一個(gè)重要的工具,它為Python的數(shù)據(jù)分析提供了一種高效的,簡單易
用的數(shù)據(jù)結(jié)構(gòu),比如Series和DataFrame。自從它出現(xiàn)以來,已經(jīng)在金融,統(tǒng)
計(jì),社會科學(xué),建筑工程等諸多領(lǐng)域得到了廣泛的應(yīng)用。Pandas程序庫是在
PythonNumPy程序庫的基礎(chǔ)上開發(fā)出來的,可以和Python的科學(xué)計(jì)算程序庫一
起工作。Pandas提供了Series(一維數(shù)組結(jié)構(gòu))與DataFrame(二維數(shù)組結(jié)
構(gòu))兩種數(shù)據(jù)結(jié)構(gòu),大大增強(qiáng)了Pandas的數(shù)據(jù)分析能力。
3數(shù)據(jù)采集
3.1采集頁面分析
打開谷歌瀏覽器或360瀏覽器,首先進(jìn)入人人車二手車網(wǎng),在地址那一欄
中選擇關(guān)鍵字:合肥。觀察圖3-1,其中URL為:/hf/;
然后點(diǎn)擊頁面中的紅色框的我要買車,同時(shí)觀察圖3-2中的URL,發(fā)現(xiàn)URL變化
成了/hf/ershouche/p1/;然后點(diǎn)擊分頁,繼續(xù)觀
察圖3-3中的URL,發(fā)現(xiàn)URL變成了
/hf/ershouche/p2/。相比較圖3-2,我們可以發(fā)現(xiàn)
只有最后的p1變成了p2
5
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
圖3-1人人車二手車爬取信息頁面
圖3-2人人車二手車第一頁URL頁面
6
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
圖3-3人人車二手車第二頁URL頁面
按F12調(diào)出開發(fā)者工具,選擇Network,然后按Ctrl+P鍵刷新頁面,如圖3-4。
點(diǎn)擊開發(fā)者工具上面的Headers字段,可以發(fā)現(xiàn)RequestMethod是GET,然后
我們滑到最底部,找到User-Agent,如圖3-5。
圖3-4開發(fā)者工具頁面
7
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
圖3-5開發(fā)者工具頁面
3.2字段分析
點(diǎn)擊開發(fā)者工具中的左上角的箭頭,點(diǎn)擊需要的數(shù)據(jù),定位到我們所爬取
的數(shù)據(jù)的位置,如圖3-6,可r以看到我們剛才點(diǎn)擊定位的那段數(shù)據(jù)以及需要的
數(shù)據(jù)都有:車輛名稱、車輛日期、車輛總里程和車輛售價(jià),并且都在名為
class="row-fluidlist-rowjs-car-list"的ul列表中。然后使用
EC.presence_of_element_located((By.CLASS_NAME,
"row-fluid.list-row.js-car-list")就能進(jìn)入到這個(gè)class里面。
圖3-6分析數(shù)據(jù)類型頁面
8
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
3.2.1車輛名稱字段分析
如圖3-7,我們可以看到人人車網(wǎng)中的車輛名稱都在ul標(biāo)簽下的class為
span6list-itemcar-item的li標(biāo)簽里面的a標(biāo)簽下的h3標(biāo)簽里面,我使用
cars_list=driver.find_elements(by=By.CLASS_NAME,
value="span6.list-item.car-item")來定位這整個(gè)列表,然后用for循環(huán)進(jìn)入
列表,再使用XPATH定位數(shù)據(jù)爬取如圖3-8所示
圖3-7分析人人數(shù)據(jù)頁面
圖3-8車輛名稱定位爬取代碼
3.2.2車輛日期字段分析
如圖3-9所示,可以看出車輛日期和車輛名稱在同一個(gè)li里面,我們就可
以繼續(xù)for循環(huán)中寫,只不過實(shí)在第二個(gè)div中的span里面,但又因?yàn)槿掌诤?/p>
里程在一起,所以要使用split對其進(jìn)行隔開獲取,因?yàn)槿掌谠谇懊嫠允褂?/p>
_time=car.find_element(by=By.XPATH,
9
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
value="./a/div[2]/span").text.split("/")[0]就能獲取到,如圖3-10所示。
圖3-9車輛日期網(wǎng)站分析
圖3-10車輛日期定位爬取代碼
3.2.3車輛里程字段分析
車輛里程字段和車輛日期字段在一起,同上一樣,只需要使用_mileage=
car.find_element(by=By.XPATH,
value="./a/div[2]/span").text.split("/")[1]就能獲取到里程。如圖3-11。
10
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
圖3-11車輛里程定位爬取代碼
3.2.4車輛售價(jià)字段分析
如圖3-12所示,車輛售價(jià)數(shù)據(jù)在同一個(gè)li列表里的的第四個(gè)div中的div
中的第一個(gè)字段里面,因?yàn)槔锩嬗幸粋€(gè)數(shù)據(jù)和一個(gè)數(shù)據(jù)單位,所以我們?nèi)∠聛?/p>
放在一起,使用_price=car.find_element(by=By.XPATH,
value="./a/div[4]/div").text.split()[0]就能獲取到,如圖3-13。
圖3-12車輛售價(jià)定位分析
11
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
圖3-13車輛售價(jià)定位爬取代碼
3.3編程實(shí)現(xiàn)
首先要使用selenium要先在Terminal里面使用pipinstall進(jìn)行安裝庫,
然后我們要配置selenium的環(huán)境,需要到網(wǎng)址為
/index.html的網(wǎng)站中下載與
谷歌瀏覽器所對應(yīng)版本的chromedriver驅(qū)動才可以使用。
然后導(dǎo)入要用到的庫,如圖3-14。
圖3-14導(dǎo)入所需庫頁面
先使用open函數(shù)創(chuàng)建一個(gè)名為data.csv的文件,然后使用
csv.DictWriter設(shè)置文件中有四列參數(shù),再使用一個(gè)for循環(huán)去設(shè)置網(wǎng)頁每一
頁的鏈接去帶入進(jìn)def函數(shù)里面爬取,進(jìn)入函數(shù)就連接驅(qū)動,并進(jìn)行User-Agent
偽裝,然后指定Driver路徑,再使用一個(gè)異常進(jìn)入網(wǎng)頁,并定位到ul標(biāo)簽里
面,然后將所有的li放進(jìn)列表里,使用for循環(huán)列表,再使用一個(gè)異常對數(shù)據(jù)
進(jìn)行爬取并存入文件和打印,出現(xiàn)異常則拋掉異常,具體運(yùn)行代碼如下:
importcsv
fromseleniumimportwebdriver
frommon.byimportBy
12
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
fromselenium.webdriver.supportimportexpected_conditionsasEC
fromselenium.webdriver.support.uiimportWebDriverWait
defget_cars_info(page):
base_url="/hf/ershouche/"
target_url=base_url+page
options=webdriver.ChromeOptions()
options.add_argument("User-Agent=Mozilla/5.0(X11;Linuxx86_64)AppleWebKit/537.36
(KHTML,likeGecko)"
"Chrome/Safari/537.36")
#options.add_argument("--proxy-server=")
options.add_argument("--headless")
#指定Driver路徑
#options.binary_location=""
#driver=webdriver.Chrome(executable_path="",options=options)
driver=webdriver.Chrome(options=options)
try:
driver.get(target_url)
car_list_total=WebDriverWait(driver,10).until(
EC.presence_of_element_located((By.CLASS_NAME,
"row-fluid.list-row.js-car-list"))
)
13
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
cars_list=driver.find_elements(by=By.CLASS_NAME,
value="span6.list-item.car-item")
forcarincars_list:
try:
_name=car.find_element(by=By.XPATH,value="./a/h3").text
_time=car.find_element(by=By.XPATH,
value="./a/div[2]/span").text.split("/")[0]
_mileage=car.find_element(by=By.XPATH,
value="./a/div[2]/span").text.split("/")[1]
_price=car.find_element(by=By.XPATH,
value="./a/div[4]/div").text.split()[0]
car_item={
"_name":_name,
"_time":_time,
"_mileage":_mileage,
"_price":_price
}
csv_writer.writerow(car_item)
print("提交:",car_item)
exceptException:
pass
exceptExceptionasex:
pass
14
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
#啟動
data_file=open("data.csv","a+",newline="")
csv_writer=csv.DictWriter(data_file,fieldnames=["_name","_time","_mileage",
"_price"])
for_pageinrange(1,332):
get_cars_info("p"+str(_page))
print("第",_page,"頁結(jié)束
")
data_file.close()
4數(shù)據(jù)清洗與處理
數(shù)據(jù)清洗指的是在數(shù)據(jù)文件中,發(fā)現(xiàn)并修正可辨識的錯(cuò)誤的最終步驟,其
中包含了對數(shù)據(jù)一致性的檢查,對無效值、缺失值的內(nèi)容進(jìn)行處理。與問卷審
核不同,錄入后的數(shù)據(jù)清理一般是由計(jì)算機(jī)而不是人工完成。數(shù)據(jù)清洗主要是
指在回收數(shù)據(jù)之后,對樣本、變量、數(shù)據(jù)、問卷邏輯等進(jìn)行預(yù)處理的過程,它
是數(shù)據(jù)分析之前必不可少的一個(gè)步驟,它的結(jié)果對數(shù)據(jù)分析的質(zhì)量和效率有很
大的影響。
在數(shù)據(jù)處理中,數(shù)據(jù)清洗是一個(gè)非常復(fù)雜、非常麻煩的工作,但是它又是
一個(gè)非常關(guān)鍵的步驟。
數(shù)據(jù)清洗就是要把不干凈的數(shù)據(jù)清理得干干凈凈,從而使得原來的數(shù)據(jù)具
有完整性,唯一性,權(quán)威性,合法性和一致性。
在此,“臟”數(shù)據(jù)是指那些沒有實(shí)際意義、格式不合法且不符合規(guī)定范圍
的數(shù)據(jù)。null值通常表明數(shù)據(jù)是未知的,不適合使用,或者需要稍后才能加入。
數(shù)據(jù)集中的一個(gè)或幾個(gè)屬性的數(shù)值不完全,就是缺少一個(gè)值。通常的Null值是
空的,而缺少的值是NaN。
15
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
4.1數(shù)據(jù)清洗
首先通過importpandasaspd導(dǎo)入pandas庫,再通過pandas庫中的
read_excel功能導(dǎo)入數(shù)據(jù),最后將結(jié)果打印出來,如圖4-1所示。
圖4-1數(shù)據(jù)清洗分析頁面
根據(jù)圖4-1我們可以發(fā)現(xiàn),整個(gè)數(shù)據(jù)中,里程和售價(jià)分別有兩列數(shù)據(jù),所
以我們重新導(dǎo)入一下數(shù)據(jù),使用df1=pd.read_excel('D:\python代碼\人人車
\data.xlsx',encoding='utf-8-sig',usecols=[0,1,4,5]就可以獲取到想要數(shù)
據(jù),如圖4-2。
16
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
圖4-2數(shù)據(jù)清洗刪除列頁面
數(shù)據(jù)已經(jīng)導(dǎo)入進(jìn)去了,但是不知道里面是否含有空值或缺失值,所以對它
進(jìn)行一個(gè)檢查,使用isnull或者notnull函數(shù)進(jìn)行判斷,如圖4-3,可以發(fā)現(xiàn)
并沒有空值或者缺失值。
圖4-3數(shù)據(jù)清洗空值判斷頁面
17
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
4.2數(shù)據(jù)儲存
文本文件使用pd.to_csv保存、excel文件使用pd.to_excel保存,數(shù)據(jù)庫
保存使用pd.to_sql保存,這里因?yàn)閷?dǎo)入的是excel文件進(jìn)行清洗,所以保存
時(shí)使用excel進(jìn)行保存,文件名為‘人人車’字符編碼為utf-8-sig。但是如果
直接保存的話,日期會出現(xiàn)時(shí)間全部為零的情況,所以使用
pd.to_datetime(df1['日期']).dt.date把日期轉(zhuǎn)換為日期格式,再去掉時(shí)間進(jìn)
行保存,如圖4-4。
圖4-4數(shù)據(jù)存儲頁面
數(shù)據(jù)保存結(jié)果頁面如圖4-5。
圖4-5數(shù)據(jù)存儲結(jié)果頁面
讀取清洗后的源數(shù)據(jù)文件,并顯示,如圖4-6。
18
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
圖4-6源數(shù)據(jù)文件頁面
4.3編程實(shí)現(xiàn)
整體對數(shù)據(jù)進(jìn)行了清洗,導(dǎo)入具體的pandas庫,然后導(dǎo)入該excel文件,
對其中多余的數(shù)據(jù)進(jìn)行刪除,再對整體數(shù)據(jù)進(jìn)行判斷是否有空值或者缺失值,
如果有進(jìn)行刪除或者填充,處理完成后對數(shù)據(jù)進(jìn)行一個(gè)保存,之后新建一個(gè)新
的Python3文件,對保存的數(shù)據(jù)進(jìn)查看即可。具體編程代碼如下:
importpandasaspd#導(dǎo)入庫
df=pd.read_excel('D:\python代碼\人人車
\data.xlsx',encoding='utf-8-sig')#導(dǎo)入excel文件
df#打印查看是否正確
df1=pd.read_excel('D:\python代碼\人人車
\data.xlsx',encoding='utf-8-sig',usecols=[0,1,4,5])#刪除不需要的數(shù)據(jù)
df1
pd.isnull(df1)#查看數(shù)據(jù)中是否有空值和缺失值
df1['日期']=pd.to_datetime(df1['日期']).dt.date#變?yōu)槿掌诟袷讲⑷サ魰r(shí)
間
df1.to_excel('D:\\python代碼\\人人車\\000\\人人
車.xlsx',encoding='utf-8-sig')#數(shù)據(jù)清洗后進(jìn)行保存
importpandasaspd#導(dǎo)入pandas庫
df=pd.read_excel('D:\\python代碼\\人人車\\000\\人人
車.xlsx',encoding='utf-8-sig')#導(dǎo)入源數(shù)據(jù)文件
df.head(10)#打印輸出前十條數(shù)據(jù)
19
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
5數(shù)據(jù)統(tǒng)計(jì)與分析
5.1數(shù)據(jù)準(zhǔn)備
首先導(dǎo)入需要使用的庫,然后設(shè)置顯示中文字體,使用pandas導(dǎo)入數(shù)據(jù)并
查看前10條,如圖5-1、5-2。
圖5-1數(shù)據(jù)準(zhǔn)備頁面
圖5-2數(shù)據(jù)加載頁面
5.2數(shù)據(jù)分析與展示
因?yàn)閿?shù)據(jù)已經(jīng)清洗并準(zhǔn)備好了,所以打開PyCharmCommunityEdition軟件,
導(dǎo)入包并設(shè)置默認(rèn)字體和符號,然后使用read_excel導(dǎo)入數(shù)據(jù),取其中的日期、
里程、售價(jià)。因?yàn)槭前慈掌趯λ袛?shù)據(jù)中的里程和售價(jià)進(jìn)行統(tǒng)計(jì),所以只取日
期中的年份即可,使用to_datetime和dt.year函數(shù)就可以只保留日期,再使
用for循環(huán)對日期進(jìn)行去重和排序即可,如圖5-3。
20
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
圖5-3日期數(shù)據(jù)去重排序代碼
5.2.1依據(jù)年統(tǒng)計(jì)平均價(jià)格和平均里程
因?yàn)橐呀?jīng)將年份取好并去重了,將取好的年份對去重了年份進(jìn)行比較,相
同年份的里程和售價(jià)進(jìn)行累加并獲取到每年車輛的總數(shù),然后將每一年的總售
價(jià)和總里程分別除去每一年的車輛總數(shù)就可以得到每一年的平均售價(jià)和平均里
程。需要?jiǎng)?chuàng)建兩個(gè)列表進(jìn)行存儲每一年份的數(shù)據(jù),還需要一個(gè)列表用來存儲車
輛總數(shù),兩個(gè)列表用來分別存放每一年的平均售價(jià)和平均里程,這幾個(gè)列表長
度必須與年份列表長度相匹配,具體使用for循環(huán)嵌套和if比較語句即可,做
完以上所有以后,會發(fā)現(xiàn)我們獲取到的總售價(jià)、總里程和平均售價(jià)、平均里程
都是不精確的小數(shù),所以要使用for循環(huán)和round函數(shù)將數(shù)據(jù)一個(gè)個(gè)精確到小
數(shù)點(diǎn)兩位。具體代碼如下圖5-4。
21
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
圖5-4數(shù)據(jù)按年份統(tǒng)計(jì)平均數(shù)代碼頁面
使用def創(chuàng)建一個(gè)名為bar_tool的函數(shù),寫一個(gè)c=(),在c里面寫一個(gè)
Bar(init_opts=opt.InitOpts(theme=ThemeType.LIGHT))表示圖像為條形圖,
并且設(shè)置樣式,使用一個(gè).add_xaxis和兩個(gè).add_yaxis設(shè)置好兩個(gè)條形數(shù)據(jù),
再使用.set_global_opts設(shè)置整體圖形中的標(biāo)題、圖列、滾動條、動態(tài)數(shù)據(jù)、
視覺映射配置、區(qū)域縮放配置,x軸中的x軸分割線、x軸傾斜45°和y軸的分
割線等等。然后使用.set_series_opts設(shè)置圖形中顯示最大值和最小值,并設(shè)
置里程和售價(jià)平均值的一條虛線。具體代碼如下圖5-5。
22
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
圖5-5數(shù)據(jù)可視化代碼頁面
每年車輛的平均售價(jià)和平均里程可視化圖如圖5-6:
圖5-6數(shù)據(jù)可視化展示頁面
從圖5-6中可以得知每一年的平均售價(jià)和平均里程,其中2018年的平均售
價(jià)最高,而平均里程又最低,而我們反觀2012年的數(shù)據(jù),我們可以看到平均里
程相對很高,而平均售價(jià)又相對比較低,看到這里,可以看出車輛的里程越高,
車輛的售價(jià)相對的更低,但是從2013、2015和2019年看,這三年的車輛里程
和售價(jià)都比較平均,沒有其它幾年那樣取決于車輛的里程。具體運(yùn)行代碼如下:
23
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
frompyechartsimportoptionsasopt
frompyecharts.chartsimportBar
importpandasaspd
importmatplotlib.pyplotasplt
frompyecharts.globalsimportThemeType
plt.rcParams['font.sans-serif']=['SimHei']#指定默認(rèn)字體
plt.rcParams['axes.unicode_minus']=False#解決保存圖像是負(fù)號‘-’
顯示為方塊的問題
f=pd.read_excel('D:\\python代碼\\人人車\\data.xlsx',index_col=0)
score_name=f['日期']
mileage=f['里程(萬公里)']
price=f['售價(jià)(萬元)']
rq=pd.to_datetime(score_name)
year=rq.dt.year
year_qc=[]
foriinyear:
ifinotinyear_qc:
year_qc.append(i)
foriinrange(0,len(year_qc),1):
forjinrange(i+1,len(year_qc),1):
ifyear_qc[i]>year_qc[j]:
a=year_qc[i]
year_qc[i]=year_qc[j]
year_qc[j]=a
price_tol=list(range(0,len(year_qc),1))
mileage_tol=list(range(0,len(year_qc),1))
number=list(range(0,len(year_qc),1))
price_avg=list(range(0,len(year_qc),1))
mileage_avg=list(range(0,len(year_qc),1))
foriinrange(0,len(price_tol),1):
price_tol[i]=0
foriinrange(0,len(mileage_tol),1):
mileage_tol[i]=0
foriinrange(0,len(number),1):
number[i]=0
x=0
foriinyear_qc:
y=0
forjinyear:
ifj==i:
price_tol[x]=price_tol[x]+price[y]
24
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
mileage_tol[x]=mileage_tol[x]+mileage[y]
number[x]=number[x]+1
y=y+1
x=x+1
x=0
foriinprice_tol:
price_tol[x]=round(i,2)
x=x+1
y=0
foriinmileage_tol:
mileage_tol[y]=round(i,2)
y=y+1
foriinrange(0,len(price_avg),1):
price_avg[i]=price_tol[i]/number[i]
foriinrange(0,len(mileage_avg),1):
mileage_avg[i]=mileage_tol[i]/number[i]
x=0
foriinprice_avg:
price_avg[x]=round(i,2)
x=x+1
y=0
foriinmileage_avg:
mileage_avg[y]=round(i,2)
y=y+1
defbar_tool():
c=(
Bar(init_opts=opt.InitOpts(theme=ThemeType.LIGHT))
.add_xaxis(year_qc)
.add_yaxis('年平均銷售價(jià)格(萬元)',price_avg)
.add_yaxis('年平均里程(萬公里)',mileage_avg)
.set_global_opts(title_opts=opt.TitleOpts(title='每年車輛
的平均售價(jià)和平均里程'),
toolbox_opts=opt.ToolboxOpts(is_show=True,
feature=opt.ToolBoxFeatureOpts(
data_view=opt.ToolBoxFeatureDataViewOpts(is_show=True),
data_zoom=opt.ToolBoxFeatureDataZoomOpts(is_show=False)
)),
25
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
#
visualmap_opts=opt.VisualMapOpts(max_=6000),
datazoom_opts=opt.DataZoomOpts(is_show=True),
legend_opts=opt.LegendOpts(is_show=True),
tooltip_opts=opt.TooltipOpts(trigger_on='click'),
xaxis_opts=opt.AxisOpts(splitline_opts=opt.SplitLineOpts(is_show=Tru
e),
axispointer_opts=opt.AxisPointerOpts(is_show=True),
axislabel_opts={'rotate':45}),
yaxis_opts=opt.AxisOpts(splitline_opts=opt.SplitLineOpts(is_show=Tru
e),
axispointer_opts=opt.AxisPointerOpts(is_show=True))
)
.set_series_opts(markpoint_opts=opt.MarkPointOpts(data=[
opt.MarkPointItem(name='min',type_='min'),
opt.MarkPointItem(name='max',type_='max')]),
markline_opts=opt.MarkLineOpts(data=[opt.MarkLineItem(name='平均值',
type_='average')]))
)
returnc
bar_tool().render('bar.html')
5.2.2依據(jù)年份對車輛總數(shù)進(jìn)行統(tǒng)計(jì)
和上面的方法一樣,先給年份去重,然后使用
list(range(0,len(yera_qc),1))創(chuàng)建一個(gè)和年份長度一樣的列表,再用for循
環(huán)給它全部初始化為0,之后使用for循環(huán)遍歷所有年份數(shù)據(jù)和去重完的年份進(jìn)
行比較,年份相同就對其相對于的車輛總數(shù)列表進(jìn)行加一,這樣就能獲取到每
26
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
年車輛總數(shù),如圖5-7。
圖5-7每一年車輛總數(shù)統(tǒng)計(jì)代碼頁面
圖5-8數(shù)據(jù)展示頁面
從圖5-8條形圖中可以看出2015、2016、2019年對于對于二手車的銷售比
較多。從2015年以前可以看出,二手車的數(shù)量并不多,從2008到2015年之間
可以看出,二手車的銷售量達(dá)到了一個(gè)頂尖,再從2018到2022年可以看出又
慢慢的呈現(xiàn)下降的趨勢。具體運(yùn)行代碼如下:
frompyechartsimportoptionsasopt
frompyecharts.chartsimportBar
importpandasaspd
importmatplotlib.pyplotasplt
27
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
plt.rcParams['font.sans-serif']=['SimHei']#指定默認(rèn)字體
plt.rcParams['axes.unicode_minus']=False#解決保存圖像是負(fù)號‘-’
顯示為方塊的問題
f=pd.read_excel('D:\\python代碼\\人人車\\data.xlsx',index_col=0)
score_name=f['日期']
rq=pd.to_datetime(score_name)
year=rq.dt.year
year_qc=[]
foriinyear:
ifinotinyear_qc:
year_qc.append(i)
foriinrange(0,len(year_qc),1):
forjinrange(i+1,len(year_qc),1):
ifyear_qc[i]>year_qc[j]:
a=year_qc[i]
year_qc[i]=year_qc[j]
year_qc[j]=a
number_tal=list(range(0,len(year_qc),1))
foriinrange(0,len(number_tal),1):
number_tal[i]=0
x=0
foriinyear_qc:
forjinyear:
ifj==i:
number_tal[x]=number_tal[x]+1
x=x+1
print(year_qc)
print(number_tal)
defbar_tool()->Bar:
c=(
Bar()
.add_xaxis(year_qc)
.add_yaxis('車輛總數(shù)',number_tal)
.set_global_opts(title_opts=opt.TitleOpts(title="每一年的車輛
總數(shù)"),
toolbox_opts=opt.ToolboxOpts(),
legend_opts=opt.LegendOpts(is_show=True))
)
returnc
28
湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)
bar_tool().render("車輛銷量.html")
5.2.3依據(jù)車型對車輛進(jìn)行統(tǒng)計(jì)
首先和之前一樣導(dǎo)入excel文件,然后獲取文件中的車輛名稱列并存入到
列表中,再使用split對該表中的字符串進(jìn)行一個(gè)空格分割,并對分割后的第
一個(gè)字符進(jìn)行存入列表,然后在對其進(jìn)行去重,再將兩個(gè)列表進(jìn)行比較,對每
輛車型進(jìn)行一個(gè)統(tǒng)計(jì)。之后再使用data=[[iforiinrange(2)]foriin
range(33)]語句創(chuàng)建一個(gè)名為data的二維列表,并將車型和對應(yīng)的數(shù)量賦給這
個(gè)列表,然后使用WordCloud()將數(shù)據(jù)畫成一個(gè)詞云圖,如圖5-9。
圖5-9車型統(tǒng)計(jì)顯示圖
如圖5-9,可以看出在這些年中,二手車市場中銷量最好的車型是奧迪A4
和大眾-高爾夫,其余車輛整體都差不多,具體運(yùn)行代碼如下:
frompyechartsimportoptionsasopt
frompyecharts.chartsimportWordCloud
importpandasaspd
importmatplotlib.pyplotasplt
plt.rcParams['font.sans-serif']=['SimHei']
29
湖南商務(wù)職業(yè)技術(shù)
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度大數(shù)據(jù)分析技術(shù)授權(quán)合作框架合同
- 2025版貸款居間合同違約金計(jì)算范本集3篇
- 二零二五年度智慧城市出資與技術(shù)升級合作協(xié)議
- 二零二五年度實(shí)習(xí)生實(shí)習(xí)考核與評價(jià)協(xié)議
- 2024年版影視制作合同:影視制作公司與導(dǎo)演、演員之間的拍攝與報(bào)酬規(guī)定
- 2025年度農(nóng)村住宅抗震加固工程木工施工合同
- 2024年私家地下室買賣合同書3篇
- 2024年版夫妻雙方假離婚財(cái)產(chǎn)分割合同一
- 2024學(xué)校教師教學(xué)成果獎(jiǎng)勵(lì)與激勵(lì)機(jī)制合同2篇
- 2025年玻璃儀器及實(shí)驗(yàn)、醫(yī)療用玻璃器皿合作協(xié)議書
- 醫(yī)藥行業(yè)合規(guī)培訓(xùn)
- 2024年低壓電工資格考試必考題庫及答案(共400題)
- 中南大學(xué)《大學(xué)物理C(3)(一)》2022-2023學(xué)年第一學(xué)期期末試卷
- 【MOOC】公司金融-江西財(cái)經(jīng)大學(xué) 中國大學(xué)慕課MOOC答案
- 2024新人教版英語七年級上單詞默寫表(小學(xué)部分)
- 世界衛(wèi)生組織人類精液及精子-宮頸粘液相互作用實(shí)驗(yàn)室檢驗(yàn)手冊第五版
- 殯儀館鮮花采購?fù)稑?biāo)方案(技術(shù)方案)
- 招商會會議流程綱要
- 安全生產(chǎn)工作年終總結(jié)
- 2024-2025學(xué)年人教版七年級英語上冊各單元重點(diǎn)句子
- 消化道大出血應(yīng)急預(yù)案演練
評論
0/150
提交評論