基于Python的太平洋汽車網(wǎng)數(shù)據(jù)采集與分析_第1頁
基于Python的太平洋汽車網(wǎng)數(shù)據(jù)采集與分析_第2頁
基于Python的太平洋汽車網(wǎng)數(shù)據(jù)采集與分析_第3頁
基于Python的太平洋汽車網(wǎng)數(shù)據(jù)采集與分析_第4頁
基于Python的太平洋汽車網(wǎng)數(shù)據(jù)采集與分析_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(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簡介1

1.2.2Mapreduce簡介1

1.2.3Pyecharts簡介1

2需求分析2

2.1可行性需求分析2

2.2采集目標(biāo)功能分析2

2.3關(guān)鍵技術(shù)分析2

2.3.1網(wǎng)絡(luò)爬蟲技術(shù)2

2.3.2文件存取技術(shù)2

2.3.3可視化技術(shù)3

3數(shù)據(jù)采集3

3.1采集頁面分析3

3.2爬蟲策略分析4

3.3翻頁策略5

3.4解析各個(gè)字段6

3.5保存所有字段7

3.6運(yùn)行爬蟲程序7

4數(shù)據(jù)清洗與處理8

4.1數(shù)據(jù)清洗說明8

4.2數(shù)據(jù)清洗需求8

4.3解析name字段9

4.4處理mileage字段10

4.5處理licenseDate字段11

4.6新增省份字段11

I

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

4.7字段拼接11

4.8啟動(dòng)mapreduce程序12

5數(shù)據(jù)統(tǒng)計(jì)與分析13

5.1數(shù)據(jù)準(zhǔn)備13

5.2數(shù)據(jù)分析與展示13

5.2.1統(tǒng)計(jì)各省份二手車的數(shù)量和平均價(jià)格13

5.2.2統(tǒng)計(jì)每年二手汽車數(shù)量和平均價(jià)格16

5.2.3統(tǒng)計(jì)每個(gè)品牌汽車數(shù)量和平均價(jià)格17

5.2.4統(tǒng)計(jì)各個(gè)排量的數(shù)量和平均價(jià)格18

5.3綜述19

6設(shè)計(jì)小結(jié)20

參考資料21

II

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

基于Python的太平洋汽車網(wǎng)數(shù)據(jù)采集與分析

1引言

太平洋汽車網(wǎng)是中國最大的汽車垂直門戶網(wǎng)站之一,它提供了大量的二手

車信息。本文旨在使用Python編程語言,結(jié)合Requests、MapReduce、Pandas、

PyEcharts等工具,從太平洋汽車網(wǎng)爬取二手車數(shù)據(jù),對(duì)數(shù)據(jù)進(jìn)行清洗和分析,

并用可視化的方式展示分析結(jié)果。

1.1項(xiàng)目背景

隨著二手車市場的快速發(fā)展,越來越多的人選擇購買二手車。然而,在二

手車市場上,消費(fèi)者往往難以獲得準(zhǔn)確的信息,導(dǎo)致購買決策的困難。因此,

了解二手車市場的情況對(duì)消費(fèi)者來說是非常重要的。

1.2開發(fā)環(huán)境與工具

1.2.1Python簡介

Python是一種高級(jí)編程語言,具有簡潔、易讀的語法和強(qiáng)大的功能。它被

廣泛應(yīng)用于各種領(lǐng)域,如Web開發(fā)、數(shù)據(jù)分析、人工智能、科學(xué)計(jì)算等。Python

還有豐富的第三方庫和工具,方便用戶快速開發(fā)各種應(yīng)用。

1.2.2Mapreduce簡介

MapReduce是一種分布式計(jì)算模型,能夠高效地處理大規(guī)模數(shù)據(jù)集。它將數(shù)

據(jù)處理任務(wù)分解為兩個(gè)階段:Map和Reduce。Map將輸入數(shù)據(jù)轉(zhuǎn)換為鍵值對(duì),Reduc

e將具有相同鍵的數(shù)據(jù)合并在一起。它適用于大數(shù)據(jù)處理和分析。

1.2.3Pyecharts簡介

Pyecharts是一個(gè)基于Python的數(shù)據(jù)可視化庫,它的目標(biāo)是成為Python數(shù)

據(jù)可視化領(lǐng)域的工具之一。Pyecharts具有開箱即用、易于使用、高度定制和美

觀的圖表等特點(diǎn)。Pyecharts采用了Echarts的JavaScript庫作為其底層圖表

庫,這使得它可以生成高質(zhì)量的交互式圖表。

1

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

2需求分析

2.1可行性需求分析

根據(jù)目前互聯(lián)網(wǎng)的發(fā)展和二手汽車市場的需求,太平洋汽車網(wǎng)二手車數(shù)據(jù)

的采集與分析是具有可行性的。采用Python等工具,可以有效地從太平洋汽車

網(wǎng)上爬取并清洗數(shù)據(jù),并利用數(shù)據(jù)分析和可視化技術(shù)提取有用信息,為二手車

買賣、評(píng)估等提供有價(jià)值的參考。

2.2采集目標(biāo)功能分析

這些字段涵蓋了二手汽車信息的核心要素,可以提供用戶進(jìn)行基本的篩選

和比較。品牌名、型號(hào)、上市時(shí)間、排量、版本等信息可以讓用戶初步了解該

車型的基本情況,行駛里程數(shù)、上牌年份、上牌月份等信息則可以評(píng)估車輛的

使用狀況,城市id、城市名稱、省份等信息則可以幫助用戶快速定位車輛所在

地,價(jià)格則是用戶最關(guān)心的因素之一,詳情頁id和圖片url可以提供更加詳細(xì)

和直觀的信息。

2.3關(guān)鍵技術(shù)分析

2.3.1網(wǎng)絡(luò)爬蟲技術(shù)

requests和etree都是Python中非常常用的網(wǎng)絡(luò)爬蟲工具。requests是

用于發(fā)送HTTP請(qǐng)求的庫,而etree則是用于解析HTML和XML文檔的庫。在進(jìn)

行網(wǎng)絡(luò)爬蟲時(shí),首先需要使用requests庫發(fā)送HTTP請(qǐng)求,獲取網(wǎng)頁內(nèi)容。具

體來說,我們可以使用requests.get()方法向指定的URL發(fā)送請(qǐng)求,從而獲取

該網(wǎng)頁的內(nèi)容。該方法會(huì)返回一個(gè)Response對(duì)象,其中包含了請(qǐng)求的響應(yīng)內(nèi)容。

接著,我們可以使用etree庫來解析HTML或XML文檔,從而提取出我們需要的

信息。通常情況下,我們會(huì)使用etree.HTML()方法將HTML文檔轉(zhuǎn)換成Element

對(duì)象,然后使用XPath語法來定位所需的元素。

2.3.2文件存取技術(shù)

JSON(JavaScriptObjectNotation)是一種輕量級(jí)的數(shù)據(jù)交換格式,易于

閱讀和編寫,廣泛應(yīng)用于web服務(wù)和API中。在Python中,JSON通常用于將

Python對(duì)象轉(zhuǎn)換為字符串以進(jìn)行數(shù)據(jù)交換,或?qū)SON字符串解析為Python對(duì)

