python數(shù)據分析之公交IC卡刷卡分析
一、背景
交通大數(shù)據是由交通運行管理直接產生的數(shù)據(包括各類道路交通、公共交通、對外交通的刷卡、線圈、卡口、GPS、視頻、圖片等數(shù)據)、交通相關行業(yè)和領域導入的數(shù)據(氣象、環(huán)境、人口、規(guī)劃、移動通信手機信令等數(shù)據),以及來自公眾互動提供的交通狀況數(shù)據(通過微博、微信、論壇、廣播電臺等提供的文字、圖片、音視頻等數(shù)據)構成的。
現(xiàn)在給出了一個公交刷卡樣例數(shù)據集,包含有交易類型、交易時間、交易卡號、刷卡類型、線路號、車輛編號、上車站點、下車站點、駕駛員編號、運營公司編號等。試導入該數(shù)據集并做分析。
二、任務要求
1.分別計算早上7點前和晚上10點之后的公共交通上車刷卡量;
2.繪制并輸出當天各小時公交刷卡量變化的折線圖;
3.構造一個乘客搭乘時間分析函數(shù),計算各小時區(qū)間乘客的平均公交搭乘時間及其標準差;
4.繪制并輸出不同類型的一卡通交易數(shù)量及其占比的餅圖;
5.分別構造線路類、司機類和車輛類,將線路編號1101–1120的線路及其所對應的司機和車輛信息輸出為20個txt文檔,并保存到一個文件夾中;
6.分析搭載乘客情況,確定服務乘客人次最多的10個司機、10條線路和10臺車輛。
三、使用步驟
1.引入庫
代碼如下:
from numpy import * import pandas as pd import matplotlib.pyplot as plt from collections import Counter
2.導入數(shù)據
代碼如下:
# 導入csv文件
ICdata = pd.read_csv('D:/人工智能編程語言/Python - 作業(yè)4/ICData.csv', sep=',', encoding='utf-8')
3.任務一
代碼如下:
# 1.分別計算早上7點前和晚上10點之后的公共交通上車刷卡量;
ICdata['交易時間'] = pd.to_datetime(ICdata['交易時間'], format='%Y/%m/%d %H:%M:%S') # 將字符串類型轉換為datetime類型
paytime1 = ICdata[ICdata.交易時間 < '2018/4/1 07:00:00']
paytime2 = ICdata[ICdata.交易時間 > '2018/4/1 22:00:00']
print('早上七點前的刷卡量為:', paytime1.交易時間.count()) # 輸出在早上七點前的刷卡量
print('晚上十點后的刷卡量為:', paytime2.交易時間.count()) # 輸出在晚上十點后的刷卡量
print('\n')
輸出:

4.任務二
代碼如下:
# 2.繪制并輸出當天各小時公交刷卡量變化的折線圖
timetable = []
ICdata['hour'] = ICdata['交易時間'].dt.hour # 加多一列hour,并賦值為標準數(shù)據里的小時
time = ICdata.groupby(['hour']).count() # 通過data.groupby(‘hour').count()按小時進行分組,并統(tǒng)計數(shù)目
timetable = time.iloc[:, 2] # 取出一列數(shù)據
timetable.plot() # 畫出折線圖
plt.rcParams['font.sans-serif'] = ['SimHei'] # 防止中文輸出出現(xiàn)亂碼
plt.title('當天內各小時刷卡量') # 設置總標題
plt.xlabel('Hour') # 設置x坐標標題
plt.ylabel('Amount') # 設置y坐標標題
plt.show() # 展示折線圖
del ICdata['hour'] # 將hour列刪除
輸出:

5.任務三
代碼如下:
# 3.定義一個計算乘客搭乘時間平均數(shù)和標準差的函數(shù)
def fun_time(x):
time_list = []
ICdata['hour'] = ICdata['交易時間'].dt.hour # 加多一列hour,并賦值為標準數(shù)據里的小時
t = list(ICdata['hour']) # 將hour列取出并轉換為列表
for i in range(200000):
if t[i] == x: # 記錄該小時內乘客的搭乘時間
time_list.append(abs(ICdata['上車站點'][i]-ICdata['下車站點'][i]))
aver = mean(time_list) # 計算平均數(shù)
std_t = std(time_list) # 計算標準差
print(x, '時內乘客搭乘的平均時間為:%.3f站 ' % aver, '標準差為:%.3f站' % std_t)
print('\n')
# 函數(shù)實現(xiàn):
a = int(input("請輸入一個整數(shù)代表該小時:"))
fun_time(a) # 調用fun_time函數(shù),傳入參數(shù)a
輸出:

