版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 高一化學(xué)本章測評(píng):專題有機(jī)化合物的獲得與應(yīng)用
- 2024.0927推文-Elisa文獻(xiàn)解讀
- 餐飲場所使用瓶裝液化氣燃?xì)獾陌踩珯z查事項(xiàng)
- 2024高中地理第五章交通運(yùn)輸布局及其影響第二節(jié)交通運(yùn)輸方式和布局變化的影響課時(shí)演練含解析新人教版必修2
- 2024高中生物專題3胚胎工程3胚胎工程的應(yīng)用及前景達(dá)標(biāo)訓(xùn)練含解析新人教版選修3
- 2024高中語文第三單元因聲求氣吟詠詩韻閣夜訓(xùn)練含解析新人教版選修中國古代詩歌散文欣賞
- 2024高考地理一輪復(fù)習(xí)第十章區(qū)域可持續(xù)發(fā)展第32講濕地資源的開發(fā)與保護(hù)-以洞庭湖區(qū)為例教案湘教版
- 護(hù)士長2023年工作總結(jié)和2024年工作計(jì)劃課件
- 應(yīng)急保障措施
- 四年級(jí)語文上冊(cè)第七單元第22課為中華之崛起而讀書習(xí)題課件2新人教版
- 農(nóng)業(yè)昆蟲學(xué)實(shí)驗(yàn)5蔬菜害蟲課件
- 大學(xué)研究生赴境內(nèi)外高校學(xué)習(xí)課程學(xué)分認(rèn)定管理辦法
- 非標(biāo)設(shè)計(jì)最強(qiáng)自動(dòng)計(jì)算-壓入力計(jì)算
- 銀行客戶經(jīng)理個(gè)人履職總結(jié)銀行客戶經(jīng)理個(gè)人工作總結(jié)
- 人教版七年級(jí)數(shù)學(xué)下冊(cè)計(jì)算類專項(xiàng)訓(xùn)練卷【含答案】
- 化學(xué)元素周期表口訣化學(xué)元素周期表口訣
- 詩詞接龍(飛花令)PPT
- 子宮內(nèi)膜癌(課堂PPT)
- 澳大利亞公司法1-30
- 海上試油測試技術(shù)0327
- 中國地圖標(biāo)準(zhǔn)版(可編輯顏色)
評(píng)論
0/150
提交評(píng)論