2

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

象。

Python內(nèi)置的json庫提供了從Python對(duì)象到JSON格式字符串的轉(zhuǎn)換方法

dumps(),以及從JSON格式字符串到Python對(duì)象的轉(zhuǎn)換方法loads()。在使用

json庫進(jìn)行文件存取時(shí),通常使用dump()方法將Python對(duì)象轉(zhuǎn)換為JSON格式

字符串,并寫入到文件中;使用load()方法從文件中讀取JSON格式字符串,并

解析為Python對(duì)象。

2.3.3可視化技術(shù)

Pyecharts是一個(gè)Python數(shù)據(jù)可視化庫,能夠快速生成各種類型的圖表,

包括但不限于折線圖、散點(diǎn)圖、餅圖、柱狀圖、地圖等。它的優(yōu)點(diǎn)包括簡單易

用、功能強(qiáng)大、美觀大方、支持多種數(shù)據(jù)格式以及高度可定制性。Pyecharts通

過提供一系列的類來實(shí)現(xiàn)各種圖表的生成。其中,主要的類包括:Chart類:所

有圖表類的基類,提供圖表的基本屬性、樣式、數(shù)據(jù)等配置。Line類:生成折

線圖。Scatter類:生成散點(diǎn)圖。Bar類:生成柱狀圖。Pie類:生成餅圖。Map

類:生成地圖。在使用Pyecharts時(shí),我們可以通過鏈?zhǔn)秸{(diào)用的方式進(jìn)行圖表

的生成和配置。

3數(shù)據(jù)采集

3.1采集頁面分析

打開太平洋汽車網(wǎng)站,點(diǎn)擊購買二手車頁面。為了保證能夠采集到全量的數(shù)

據(jù),所以在城市選擇欄中選擇全國選項(xiàng)。如下圖3-1所示:

圖3-1太平洋汽車二手車頁面

3

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

本次二手車數(shù)據(jù)采集的字段有:汽車基本信息、城市、行駛里程、上牌日期、

價(jià)格、圖片等。這些字段在頁面的html文檔中都有顯示,通過xpath方法就可

以獲取到。通過抓包工具分析接口發(fā)現(xiàn),頁面上的汽車信息是通過

/library/usedCar/getCarList接口返回的。如下圖3-2所示:

圖3-2接口分析

接口的response響應(yīng)內(nèi)容如下圖3-3所示:

圖3-3response響應(yīng)

Response對(duì)象的響應(yīng)內(nèi)容中汽車信息列表中pageResult中,后續(xù)可以將

response對(duì)象轉(zhuǎn)換成json對(duì)象,再通過鍵值對(duì)的方式將有效的字段提取出來。

3.2爬蟲策略分析

通過采集頁面分析已經(jīng)基本清晰了數(shù)據(jù)采集的策略,通過向?qū)?yīng)接口發(fā)起