6.任務四
代碼如下:
# 4.繪制并輸出不同類型的一卡通交易數(shù)量及其占比的餅圖
count = Counter(ICdata.iloc[:, 0]) # 統(tǒng)計各刷卡類型總數(shù)
list_key = [] # 創(chuàng)建列表存儲刷卡類型
list_value = [] # 創(chuàng)建列表存儲刷卡總數(shù)量
print('不同類型的一卡通交易數(shù)量:')
for key, value in count.items(): # 將counter類型元素分別提取到兩個列表內
list_key.append(key)
list_value.append(value)
print('%5d' % key, ':', value) # 輸出刷卡類型及對應數(shù)量
print('\n')
plt.figure(figsize=(6, 6), dpi=100) # 創(chuàng)建畫布
colors = ['b', 'r', 'g', 'y'] # 設置顏色
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 設置陰影,角度為150度
plt.legend() # 顯示圖例
plt.axis('equal') # 為了讓顯示的餅圖保持圓形,需要添加axis保證長寬一樣
plt.title('不同類型的一卡通交易數(shù)占比的餅圖') # 添加標題
plt.show()
輸出:

7.任務五
代碼如下:
# 5.分別構造線路類、司機類和車輛類,將線路編號1101–1120的線路及其所對應的司機和
# 車輛信息輸出為20個txt文檔,并保存到一個文件夾中;
list_line=[]
for i in range(1101,1121): # 將20條線路的名稱存進列表里
list_line.append(i)
class Driver: # 構造司機類
def __init__(self,driver):
self.driver = driver
class Bus: # 構造公交類
def __init__(self,bus):
self.bus = bus
class Line: # 構造線路類
def __init__(self): # 因為要根據線路得知司機和公交的信息,因此在線路類
self.driver=[] # 里添加兩個列表分別存入司機和公交的信息
self.bus=[]
def add_driver(self,x):
self.driver.append(x)
def add_bus(self,y):
self.bus.append(y)
line_class=[] # 列表存20條線路對應的對象
for i in range(1101,1121):
l=Line() # 一條線路創(chuàng)建一個對象
for j in range(200000):
if ICdata['線路號'][j]==i: # 將對應線路的司機和公交信息存入該線路對象內
l.add_driver(ICdata['車輛編號'][j])
l.add_bus(int(ICdata['駕駛員編號'][j]))
line_class.append(l)
basepath='D:/人工智能編程語言/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文件,只寫
file.write('車輛編號')
file.write(' ')
file.write('駕駛員編號\n')
for j in range(len(line_class[i].driver)): # 將對應線路的信息寫入txt文件內
file.write(str(line_class[i].driver[j]))
file.write(' ')
file.write(str(line_class[i].bus[j]))
file.write('\n')
file.close()
輸出:


8.任務六
代碼如下:
# 6.分析搭載乘客情況,確定服務乘客人次最多的10個司機、10條線路和10臺車輛。
drivers = Counter(ICdata.iloc[:, 8]) # 取出對應列并統(tǒng)計每個元素出現(xiàn)的次數(shù)
a=(drivers.most_common(10)) # 將前十個元素及出現(xiàn)的次數(shù)存入列表a內
print('服務人次最多的前十名司機及服務人數(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('服務人次最多的前十條線路及服務人數(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('服務人次最多的前十輛公交及服務人數(shù):')
for i in range(10):
print('%-8d'% int(c[i][0]),':','%-10d'% c[i][1])
輸出:


四、總結
加深了對numpy,pandas和matplotlib等第三方應用庫的使用。
到此這篇關于python數(shù)據分析之公交IC卡的文章就介紹到這了,更多相關python公交IC卡內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
解決Django no such table: django_session的問題
這篇文章主要介紹了解決Django no such table: django_session的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04
python通過設置WordCloud參數(shù)實現(xiàn)定制詞云
這篇文章主要為大家詳細介紹了python如何通過設置WordCloud參數(shù)實現(xiàn)定制詞云,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2023-11-11
解決Tensorflow2.0 tf.keras.Model.load_weights() 報錯處理問題
這篇文章主要介紹了解決Tensorflow2.0 tf.keras.Model.load_weights() 報錯處理問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨想過來看看吧2020-06-06
Python3+Django get/post請求實現(xiàn)教程詳解
這篇文章主要介紹了Python3+Django get/post請求實現(xiàn)教程詳解,需要的朋友可以參考下2021-02-02
Python PaddlePaddle機器學習之求解線性模型
這篇文章主要介紹了Python PaddlePaddle機器學習之求解線性模型,文章圍繞主題展開詳細的內容介紹,具有一定參考價值,需要的小伙伴可以參考一下2022-08-08
Python 獲取命令行參數(shù)內容及參數(shù)個數(shù)的實例
今天小編就為大家分享一篇Python 獲取命令行參數(shù)內容及參數(shù)個數(shù)的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
Python3實現(xiàn)發(fā)送QQ郵件功能(文本)
這篇文章主要為大家詳細介紹了Python3實現(xiàn)發(fā)送QQ郵件功能,文本方面,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12

