我住在台北市景美商圈
從2019年9月開始,路邊機車格也要收費
有很多人不想繳錢,就塞進騎樓下
結果路邊停車格非常空曠
我停得非常滿意,不用怕被別人ㄎㄟˊ到
這篇文章會分享以下幾件事:
一、機車繳費單
二、自動繳納停車費
三、分析我收過的 70 張單
這幾個月,我都會將繳費單收集起來
就是為了拍這幾張照片XD
大家可以發現,繳費單有不同顏色
會被收費員掛在機車後扶手上
其實是有巧思的,不同顏色代表不同日子
星期一:紅色
星期二:橙色
星期三:黃色
星期四:綠色
星期五:藍色
星期六:灰色
星期日:紫色
如此一來,收費員不需要逐一檢查每台機車
只要看顏色就能判斷是否開過單了
目前停車費一次20元,當天不重複收費
有些活動與電子支付一天是15~18元
政府提倡自主開單,可透過「路邊好停車」等APP
自己停完車,就自己用手機登記
當收費員掃到你的機車時
就不會再次掛紙本單據到機車上
但是!自主開單並非自動繳款
因此必須透過「車麻吉」等APP
綁定信用卡再自動自動扣款
我透過 Python 爬取我的個人信箱
自動將所有電子收據抓下來做統計
分析我的機車被開單的時間點
在看圖表前,有幾件前情提要
1、我星期一到五上班,早上9點騎車、晚上6點回到家停車
2、星期六日不騎車,也就是車子停在格子不動
下面繪製的都是時間統計分布圖(Histogram)
文末會附上程式碼,有興趣的人可以看看
八張小圖,X軸是時間(10~20點)、Y軸是數量
依序是總和、星期一、星期二至星期日
下面則是直接整合成二維資料,並用顏色代表數量
對此統計,有幾點結論:
1、收費員是10點上班,20點下班
2、由於我18點停車,大部分在19點前就會被開單
3、星期二相較其他天少,可能是值班的收費員不習慣騎到我那條街?
4、星期四只被開過4次,是因為我晚上要社團運動,都21點後才停車
5、星期五好幾個早上或下午的紀錄,是因為我有時周五會請假
6、星期六早上10點被開好開滿,乖乖繳停車費
7、文獻說星期天的單據是紫色,但我從來沒周日被開過單!?
坦白說,一天停車費 20 元
可以不用跟別人的車擠在一起
為了喬車位,挪來挪去
個人認為非常值得
最後謝謝收費員辛苦的開單
# Gmail 要先去以下網址,開啟「低安全性應用程式存取權」
# https://myaccount.google.com/lesssecureapps
import imaplib
import datetime
import email
import numpy as np
import seaborn as sn
import matplotlib.pyplot as plt
FROM_EMAIL = "youmail@gmail.com"
FROM_PWD = "password"
SMTP_SERVER = "imap.gmail.com"
mail = imaplib.IMAP4_SSL(SMTP_SERVER)
mail.login(FROM_EMAIL, FROM_PWD)
mail.select('inbox')
typ, data = mail.search(None, '(FROM "cs@mochipay.xyz")')
id_list = data[0].split()
time_list = []
for i in id_list:
typ, data = mail.fetch(i, '(RFC822)')
email_message = email.message_from_string(data[0][1].decode('utf-8'))
subject = str(email.header.make_header(email.header.decode_header(email_message['Subject'])))
# print(subject)
for part in email_message.walk():
body = part.get_payload(decode=True)
content = body.decode('utf-8')
if '停車日期' in content:
pos = content.index('停車日期')
parking_time = content[pos+5:].split('')[0]
if len(parking_time) > 13:
parking_time = parking_time[:16]
print(parking_time)
time_list.append(datetime.datetime.strptime(parking_time, '%Y.%m.%d %H:%M'))
''' Week Day Report '''
WEEK = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
plt.figure(figsize = (15, 12))
hour_list = [(i.hour*60+i.minute)/60 for i in time_list]
plt.subplot(4, 2, 1)
plt.hist(hour_list, bins=30)
plt.ylabel('Overall Billing Count: ' + str(len(hour_list)))
plt.xlabel('Hour')
plt.xlim([10, 20])
plt.grid()
for w in range(7):
plt.subplot(4, 2, w+2)
hour_list = [(i.hour*60+i.minute)/60 for i in time_list if i.strftime("%A") == WEEK[w]]
counts, bins = np.histogram(hour_list)
plt.hist(bins[:-1], bins, weights=counts)
plt.ylabel(WEEK[w] + ' Billing Count: ' + str(len(hour_list)))
plt.xlabel('Hour')
if max(counts) != 0:
plt.ylim([0, max(counts)])
else:
plt.ylim([0, 1])
plt.xlim([10, 20])
plt.grid()
plt.show()
''' Time Slot Report '''
zone_list = [(i.strftime("%A"), i.strftime("%H")) for i in time_list]
zone_report = np.zeros([24, 7])
for i in zone_list:
idx = WEEK.index(i[0])
zone_report[int(i[1]), idx] = zone_report[int(i[1]), idx] + 1
zone_report_weekday = np.sum(zone_report, 0)
plt.figure(figsize = (10, 7))
sn.heatmap(zone_report, annot=True, fmt='g', cmap='YlOrRd')
plt.xticks(np.arange(7), WEEK, ha='left')
plt.yticks(rotation=0)
plt.ylabel('Hour')
plt.title('Time Slot and Weekday')
★ 推薦:Hahow線上課程 ★