post請(qǐng)求,傳入一些必要參數(shù),如下圖3-4所示,即可獲取到響應(yīng)。但是由于

數(shù)據(jù)的采集量比較大,在不做任何反爬措施的情況下程序很容易被攔截導(dǎo)致數(shù)

據(jù)采集中斷,所以在發(fā)起請(qǐng)求時(shí)要隨機(jī)的更換請(qǐng)求頭,達(dá)到偽裝程序的效果。

圖3-4請(qǐng)求參數(shù)

請(qǐng)求頭列表如下圖3-5所示,在后續(xù)翻頁請(qǐng)求中隨機(jī)中請(qǐng)求頭列表中選擇。

4

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

self.USER_AGENTS=[

"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,

likeGecko)Chrome/58.0.3029.110Safari/537.36Edge/16.16299",

"Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,like

Gecko)Chrome/50.0.2661.102Safari/537.36",

"Mozilla/5.0(WindowsNT6.1;WOW64;rv:54.0)Gecko/20100101

Firefox/54.0",

"Mozilla/5.0(Macintosh;IntelMacOSX10_12_6)AppleWebKit/537.36

(KHTML,likeGecko)Chrome/61.0.3163.100Safari/537.36",

"Mozilla/5.0(Macintosh;IntelMacOSX10_12_6)AppleWebKit/604.1.38

(KHTML,likeGecko)Version/11.0Safari/604.1.38",

"Mozilla/5.0(X11;Ubuntu;Linuxx86_64;rv:55.0)Gecko/20100101

Firefox/55.0",

"Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,like

Gecko)Chrome/61.0.3163.79Safari/537.36",

"Mozilla/5.0(WindowsNT10.0;WOW64;Trident/7.0;rv:11.0)likeGecko",

"Mozilla/5.0(WindowsNT6.1;WOW64;rv:61.0)Gecko/20100101Firefox/61.0"

]

3.3翻頁策略

在前面的小結(jié)已經(jīng)找到獲取數(shù)據(jù)的關(guān)鍵接口,通過不斷更換接口的請(qǐng)求參數(shù)

即可實(shí)現(xiàn)翻頁的效果。代碼如下所示:

defturn_page(self,page_num:int):

try:

tip="正在采集第{page_num}頁".format(page_num=page_num)

print(tip)

self.data.update(pageNo=page_num)

headers={

'sec-ch-ua-platform':"Windows",

'sec-fetch-dest':'empty',

'sec-fetch-mode':'cors',

'sec-fetch-site':'same-site',

5

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

'user-agent':random.choice(self.USER_AGENTS)}

response=requests.post(self.url,json.dumps(self.data),headers=headers)

print(response)

self.parse_data(response)

page_num+=1

self.turn_page(page_num)

except:

print("出錯(cuò)!")

該方法首先嘗試打印一個(gè)字符串,表示正在采集第幾頁,然后更新請(qǐng)求參數(shù)

中的頁面編號(hào),設(shè)置請(qǐng)求頭部,并發(fā)送一個(gè)POST請(qǐng)求。接著,它調(diào)用parse_data

方法解析響應(yīng)數(shù)據(jù),并將頁面編號(hào)加一。最后,該函數(shù)遞歸調(diào)用自身,以處理

下一頁的數(shù)據(jù)。如果任何異常發(fā)生,函數(shù)將打印出錯(cuò)信息。

3.4解析各個(gè)字段

將獲取到response對(duì)象使用json的loads方法轉(zhuǎn)換成字典類型,在逐一

獲取其中的字段。代碼如下所示:

defparse_data(self,response):

dict_obj=json.loads(response.text)

page_result_list=dict_obj['data']['pageResult']

car_info={}

foriteminpage_result_list:

car_info['id']=item['id']

car_info['name']=item['name']

car_info['mileage']=item['mileage']

car_info['licenseDate']=item['licenseDate']

car_info['cityId']=item['cityId']

car_info['cityName']=item['cityName']

car_info['phone']=item['phone']

car_info['serialGroupId']=item['serialGroupId']

car_info['price']=item['price']

car_info['platform']=item['infoId']

car_info['image']=item['image']['image']

self.saveData(car_info)

該函數(shù)首先將響應(yīng)文本轉(zhuǎn)換為一個(gè)Python字典對(duì)象,然后提取出其中的

6

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

pageResult字段,該字段包含了當(dāng)前頁面的車輛信息。接著,對(duì)于每一輛車,

該函數(shù)將其各個(gè)屬性提取出來,存儲(chǔ)到一個(gè)字典對(duì)象car_info中,并打印出該

字典對(duì)象。最后,函數(shù)調(diào)用saveData方法,將這些數(shù)據(jù)保存到本地磁盤。

3.5保存所有字段

創(chuàng)建saveData函數(shù)對(duì)數(shù)據(jù)進(jìn)行落盤處理。代碼如下所示:

defsaveData(self,result):

json_str=json.dumps(result,ensure_ascii=False)

withopen("pcauto.json","a",encoding="utf-8")asf:

f.write(json_str+"\n")

