新加坡大街上的公交车站:
2019冠状病毒疾病深刻地影响了我们生活的方方面面,从全球供应链到我们工作的方式。
在大多数国家,在不同程度的限制下实施了某种形式的封锁。这些封锁的一个有趣方面是对世界不同地区的日常生活的影响,其中最常见的预防措施之一是“呆在家里”。
新加坡作为一个人口稠密的城市和岛屿,我们将试图了解市中心附近的交通过去和现在是如何受到病毒的影响的。
这篇文章的重点是回答以下问题:
2019冠状病毒疾病对新加坡的交通有影响吗?如果是的话,这种影响是什么,可能是什么原因造成的?
本文中的代码是用于解释目的的补充工具,对原始代码进行了略为简化和修改。
数据收集
新加坡拥有一个令人难以置信的公共数据库,涵盖了城市的各个方面及其功能。
你可以访问:https://data.gov.sg/获取。本项目利用陆路运输局管理的交通摄像头部分。API允许用户指定时间戳,并返回来自城市周围每个摄像头的所有数据。
我们可以使用python中的请求库来指定时间戳,并接收包含所有摄像机的位置和视频帧的JSON对象。
# 导入requests库
import requests
# 调用API
response = requests.get('https://api.data.gov.sg/v1/transport/traffic-images?date_time=2019-01-01T12%3A00%3A00')
# 将响应转换为json
data = response.json()
返回的JSON对象是每个摄像头和各种数据的列表,包括位置、到视频帧的链接以及一些关于图像的元数据。我们最感兴趣的是三个方面:
camera_id- 摄像机ID
image:URL,其中包含相机当时看到的图像
location:相机的GPS线,嵌套在相机对象中
为了做到这一点,需要对JSON响应进行规范化和解析。这可以通过pandas库来完成,pandas库将用于管理我们的数据。
# 规范化JSON响应
camera_df = pd.json_normalize(data['items'], 'cameras')
# 重命名经纬度
camera_df = camera_df.rename(columns={'location.latitude':'latitude', 'location.longitude': 'longitude'})
camera_df.head(10)
这将给我们留下87行x 8列的数据帧。
index timestamp image camera_id latitude longitude height width image_metadata.md5
0 2019-01-01T11:59:37+08:00 https://images.data.gov.sg/api/traffic-images/2019/01/8101fdc6-9848-4830-af5d-c1c9a716c462.jpg 1501 1.27414394350065 103.851316802547 240 320 b4e2752965b2574e46772e1e6966af4b
1 2019-01-01T11:59:37+08:00 https://images.data.gov.sg/api/traffic-images/2019/01/c0456723-b36d-4a52-878a-0d38e4046efb.jpg 1502 1.27135090682664 103.861828440597 240 320 8315be83c1481a86f495406c8c8d8e14
2 2019-01-01T11:59:37+08:00 https://images.data.gov.sg/api/traffic-images/2019/01/b1ae02ea-37ca-42fd-aa6b-7e23252f3e57.jpg 1503 1.27066408655104 103.856977943394 240 320 958c9e3c3384836b46c0ee379d837a9d
3 2019-01-01T11:59:37+08:00 https://images.data.gov.sg/api/traffic-images/2019/01/560c4129-0416-4ace-a1af-07aa30901c10.jpg 1504 1.29409891409364 103.876056196568 240 320 2bcda18da47b85dce997a7e84897d04c
4 2019-01-01T11:59:37+08:00 https://images.data.gov.sg/api/traffic-images/2019/01/45198628-fb00-4cf9-8444-132ec05b9d7a.jpg 1505 1.2752977149006 103.866390381759 240 320 2dc228f314f08645a2ad856a302f0e00
5 2019-01-01T11:59:37+08:00 https://images.data.gov.sg/api/traffic-images/2019/01/b23f8f7d-602c-4904-a7de-b963e9973857.jpg 1701 1.323604823 103.8587802 480 640 36b725cafe35fbc6b58526f90c94753f
6 2019-01-01T11:59:37+08:00 https://images.data.gov.sg/api/traffic-images/2019/01/bd6c55c4-ed24-42b0-821b-8fbd93ef95ae.jpg 1702 1.34355015 103.8601984 480 640 6a46244455a092dee783476aa22765b9
7 2019-01-01T11:59:37+08:00 https://images.data.gov.sg/api/traffic-images/2019/01/c49eac51-7511-4494-9942-9b751a6c3009.jpg 1703 1.32814722194857 103.862203282048 480 640 50fcded0d1d3aef56a8f7e20055a0f50
8 2019-01-01T11:59:37+08:00 https://images.data.gov.sg/api/traffic-images/2019/01/f320034b-11d7-4daf-977c-b2cf1d6e94cd.jpg 1704 1.28569398886979 103.837524510188 480 640 b4baf40805583ad259e1171cd27cc956
9 2019-01-01T11:59:37+08:00 https://images.data.gov.sg/api/traffic-images/2019/01/7478b318-5fd1-45ba-a82f-2a522523ede0.jpg 1705 1.375925022 103.8587986 480 640 ea1a417df78e5c2f823f863e027da8a2
该数据帧是给定时间戳下城市周围所有摄像机的数据帧。
为了减少收集的数据量并控制范围,我们将把摄像机数量限制为1702和1711。这些位于璧山区和色朗贡区之间的CTE高速公路上。由于位于主要道路上,交通的任何重大变化都应该很容易发现。下面是每台相机所看到的示例。
照相机1702的示例
照相机1711的示例
下一步是建立一个时间帧来衡量交通模式。从2019,2020,2021的3月1日至5月1日,每三分钟递增。选择这一点有三个主要原因:
纳入三年时间框架,可以进行新冠肺炎前期、中期和后期评估,2019年作为正常交通模式的一个例子。
3月到5月也很重要,因为2020年4月出台了最严格的措施,并在2021取消了限制。
将时间限制为每三分钟一次,这样可以更易于管理的图像数据集进行标记。
使用pandas,可以建立批量请求的数据帧。首先,使用date_range函数生成时间戳的数据帧:
# 为2019/01/01生成间隔为2分钟的数据帧
dates_2019 = pd.date_range(start = "2019-03-01", end = "2019-05-01", freq = '180S')
其次,将时间戳格式化为可以传递给API的格式。
# 设置一个列表来转储格式化的日期
formated_dates_2019 = []
# 循环日期
for dates in dates_2019:
# 把时间戳放到api需要的格式中
inter_date_str = dates.strftime("%Y-%m-%dT%I:%M:%S")
# 编码
fin_date_str = date_str.replace(':', '%3A')
# 将它