python數(shù)據(jù)分析之公交IC卡刷卡分析
一、背景
交通大數(shù)據(jù)是由交通運(yùn)行管理直接產(chǎn)生的數(shù)據(jù)(包括各類道路交通、公共交通、對(duì)外交通的刷卡、線圈、卡口、GPS、視頻、圖片等數(shù)據(jù))、交通相關(guān)行業(yè)和領(lǐng)域?qū)氲臄?shù)據(jù)(氣象、環(huán)境、人口、規(guī)劃、移動(dòng)通信手機(jī)信令等數(shù)據(jù)),以及來(lái)自公眾互動(dòng)提供的交通狀況數(shù)據(jù)(通過(guò)微博、微信、論壇、廣播電臺(tái)等提供的文字、圖片、音視頻等數(shù)據(jù))構(gòu)成的。
現(xiàn)在給出了一個(gè)公交刷卡樣例數(shù)據(jù)集,包含有交易類型、交易時(shí)間、交易卡號(hào)、刷卡類型、線路號(hào)、車輛編號(hào)、上車站點(diǎn)、下車站點(diǎn)、駕駛員編號(hào)、運(yùn)營(yíng)公司編號(hào)等。試導(dǎo)入該數(shù)據(jù)集并做分析。
二、任務(wù)要求
1.分別計(jì)算早上7點(diǎn)前和晚上10點(diǎn)之后的公共交通上車刷卡量;
2.繪制并輸出當(dāng)天各小時(shí)公交刷卡量變化的折線圖;
3.構(gòu)造一個(gè)乘客搭乘時(shí)間分析函數(shù),計(jì)算各小時(shí)區(qū)間乘客的平均公交搭乘時(shí)間及其標(biāo)準(zhǔn)差;
4.繪制并輸出不同類型的一卡通交易數(shù)量及其占比的餅圖;
5.分別構(gòu)造線路類、司機(jī)類和車輛類,將線路編號(hào)1101–1120的線路及其所對(duì)應(yīng)的司機(jī)和車輛信息輸出為20個(gè)txt文檔,并保存到一個(gè)文件夾中;
6.分析搭載乘客情況,確定服務(wù)乘客人次最多的10個(gè)司機(jī)、10條線路和10臺(tái)車輛。
三、使用步驟
1.引入庫(kù)
代碼如下:
from numpy import * import pandas as pd import matplotlib.pyplot as plt from collections import Counter
2.導(dǎo)入數(shù)據(jù)
代碼如下:
# 導(dǎo)入csv文件 ICdata = pd.read_csv('D:/人工智能編程語(yǔ)言/Python - 作業(yè)4/ICData.csv', sep=',', encoding='utf-8')
3.任務(wù)一
代碼如下:
# 1.分別計(jì)算早上7點(diǎn)前和晚上10點(diǎn)之后的公共交通上車刷卡量; ICdata['交易時(shí)間'] = pd.to_datetime(ICdata['交易時(shí)間'], format='%Y/%m/%d %H:%M:%S') # 將字符串類型轉(zhuǎn)換為datetime類型 paytime1 = ICdata[ICdata.交易時(shí)間 < '2018/4/1 07:00:00'] paytime2 = ICdata[ICdata.交易時(shí)間 > '2018/4/1 22:00:00'] print('早上七點(diǎn)前的刷卡量為:', paytime1.交易時(shí)間.count()) # 輸出在早上七點(diǎn)前的刷卡量 print('晚上十點(diǎn)后的刷卡量為:', paytime2.交易時(shí)間.count()) # 輸出在晚上十點(diǎn)后的刷卡量 print('\n')
輸出:
4.任務(wù)二
代碼如下:
# 2.繪制并輸出當(dāng)天各小時(shí)公交刷卡量變化的折線圖 timetable = [] ICdata['hour'] = ICdata['交易時(shí)間'].dt.hour # 加多一列hour,并賦值為標(biāo)準(zhǔn)數(shù)據(jù)里的小時(shí) time = ICdata.groupby(['hour']).count() # 通過(guò)data.groupby(‘hour').count()按小時(shí)進(jìn)行分組,并統(tǒng)計(jì)數(shù)目 timetable = time.iloc[:, 2] # 取出一列數(shù)據(jù) timetable.plot() # 畫(huà)出折線圖 plt.rcParams['font.sans-serif'] = ['SimHei'] # 防止中文輸出出現(xiàn)亂碼 plt.title('當(dāng)天內(nèi)各小時(shí)刷卡量') # 設(shè)置總標(biāo)題 plt.xlabel('Hour') # 設(shè)置x坐標(biāo)標(biāo)題 plt.ylabel('Amount') # 設(shè)置y坐標(biāo)標(biāo)題 plt.show() # 展示折線圖 del ICdata['hour'] # 將hour列刪除
輸出:
5.任務(wù)三
代碼如下:
# 3.定義一個(gè)計(jì)算乘客搭乘時(shí)間平均數(shù)和標(biāo)準(zhǔn)差的函數(shù) def fun_time(x): time_list = [] ICdata['hour'] = ICdata['交易時(shí)間'].dt.hour # 加多一列hour,并賦值為標(biāo)準(zhǔn)數(shù)據(jù)里的小時(shí) t = list(ICdata['hour']) # 將hour列取出并轉(zhuǎn)換為列表 for i in range(200000): if t[i] == x: # 記錄該小時(shí)內(nèi)乘客的搭乘時(shí)間 time_list.append(abs(ICdata['上車站點(diǎn)'][i]-ICdata['下車站點(diǎn)'][i])) aver = mean(time_list) # 計(jì)算平均數(shù) std_t = std(time_list) # 計(jì)算標(biāo)準(zhǔn)差 print(x, '時(shí)內(nèi)乘客搭乘的平均時(shí)間為:%.3f站 ' % aver, '標(biāo)準(zhǔn)差為:%.3f站' % std_t) print('\n') # 函數(shù)實(shí)現(xiàn): a = int(input("請(qǐng)輸入一個(gè)整數(shù)代表該小時(shí):")) fun_time(a) # 調(diào)用fun_time函數(shù),傳入?yún)?shù)a
輸出:
6.任務(wù)四
代碼如下:
# 4.繪制并輸出不同類型的一卡通交易數(shù)量及其占比的餅圖 count = Counter(ICdata.iloc[:, 0]) # 統(tǒng)計(jì)各刷卡類型總數(shù) list_key = [] # 創(chuàng)建列表存儲(chǔ)刷卡類型 list_value = [] # 創(chuàng)建列表存儲(chǔ)刷卡總數(shù)量 print('不同類型的一卡通交易數(shù)量:') for key, value in count.items(): # 將counter類型元素分別提取到兩個(gè)列表內(nèi) list_key.append(key) list_value.append(value) print('%5d' % key, ':', value) # 輸出刷卡類型及對(duì)應(yīng)數(shù)量 print('\n') plt.figure(figsize=(6, 6), dpi=100) # 創(chuàng)建畫(huà)布 colors = ['b', 'r', 'g', 'y'] # 設(shè)置顏色 plt.pie(list_value, labels=list_key, autopct='%1.2f%%', colors=colors, shadow=True, startangle=150) # autopct='%1.2f%%' 保留2位小數(shù) # shadow=True,startangle=150 設(shè)置陰影,角度為150度 plt.legend() # 顯示圖例 plt.axis('equal') # 為了讓顯示的餅圖保持圓形,需要添加axis保證長(zhǎng)寬一樣 plt.title('不同類型的一卡通交易數(shù)占比的餅圖') # 添加標(biāo)題 plt.show()
輸出:
7.任務(wù)五
代碼如下:
# 5.分別構(gòu)造線路類、司機(jī)類和車輛類,將線路編號(hào)1101–1120的線路及其所對(duì)應(yīng)的司機(jī)和 # 車輛信息輸出為20個(gè)txt文檔,并保存到一個(gè)文件夾中; list_line=[] for i in range(1101,1121): # 將20條線路的名稱存進(jìn)列表里 list_line.append(i) class Driver: # 構(gòu)造司機(jī)類 def __init__(self,driver): self.driver = driver class Bus: # 構(gòu)造公交類 def __init__(self,bus): self.bus = bus class Line: # 構(gòu)造線路類 def __init__(self): # 因?yàn)橐鶕?jù)線路得知司機(jī)和公交的信息,因此在線路類 self.driver=[] # 里添加兩個(gè)列表分別存入司機(jī)和公交的信息 self.bus=[] def add_driver(self,x): self.driver.append(x) def add_bus(self,y): self.bus.append(y) line_class=[] # 列表存20條線路對(duì)應(yīng)的對(duì)象 for i in range(1101,1121): l=Line() # 一條線路創(chuàng)建一個(gè)對(duì)象 for j in range(200000): if ICdata['線路號(hào)'][j]==i: # 將對(duì)應(yīng)線路的司機(jī)和公交信息存入該線路對(duì)象內(nèi) l.add_driver(ICdata['車輛編號(hào)'][j]) l.add_bus(int(ICdata['駕駛員編號(hào)'][j])) line_class.append(l) basepath='D:/人工智能編程語(yǔ)言/task4/road_line/Line' # 確定txt文件存入的路徑 for i in range(20): full_path=basepath+str(list_line[i])+'.txt' # 加上文件名和后綴 file=open(full_path,'w',encoding='UTF-8') # 創(chuàng)建txt文件,只寫(xiě) file.write('車輛編號(hào)') file.write(' ') file.write('駕駛員編號(hào)\n') for j in range(len(line_class[i].driver)): # 將對(duì)應(yīng)線路的信息寫(xiě)入txt文件內(nèi) file.write(str(line_class[i].driver[j])) file.write(' ') file.write(str(line_class[i].bus[j])) file.write('\n') file.close()
輸出:
8.任務(wù)六
代碼如下:
# 6.分析搭載乘客情況,確定服務(wù)乘客人次最多的10個(gè)司機(jī)、10條線路和10臺(tái)車輛。 drivers = Counter(ICdata.iloc[:, 8]) # 取出對(duì)應(yīng)列并統(tǒng)計(jì)每個(gè)元素出現(xiàn)的次數(shù) a=(drivers.most_common(10)) # 將前十個(gè)元素及出現(xiàn)的次數(shù)存入列表a內(nèi) print('服務(wù)人次最多的前十名司機(jī)及服務(wù)人數(shù):') for i in range(10): print('%-8d'% int(a[i][0]),':','%-10d'% a[i][1]) lines = Counter(ICdata.iloc[:, 4]) b=(lines.most_common(10)) print('服務(wù)人次最多的前十條線路及服務(wù)人數(shù):') for i in range(10): print('%-8d'% int(b[i][0]),':','%-10d'% b[i][1]) buses = Counter(ICdata.iloc[:, 5]) c=(buses.most_common(10)) print('服務(wù)人次最多的前十輛公交及服務(wù)人數(shù):') for i in range(10): print('%-8d'% int(c[i][0]),':','%-10d'% c[i][1])
輸出:
四、總結(jié)
加深了對(duì)numpy,pandas和matplotlib等第三方應(yīng)用庫(kù)的使用。
到此這篇關(guān)于python數(shù)據(jù)分析之公交IC卡的文章就介紹到這了,更多相關(guān)python公交IC卡內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python數(shù)據(jù)分析之繪圖和可視化詳解
- Python數(shù)據(jù)分析之pandas比較操作
- Python數(shù)據(jù)分析入門(mén)之?dāng)?shù)據(jù)讀取與存儲(chǔ)
- Python數(shù)據(jù)分析入門(mén)之教你怎么搭建環(huán)境
- python學(xué)習(xí)之panda數(shù)據(jù)分析核心支持庫(kù)
- Python數(shù)據(jù)分析庫(kù)pandas高級(jí)接口dt的使用詳解
- 用Python 爬取貓眼電影數(shù)據(jù)分析《無(wú)名之輩》
- 高考要來(lái)啦!用Python爬取歷年高考數(shù)據(jù)并分析
相關(guān)文章
解決Django no such table: django_session的問(wèn)題
這篇文章主要介紹了解決Django no such table: django_session的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04python通過(guò)設(shè)置WordCloud參數(shù)實(shí)現(xiàn)定制詞云
這篇文章主要為大家詳細(xì)介紹了python如何通過(guò)設(shè)置WordCloud參數(shù)實(shí)現(xiàn)定制詞云,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11python利用百度AI實(shí)現(xiàn)文字識(shí)別功能
這篇文章主要為大家詳細(xì)介紹了python利用百度AI實(shí)現(xiàn)文字識(shí)別,主要涉及通用文字識(shí)別、網(wǎng)絡(luò)圖片文字識(shí)別、身份證識(shí)別等文字識(shí)別功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11解決Tensorflow2.0 tf.keras.Model.load_weights() 報(bào)錯(cuò)處理問(wèn)題
這篇文章主要介紹了解決Tensorflow2.0 tf.keras.Model.load_weights() 報(bào)錯(cuò)處理問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨想過(guò)來(lái)看看吧2020-06-06Python3+Django get/post請(qǐng)求實(shí)現(xiàn)教程詳解
這篇文章主要介紹了Python3+Django get/post請(qǐng)求實(shí)現(xiàn)教程詳解,需要的朋友可以參考下2021-02-02Python PaddlePaddle機(jī)器學(xué)習(xí)之求解線性模型
這篇文章主要介紹了Python PaddlePaddle機(jī)器學(xué)習(xí)之求解線性模型,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定參考價(jià)值,需要的小伙伴可以參考一下2022-08-08Python 獲取命令行參數(shù)內(nèi)容及參數(shù)個(gè)數(shù)的實(shí)例
今天小編就為大家分享一篇Python 獲取命令行參數(shù)內(nèi)容及參數(shù)個(gè)數(shù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12Python3實(shí)現(xiàn)發(fā)送QQ郵件功能(文本)
這篇文章主要為大家詳細(xì)介紹了Python3實(shí)現(xiàn)發(fā)送QQ郵件功能,文本方面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12Python設(shè)計(jì)模式之觀察者模式簡(jiǎn)單示例
這篇文章主要介紹了Python設(shè)計(jì)模式之觀察者模式,簡(jiǎn)單描述了觀察者模式的概念、原理,并結(jié)合實(shí)例形式分析了Python觀察者模式的相關(guān)定義與使用技巧,需要的朋友可以參考下2018-01-01