該函數(shù)接受一個(gè)字典對(duì)象作為參數(shù),并將其轉(zhuǎn)換為JSON字符串,然后將其

寫入到一個(gè)名為pcauto.json的文件中。如果該文件不存在,則會(huì)創(chuàng)建一個(gè)新

文件;如果文件已經(jīng)存在,則會(huì)將新數(shù)據(jù)追加到文件的末尾。

json.dumps方法將Python對(duì)象轉(zhuǎn)換為JSON格式的字符串,

ensure_ascii=False參數(shù)表示允許寫入非ASCII字符,否則默認(rèn)會(huì)將其轉(zhuǎn)換為

Unicode轉(zhuǎn)義序列。

withopen(...)語句用于打開文件并創(chuàng)建一個(gè)上下文管理器,以確保文件被

正確關(guān)閉。文件寫入操作在該上下文中執(zhí)行,最后關(guān)閉文件。在每個(gè)JSON字符

串后面添加了一個(gè)換行符,以便每個(gè)記錄都可以單獨(dú)占一行。

3.6運(yùn)行爬蟲程序

編寫main方法,創(chuàng)建爬蟲對(duì)象,調(diào)用其中的start方法啟動(dòng)爬蟲。代碼如

下所示:

defstart(self):

self.turn_page(1)

if__name__=='__main__':

spider=Spider()

spider.start()

程序運(yùn)行日志如下圖3-5所示:

圖3-5爬蟲運(yùn)行日志

7

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

4數(shù)據(jù)清洗與處理

4.1數(shù)據(jù)清洗說明

數(shù)據(jù)采集完畢后還需要對(duì)數(shù)據(jù)進(jìn)行預(yù)處理。MapReduce是一種分布式計(jì)算模

型,可用于大規(guī)模數(shù)據(jù)的處理和分析。在數(shù)據(jù)清洗方面,MapReduce通常用于對(duì)

數(shù)據(jù)進(jìn)行初步處理,例如數(shù)據(jù)預(yù)處理、數(shù)據(jù)去重、數(shù)據(jù)格式化等操作。

MapReduce可以執(zhí)行如下操作:

數(shù)據(jù)去重:使用MapReduce計(jì)算每個(gè)記錄的哈希值,并使用Reduce函數(shù)刪

除重復(fù)記錄。

數(shù)據(jù)格式化:使用MapReduce將所有記錄轉(zhuǎn)換為標(biāo)準(zhǔn)格式,例如將日期格

式化為特定的格式,將地址轉(zhuǎn)換為標(biāo)準(zhǔn)格式等。

數(shù)據(jù)聚合:使用MapReduce計(jì)算數(shù)據(jù)的統(tǒng)計(jì)信息,例如平均值、中位數(shù)、

標(biāo)準(zhǔn)差等。

數(shù)據(jù)清洗:使用MapReduce清除無效數(shù)據(jù)、錯(cuò)誤數(shù)據(jù)和異常值。

數(shù)據(jù)過濾:使用MapReduce篩選出需要的數(shù)據(jù),例如只保留特定類型的數(shù)

據(jù)或滿足特定條件的數(shù)據(jù)。

數(shù)據(jù)轉(zhuǎn)換:使用MapReduce將數(shù)據(jù)轉(zhuǎn)換為另一種格式或結(jié)構(gòu),例如將關(guān)系

型數(shù)據(jù)轉(zhuǎn)換為文檔型數(shù)據(jù)或圖形數(shù)據(jù)。

原始數(shù)據(jù)格式如下所示:

圖4-1原始數(shù)據(jù)格式

4.2數(shù)據(jù)清洗需求

從name字段中提取出汽車品牌、版本、排放標(biāo)準(zhǔn)等字段;

將mileage字段的行駛里程單位從"萬公里"改成"公里";

將licenseDate上牌日期字段切分成"年"和"月"兩個(gè)字段;

8

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

根據(jù)城市名稱到省份編碼表中查找對(duì)應(yīng)的省份;

將所有字段用逗號(hào)進(jìn)行拼接,并存儲(chǔ)到clean.txt文件中。

4.3解析name字段

創(chuàng)建cleanName方法,從一個(gè)字符串中提取與汽車相關(guān)的幾個(gè)字段,例如品

牌、型號(hào)、年份、排量和汽車類型。該方法使用空格字符作為分隔符來拆分輸

入字符串name,然后通過對(duì)數(shù)組中的字段進(jìn)行迭代,使用一組if語句來提取相

關(guān)字段。第一個(gè)字段被認(rèn)為是品牌,第二個(gè)字段被認(rèn)為是型號(hào),而任何后續(xù)字

段都將被檢查以查看它們是否是數(shù)字,以提取汽車的年份。如果一個(gè)字段包含

字母'L',則它被認(rèn)為是引擎排量。最后一個(gè)字段被認(rèn)為是類型。提取的字段以

逗號(hào)分隔的格式化字符串返回。

privateStringcleanName(Stringname){

Stringbrand="";

Stringmodel="";

Stringyear="";

Stringdisplacement="";

Stringmotorcycle="";

String[]fields=name.split("");

for(inti=0;i<fields.length;i++){

if(i==0){

brand=fields[0];

}elseif(i==1){

model=fields[1];

}else{

if(isNumeric(fields[i])){

year=fields[i];

}elseif(fields[i].contains("L")){

displacement=fields[i];

}else{

motorcycle=fields[fields.length-1];

}

}

9

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

}

returnString.format("%s,%s,%s,%s,%s",brand,model,year,displacement,motorcycle);

}

圖4-2name字段解析

總的來說,該方法提供了一種簡單的方法,可以從表示汽車名稱的字符串中

提取一些基本信息。然而,它可能無法適應(yīng)輸入字符串格式的變化,并且可能

無法提取更詳細(xì)的信息,如汽車的級(jí)別或變速器類型。

4.4處理mileage字段

創(chuàng)建cleanMileage方法,它將包含"萬公里"單位的字符串里程轉(zhuǎn)換為公里,

并返回一個(gè)新的字符串表示。如果輸入字符串不包含"萬公里",則直接返回原

始字符串。該方法首先檢查輸入字符串是否包含"萬公里",如果包含,它將使

用字符串替換方法將"萬公里"替換為空字符串。然后,它將替換后的字符串轉(zhuǎn)

換為浮點(diǎn)數(shù)并將其乘以1000,以將單位從"萬公里"轉(zhuǎn)換為公里。最后,它將轉(zhuǎn)

換后的里程數(shù)作為字符串返回,并附加上"公里"作為單位。如果輸入字符串不

包含"萬公里",則該方法直接返回原始字符串,不做任何處理。

privateStringcleanMileage(Stringmileage){

if(mileage.contains("萬公里")){

Stringreplace=mileage.replace("萬公里","");

floatnum=Float.parseFloat(replace)*1000;

returnnum+"公里";

}else{

returnmileage;

}

}

總體而言,該方法提供了一種將里程數(shù)從"萬公里"轉(zhuǎn)換為公里的簡單方法,

可以在處理中文數(shù)據(jù)時(shí)使用。

10

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

4.5處理licenseDate字段

創(chuàng)建cleanLicenseDate方法,它將包含日期的字符串格式化為一個(gè)逗號(hào)分

隔的年份和月份字符串,并返回這個(gè)新的字符串。該方法使用字符串分割方法

將輸入字符串按照"-"分割成一個(gè)數(shù)組,然后將分割后的數(shù)組的第一個(gè)元素(即

年份)和第二個(gè)元素(即月份)連接成一個(gè)逗號(hào)分隔的字符串,并返回這個(gè)新

的字符串。

privateStringcleanLicenseDate(StringlicenseDate){

String[]split=licenseDate.split("-");

returnsplit[0]+","+split[1];

}

總體而言,該方法提供了一種將日期字符串格式化為年份和月份的簡單方法,

可以在處理需要這些信息的情況下使用。但是,該方法假設(shè)輸入字符串的格式

是正確的,并且將不進(jìn)行任何驗(yàn)證。在實(shí)際使用中,必須注意確保輸入數(shù)據(jù)的

準(zhǔn)確性和正確性。

4.6新增省份字段

在setup方法中實(shí)現(xiàn)。該方法的目的是讀取一個(gè)包含省份信息的文件。代碼

中,首先指定了文件的路徑,然后創(chuàng)建了一個(gè)HashMap。接著,使用帶緩沖的流

讀取文件的內(nèi)容,并將每行按逗號(hào)分割成一個(gè)字符串?dāng)?shù)組。然后,判斷字符串

數(shù)組中第四個(gè)元素(表示城市)是否包含"市"字,如果包含則將"市"字或"地區(qū)

"字刪除,然后將省份編碼和城市名稱拼接成一個(gè)字符串作為HashMap的鍵,將

這個(gè)鍵值對(duì)存儲(chǔ)到HashMap中。

編寫getProvinceAndCode方法,用于獲取給定城市名稱所對(duì)應(yīng)的省份名稱

和省份編碼,返回格式為"城市名稱,省份名稱"。方法首先從之前讀取的HashMap

中獲取給定城市名稱對(duì)應(yīng)的省份編碼,如果未找到則返回格式為","的字符串。

如果找到了對(duì)應(yīng)的省份編碼,則將該編碼按"|"分割成省份編碼和省份名稱兩個(gè)

部分,提取出省份名稱并與給定城市名稱拼接成返回字符串。需要注意的是,

方法中對(duì)"|"字符進(jìn)行了轉(zhuǎn)義,使用了"\|"。

4.7字段拼接

創(chuàng)建connect方法,它將多個(gè)字符串連接成一個(gè)逗號(hào)分隔的單個(gè)字符串,并

11

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

返回該字符串。該方法使用了可變參數(shù)的語法,可以接受任意數(shù)量的字符串參

數(shù)。

該方法使用一個(gè)StringBuilder對(duì)象來創(chuàng)建一個(gè)新的字符串。對(duì)于傳遞給方

法的每個(gè)字符串參數(shù),它將其附加到StringBuilder對(duì)象的末尾,并添加一個(gè)

逗號(hào)作為分隔符。最后,該方法使用substring方法從StringBuilder對(duì)象中

截取掉最后一個(gè)逗號(hào),并將剩余的字符串作為結(jié)果返回。

privateStringconnect(String...fields){

StringBuilderstringBuffer=newStringBuilder();

for(Stringfield:fields){stringBuffer.append(field).append(",");}

returnstringBuffer.substring(0,stringBuffer.length()-1);}

總體而言,該方法提供了一種將多個(gè)字符串連接成一個(gè)逗號(hào)分隔的單個(gè)字符

串的簡單方法。在處理需要將多個(gè)字符串組合成一個(gè)字符串的情況下,該方法

是非常有用的。

4.8啟動(dòng)mapreduce程序

編寫main方法,該程序?qū)崿F(xiàn)了將一個(gè)JSON格式的文件作為輸入,清洗并輸

出為另一個(gè)文件的功能。它使用了Hadoop框架來實(shí)現(xiàn)分布式處理。

在程序開始時(shí),它將命令行參數(shù)設(shè)置為輸入文件路徑和輸出文件路徑。然后,

它創(chuàng)建一個(gè)HadoopJob對(duì)象,設(shè)置了它的Mapper類為Dataclean,并指定了Map

任務(wù)的輸出鍵和值的類型。接下來,它設(shè)置了輸出鍵和值的類型,并指定了輸

入和輸出路徑。最后,它啟動(dòng)了Job并等待完成。

總體而言,該程序提供了一種使用Hadoop框架來處理大規(guī)模數(shù)據(jù)集的方法。

它通過將任務(wù)分發(fā)到多個(gè)計(jì)算節(jié)點(diǎn)并使用并行計(jì)算來加速數(shù)據(jù)處理過程。在處

理大量數(shù)據(jù)時(shí),這種方法可以提高效率并減少處理時(shí)間。

圖4-3數(shù)據(jù)清洗結(jié)果

12

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

5數(shù)據(jù)統(tǒng)計(jì)與分析

5.1數(shù)據(jù)準(zhǔn)備

Pandas是一種Python數(shù)據(jù)分析庫,它可以幫助我們對(duì)大量數(shù)據(jù)進(jìn)行清洗、

轉(zhuǎn)換和分析。我們可以使用Pandas來讀取MapReduce數(shù)據(jù)清洗的結(jié)果,從而方

便地進(jìn)行后續(xù)的數(shù)據(jù)分析和可視化。

讀取MapReduce數(shù)據(jù)清洗的結(jié)果通常需要將輸出文件轉(zhuǎn)換為Pandas可以識(shí)

別的格式,例如CSV格式。一旦轉(zhuǎn)換完成,我們可以使用Pandas中的read_csv

函數(shù)讀取文件并將其轉(zhuǎn)換為DataFrame對(duì)象。DataFrame對(duì)象是Pandas中最常

用的數(shù)據(jù)結(jié)構(gòu),它類似于電子表格,并提供了豐富的數(shù)據(jù)操作和分析功能。

數(shù)據(jù)格式如下圖5-1所示:

圖5-1數(shù)據(jù)格式

字段依次為:品牌名、型號(hào)、上市時(shí)間、排量、版本、行駛里程數(shù)、上牌

年份、上牌月份、城市id、城市名稱、價(jià)格、詳情頁id、圖片url。

5.2數(shù)據(jù)分析與展示

5.2.1統(tǒng)計(jì)各省份二手車的數(shù)量和平均價(jià)格

讀取“clean.txt”文件,使用逗號(hào)作為分隔符,將其轉(zhuǎn)化為DataFrame。

然后,它對(duì)每個(gè)省份的二手車數(shù)量和平均價(jià)格進(jìn)行了統(tǒng)計(jì),并將結(jié)果存儲(chǔ)在名

為“province_data”的DataFrame中。接下來,使用pyecharts繪制地圖,其

中包括兩個(gè)序列(“二手車數(shù)量”和“二手車平均價(jià)格”),每個(gè)序列對(duì)應(yīng)一

個(gè)地圖數(shù)據(jù)。最后,使用set_global_opts()設(shè)置地圖的全局選項(xiàng),使用

set_series_opts()設(shè)置序列的選項(xiàng),并使用render()生成名為“二手車數(shù)量和

平均價(jià)格地圖.html”的html文件,其中包括生成的地圖。

13

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

importpandasaspd

frompyechartsimportoptionsasopts

frompyecharts.chartsimportMap

#讀取clean.txt文件,分隔符為逗號(hào)

df=pd.read_csv('clean.txt',sep=',',header=None,names=['brand',

'model','launch_time','displacement','version','mileage','year',

'month','city_id','city_name','province','price','detail_id',

'pic_url'])

#統(tǒng)計(jì)每個(gè)省份的二手車數(shù)量和平均價(jià)格

province_count=

df.groupby(['province'])['price'].count().reset_index(name='count')

province_avg_price=

df.groupby(['province'])['price'].mean().reset_index(name='avg_price

')

province_data=pd.merge(province_count,province_avg_price,

on='province')

province_data['count']=province_data['count'].map(lambdax:str(x))

province_data['avg_price']=province_data['count'].map(lambda

x:round(float(x),2))

#使用pyecharts繪制地圖

map_data1=[(province_data['province'][i],province_data['count'][i])

foriinrange(len(province_data))]

map_data2=[(province_data['province'][i],

province_data['avg_price'][i])foriinrange(len(province_data))]

c=Map()

c.add("二手車數(shù)量",map_data1,"china")

c.add("二手車平均價(jià)格",map_data2,"china")

c.set_global_opts(

title_opts=opts.TitleOpts(title="二手車數(shù)量和平均價(jià)格地圖"),

visualmap_opts=opts.VisualMapOpts(max_=max(province_data['count']),

is_piecewise=False,

14

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

pieces=[{"max":1000,"min":

501,"label":">500","color":"#993300"},

{"max":500,"min":101,

"label":"100-500","color":"#CC6600"},

{"max":100,"min":1,

"label":"1-100","color":"#FFCC66"}]),

toolbox_opts=opts.ToolboxOpts(is_show=False,orient="vertical",

pos_left="right")

)

c.set_series_opts(

label_opts=opts.LabelOpts(is_show=False),

tooltip_opts=opts.TooltipOpts(formatter=':{c}<br>平均價(jià)格:

{@avg_price:.0f}元'))

c.render("二手車數(shù)量和平均價(jià)格地圖.html")

圖5-2二手車數(shù)量和平均價(jià)格地圖

上圖是二手車數(shù)量和平均價(jià)格的地圖,顏色越深代表數(shù)量或者價(jià)格越高,點(diǎn)

擊圖例可以切換數(shù)量和平均價(jià)格的顯示。山東省的二手車交易量最大,達(dá)到1011

輛,其次是浙江省和廣東省,分別為999輛和927輛。其他省份的交易量相對(duì)

較小,最小的是西藏自治區(qū),只有2輛。從數(shù)量的分布情況來看,二手車交易

量前10的省份中,有3個(gè)位于東部沿海地區(qū),還有1個(gè)位于華中地區(qū),其余6

15

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

個(gè)位于華北和華南地區(qū)。

5.2.2統(tǒng)計(jì)每年二手汽車上架數(shù)量和平均價(jià)格

在Python中使用pandas和pyecharts庫讀取并處理數(shù)據(jù),然后繪制了每年

二手車汽車數(shù)量和平均價(jià)格的折線圖,并將圖表保存為一個(gè)HTML文件。

具體地,這段代碼首先使用pandas的read_csv函數(shù)讀取了名為'clean.txt'

的文件,文件的分隔符為逗號(hào),且沒有列名。讀取的數(shù)據(jù)被存儲(chǔ)在名為'df'的

DataFrame對(duì)象中,這個(gè)對(duì)象包含了二手車的各種屬性信息。

然后,代碼將'df'中的'year'列轉(zhuǎn)換為字符串類型,并使用pandas的groupby

函數(shù)對(duì)每年的二手車數(shù)量和平均價(jià)格進(jìn)行了統(tǒng)計(jì),將結(jié)果存儲(chǔ)在名為

'year_data'的DataFrame對(duì)象中。

最后,代碼使用pyecharts的Line類創(chuàng)建了一個(gè)折線圖,并分別添加了"汽

車數(shù)量"和"平均價(jià)格"兩條線,然后設(shè)置了圖表的標(biāo)題和y軸的標(biāo)簽,并將圖表

保存為一個(gè)HTML文件。詳細(xì)的代碼與上一小結(jié)類似,這里就不再詳細(xì)說明。

程序運(yùn)行結(jié)果如下圖所示:

圖5-3每年二手汽車數(shù)量和平均價(jià)格

在1996年到2004年,二手車的數(shù)量非常少,價(jià)格也較低。從2005年到2017

年,二手車數(shù)量開始穩(wěn)步增加,價(jià)格也隨之上漲。在2018年到2020年,二手

車數(shù)量有所增加,但價(jià)格增長速度開始放緩。而2021年二手車數(shù)量大幅增加,

但平均價(jià)格反而下降了,這可能是因?yàn)槭袌錾隙周嚨钠焚|(zhì)和類型多樣化導(dǎo)致

的。到2022年和2023年,二手車的數(shù)量呈現(xiàn)指數(shù)級(jí)增長,但平均價(jià)格仍然相

16

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

對(duì)較低,這可能是由于新車市場競爭的激烈和汽車產(chǎn)業(yè)鏈的發(fā)展導(dǎo)致的。總的

來說,隨著時(shí)間的推移,人們對(duì)于二手車的需求和接受程度不斷提高,二手車

市場也在逐步發(fā)展壯大。

5.2.3統(tǒng)計(jì)每個(gè)品牌汽車數(shù)量和平均價(jià)格

使用pandas的read_csv()函數(shù)讀取clean.txt文件,將其轉(zhuǎn)換成DataFrame

數(shù)據(jù)結(jié)構(gòu),命名為df。對(duì)df進(jìn)行分組,使用groupby()函數(shù)以brand字段進(jìn)行

分組,然后使用count()和mean()函數(shù)統(tǒng)計(jì)數(shù)量和平均價(jià)格,分別命名為

brand_count和brand_avg_price。使用merge()函數(shù)將brand_count和

brand_avg_price進(jìn)行合并,以brand字段作為合并的關(guān)鍵字,命名為

brand_data。對(duì)brand_data按照數(shù)量降序排列,使用sort_values()函數(shù),取

前十個(gè)品牌,使用head()函數(shù),命名為brand_data。

使用pyecharts中的Pie()函數(shù)創(chuàng)建一個(gè)餅圖對(duì)象,命名為c。使用add()

函數(shù)添加數(shù)據(jù),將brand_data中的品牌名和數(shù)量轉(zhuǎn)化為列表,然后使用zip()

函數(shù)打包成一個(gè)元組的列表,并使用list()函數(shù)將其轉(zhuǎn)化為列表類型,最后作

為參數(shù)傳遞給add()函數(shù)。注意,傳入的數(shù)據(jù)需要使用列表嵌套列表的形式,即

[[品牌名1,數(shù)量1],[品牌名2,數(shù)量2],...]。使用set_series_opts()函數(shù)

設(shè)置數(shù)據(jù)標(biāo)簽的格式,其中formatter=":{c}"表示顯示品牌名和數(shù)量。使

用render()函數(shù)將餅圖保存為一個(gè)html文件。

運(yùn)行結(jié)果如下所示:

圖5-4統(tǒng)計(jì)每個(gè)品牌汽車數(shù)量和平均價(jià)格

17

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

可以發(fā)現(xiàn)在這份數(shù)據(jù)集中銷量最高的五個(gè)品牌分別是豐田、大眾、比亞迪、

奔馳和別克。其中豐田和大眾的銷量非常接近,分別為654和652,其次是比亞

迪,銷量為424。奔馳雖然數(shù)量相對(duì)較少,但是平均價(jià)格最高,為47.41。跟在

奔馳后面的是路虎和寶馬,平均價(jià)格分別為49.93和25.60。在這五個(gè)品牌中,

五菱汽車的平均價(jià)格最低,只有3.13,而且銷量也相對(duì)較高,為274。本田和

日產(chǎn)在銷量和平均價(jià)格方面都處于中等水平,分別為268和222,平均價(jià)格分別

為10.75和12.77。

總體來說,這份數(shù)據(jù)集的銷售數(shù)據(jù)比較均衡,沒有出現(xiàn)明顯的“巨頭”品牌。

在這些品牌中,奔馳和路虎是高端品牌,而五菱汽車則是低端品牌。對(duì)于消費(fèi)

者來說,這份數(shù)據(jù)集可以提供他們購買二手車時(shí)的一些參考信息。

5.2.4統(tǒng)計(jì)各個(gè)排量的數(shù)量和平均價(jià)格

使用pandas庫中的read_csv函數(shù)讀取指定路徑下的數(shù)據(jù)集文件

clean.txt,將其轉(zhuǎn)換為DataFrame格式,并指定文件的分隔符為逗號(hào),同時(shí)指

定DataFrame中各列的名稱。

使用groupby函數(shù)將DataFrame中的數(shù)據(jù)按照排量(displacement)進(jìn)行

分組,并使用count和mean函數(shù)對(duì)每組數(shù)據(jù)進(jìn)行計(jì)數(shù)和求平均值,得到每種

排量的汽車數(shù)量和平均價(jià)格,最后將兩個(gè)結(jié)果合并為一個(gè)DataFrame。

使用Pyecharts庫中的Bar函數(shù)創(chuàng)建一個(gè)柱狀圖對(duì)象,并通過add_xaxis

和add_yaxis函數(shù)設(shè)置柱狀圖的橫坐標(biāo)和縱坐標(biāo)的數(shù)據(jù)源,同時(shí)可以通過

label_opts參數(shù)來設(shè)置標(biāo)簽的位置和顯示方式。

使用set_global_opts函數(shù)來設(shè)置圖表的標(biāo)題、坐標(biāo)軸名稱和刻度等屬性,

并通過render函數(shù)將生成的柱狀圖保存為HTML文件。

總的來說,這段代碼主要是針對(duì)給定數(shù)據(jù)集中汽車排量和價(jià)格的統(tǒng)計(jì)和可視

化,通過Pyecharts可視化庫的支持,生成了一張柱狀圖,方便用戶直觀了解

汽車排量和價(jià)格的分布情況。

程序運(yùn)行結(jié)果如下所示:

18

湖南商務(wù)職業(yè)技術(shù)學(xué)院畢業(yè)設(shè)計(jì)

圖5-5統(tǒng)計(jì)各個(gè)排量的汽車數(shù)量和平均價(jià)格

汽車排量在1.5L以下的車型數(shù)量最多,占比超過50%,平均價(jià)格在3.7萬

左右。而

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論