2.5亿条深圳共享单车数据集获取完整教程【纯小白向】
上期深圳市共享单车数据分析【文末附共享单车数据集清单】简单分享了如何使用共享单车数据进行数据分析,有很多人问如何才能获取数据,以及没学过 Python,如何获取?
接下来我把代码分享出来,你拿着我的代码,修改一个变量,就可以获取相应日期的深圳共享单车数据了。
1.数据集介绍
- 数据集概览:该数据集名为“深圳共享单车企业每日订单表”,来源于深圳市政府数据开放平台。它包含从2017 年 4 月 3 日至2021 年 8 月 30 日的每日订单数据(具体数据包含的日期可以点我下载),截止发文约有2.446 亿条记录,总大小约24GB。(储存在 Mongodb 数据库大小为 24GB,实际储存为文件占用大小为 40GB 左右。)
- 获取子集: 获取整个数据集之后,我们可以进行日期查询,获取指定日期的数据。
2.获取方式
1)直接下载
如此大量的数据,直接下载的文件仅包含本数据集的前 10 万条数据,无法下载全部的数据,也无法选择指定日期的数据。
每条数据包含的字段:
USER_ID | 用户 id |
---|---|
COM_ID | 企业 id |
START_TIME | 开始时间 |
START_LNG | 开始经度 |
START_LAT | 开始纬度 |
END_TIME | 结束时间 |
END_LNG | 结束经度 |
END_LAT | 结束纬度 |
2)调用 API 接口
深圳数据开放平台也提供调用数据接口的方式进行下载:
数据接口(APIs) 前文已经介绍过了,JavaScript和Python,都可用于调用 API。
每种方法都有其特定的使用场景和优势。选择哪种方法取决于你的项目需求、所用技术栈以及个人或团队的熟悉程度。
我们选用简洁性、受欢迎的 Python 来进行数据获取,使用的方法是requests
库,或者可以使用http.client
或第三方库如aiohttp
(异步请求)。
👉 网站:https://opendata.sz.gov.cn/data/api/toApiDetails/29200_00403627)上提供了相应的【调用说明】:
登录网站,完成前两步:
根据提示填写相关信息,点击提交应用上传,提交成功后可在个人中心-我的应用-我的应用查看 appKey。
测试接口
!!!若有按时间获取数据的需求,可通过增加 startDate 和 endDate 参数对数据进行筛选。
所以我们只需用 Python 写一个requests
请求,然后将数据储存到数据库。
如果你需要储存整个数据集(2.7 亿条共享单车订单数据),不建议将数据保存在单个 Json 或 csv 文件中,因为一个超过电脑内存的文件根本无法一次性读取到内存中,更没办法查询,所以有的人会按照日期分多个子集保存。但是,多个分散的文件不利于维护,也不利于查询,如果只想获取某个共享单车企业的某个时间跨度内的内容,使用数据库就很高效,所以强烈建议选择数据库。
3.配置数据库
数据库我们选择 MongoDB Community,访问Download MongoDB Community Server | MongoDB下载安装程序:
安装一直默认就行了,记得勾选安装Mongodb compass,是一款直观且用户友好的图形界面工具,用于管理和查询 MongoDB 数据库。
有任何安装问题访问:
4.配置 python 环境
对于新手,千万不要使用 anaconda 管理环境,直接使用 python 安装包进行安装。
对于新手来说,直接使用 Python 官方安装包进行安装相较于使用 Anaconda 管理环境,有以下一些好处:
- 简化学习过程:直接安装 Python 可以帮助新手集中学习 Python 语言本身,而不是花费时间去理解 Anaconda 这样的环境管理工具。这对于初学者来说更直接,更容易入门。
- 了解基础:直接安装 Python 能让新手更好地理解 Python 环境的基本设置,例如如何配置环境变量,如何使用 pip 进行包管理等。这些是 Python 编程的基本技能。
- 避免资源消耗:Anaconda 是一个较大的发行版,包含了许多不一定立即需要的预安装包。对于有限的系统资源或希望避免不必要的复杂性的新手,直接安装 Python 会更加轻量。
- 控制安装包:直接使用 Python 和 pip,用户可以更灵活地控制所安装的包和版本。这对于学习如何管理 Python 依赖和理解不同库的兼容性很有帮助。
- 减少依赖冲突:使用官方 Python 安装,可以减少由于复杂环境导致的依赖冲突问题。新手在学习初期可能不需要复杂的环境管理,因此直接安装 Python 可以降低这方面的问题。
- 标准化学习材料:许多教程和学习材料都是基于 Python 官方安装来编写的,直接使用官方版本可以确保与这些教程的一致性。
- 体验 Python 生态:通过直接安装 Python,新手可以更直接地体验和了解 Python 的生态系统,包括各种第三方库和工具。
当然,这并不是说 Anaconda 没有其优势,特别是在科学计算和数据分析领域,Anaconda 提供了许多便利。然而,对于刚开始学习 Python 的新手来说,直接从基础开始学习往往能提供更坚实的基础。随着学习的深入,用户可以根据需要选择更高级的工具和环境。
1)Windows 安装 Python
- 下载 Python:
- 访问 Python 官网。
- 选择适合 Windows 的 Python 版本进行下载(通常会自动推荐最新版本)。
- 安装 Python:
- 打开下载的安装程序。
- 重要:在安装过程开始时,确保选中“Add Python to PATH”选项,然后点击“Install Now”。
- 验证安装:
- 打开命令提示符(CMD)。
- 输入
python --version
并按回车。如果安装成功,将显示 Python 的版本信息。
2)macOS 安装 Python
- 下载 Python:
- 访问 Python 官网。
- 选择适合 macOS 的 Python 版本进行下载。
- 安装 Python:
- 打开下载的
.pkg
安装文件,然后遵循安装向导的指示完成安装。
- 打开下载的
- 验证安装:
- 打开终端(Terminal)。
- 输入
python3 --version
并按回车。如果安装成功,将显示 Python 的版本信息。
5.安装依赖
pip 是 Python 的包管理工具,用于安装和管理 Python 包。以下是使用 pip 安装依赖的基本步骤:
1)确保安装了 pip
大多数现代 Python 安装都自带 pip。要检查 pip 是否已安装,可以在命令行或终端中运行以下命令:
pip --version
如果 pip 已安装,该命令将显示 pip 的版本信息。如果没有安装 pip,您需要先安装它。安装方法依赖于您的操作系统,通常在 Python 官网上有详细的安装指南。
2)使用 pip 安装包
要使用 pip 安装一个 Python 包,可以在命令行或终端中使用以下命令格式:
pip install <package_name>
本次环境需要使用以下命令:
pip install pandas requests pymongo -i https://pypi.tuna.tsinghua.edu.cn/simple
简要说明:
pandas
: 一个强大的数据分析和处理库。requests
: 用于发送 HTTP 请求的库,非常适合与 API 交互。pymongo
: 用于在 Python 中操作 MongoDB 数据库的库。-i https://pypi.tuna.tsinghua.edu.cn/simple
这部分指定了一个自定义的包索引源,即清华大学提供的 PyPI 镜像。这个镜像源在中国大陆访问速度更快,有助于解决由于网络问题导致的慢速或失败的包安装问题。
6.准备代码
我们新建一个文件夹,比如就叫shenzhen_data
,然后新建一个文本文件,重命名为main.py
,之后用记事本打开,复制以下代码:
"""
深圳共享单车数据研究——获取数据
数据名称:共享单车企业每日订单表
更新日期:2021-12-09 上架日期:2021-12-09
更新频率:不定期
数据量:244,638,540条
数据容量:1,957,108,320
浏览量:22,913次
调用量:18,669,737次
下载量:3,037次
开放方式:实名认证
开放数源单位:深圳市交通运输局
数据简介:共享单车企业每日订单表
"""
import os
import time
from datetime import datetime, timedelta, timezone
import pandas as pd
import requests
from pymongo import MongoClient
from pymongo.errors import ConnectionFailure
def translate_time_to_utc(data, time_format):
"""
将时间字符串转换为 UTC datetime 对象。
"""
tz_beijing = timezone(timedelta(hours=8)) # 定义北京时区
for record in data:
for time_key in ['开始时间', '结束时间']:
if time_key in record:
try:
# 先将字符串转换为北京时间的 datetime 对象
local_time = datetime.strptime(record[time_key], time_format)
# 添加时区信息
local_time = local_time.replace(tzinfo=tz_beijing)
# 转换为 UTC 时间
record[time_key] = local_time.astimezone(timezone.utc)
except ValueError:
local_time = datetime.strptime(record[time_key].split('.')[0], time_format)
local_time = local_time.replace(tzinfo=tz_beijing)
record[time_key] = local_time.astimezone(timezone.utc)
return data
def process_data(response):
"""
从响应中处理并返回数据的主程序
返回的数据中,时间字符串已经转换为 UTC datetime 对象。
"""
data = response.json()['data']
return translate_time_to_utc(data, "%Y-%m-%d %H:%M:%S")
def test_mongodb_connection(mongo_url):
"""
测试本地MongoDB的连接。
"""
try:
# 创建MongoDB客户端
client = MongoClient(mongo_url)
# 尝试获取MongoDB的服务器状态
client.admin.command('ismaster')
print("MongoDB连接成功")
return client
except ConnectionFailure:
print("MongoDB连接失败")
return None
# 主函数
if __name__ == "__main__":
# 环境变量和初始化
app_key = "4137xxxxxxxxxxxxxxxx68d0d5" # 填写从深圳开放数据平台申请的app_key
mongo_url = "mongodb://localhost:27017/" # 本地mongodb路径
page_num = 1
rows = 4000
url = 'https://opendata.sz.gov.cn/api/29200_00403627/1/service.xhtml'
# 请求头 不加请求会被拒绝
headers = {
'Accept': 'text/plain, */*; q=0.01',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
'Connection': 'keep-alive',
'DNT': '1',
'Host': 'opendata.sz.gov.cn',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest',
'sec-ch-ua': '"Google Chrome";v="119", "Chromium";v="119", "Not?A_Brand";v="24"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"macOS"'
}
# MongoDB 连接
client = test_mongodb_connection(mongo_url)
db = client['交通类大数据']
collection = db['深圳共享单车企业每日订单表']
# 数据请求和处理循环
while True:
retry = 0
params = {'appKey': app_key, 'page': page_num, 'rows': rows}
response = requests.get(url, headers=headers, params=params)
if response.status_code == 200:
items = process_data(response)
if items:
# 插入数据到数据库
print(f"正在写入第{page_num}页数据")
collection.insert_many(items) # 注意时间是UTC时间
else:
print("数据处理出错")
else:
print(f"请求错误,状态码:{response.status_code}")
if retry < 5:
retry += 1
time.sleep(20)
else:
print("重试次数过多,终止操作")
break
# 判断是否继续
if len(items) < rows:
break
else:
page_num += 1
修改此处并保存:
app_key = "4137xxxxxxxxxxxxxxxx68d0d5" # <<<<<<<< 填写从深圳开放数据平台申请的app_key
7.运行
打开终端(命令提示符),定位到代码所在文件夹:
cd /path/to/shenzhen_data
运行 Python:
python main.py
查看输出,如下图所示则成功运行
8.查看数据
打开 Mongodb compass,点击 connect,连接到本地数据库:
如上图显示有订单表则成功了,可以刷新显示 Documents(数据量)一直在增长,获取点击《深圳共享单车企业每日订单表》查看数据详情:
9.读取某一天的数据
import pandas as pd
from datetime import datetime, timedelta, timezone
from pymongo import MongoClient
# MongoDB 连接
mongo_url = "mongodb://localhost:27017/"
client = MongoClient(mongo_url)
db = client['交通类大数据']
collection = db['深圳共享单车企业每日订单表']
# 将查询时间调整为 UTC 时间 提高查询效率
# 获取2021年8月5日的数据
query = {
'START_TIME': {
'$gte': datetime(2021, 8, 4, 16, 0, 0), # 对应北京时间 2021年8月5日 0:00
'$lt': datetime(2021, 8, 5, 16, 0, 0) # 对应北京时间 2021年8月6日 0:00
}
}
cursor = collection.find(query)
df = pd.DataFrame(list(cursor))
df.head()
10.常见问题
(1)数据字段相关:
1. 本数据集内使用的坐标系应该为 WGS1984!
虽然官方标注的数据集为 bd09 坐标系,但是实测发现是 WGS1984 坐标系。目前只验证了 2021 年 8 月 5 号和 2021 年 4 月 14 日的数据,均为 WGS1984 坐标系。
2. 储存到数据库的时间是 UTC 时间,需要转换为北京时间!
3.并不是所有数据都有企业 id 字段。
(2)Python 学习相关
(3)empty dataframe 或者其他无法通过日期查询到数据的情况
如果用以下 python 代码无法查询到数据:
query = {
'START_TIME': {
'$gte': datetime(2021, 8, 4, 16, 0, 0), # 对应北京时间 2021年8月5日 0:00
'$lt': datetime(2021, 8, 5, 16, 0, 0) # 对应北京时间 2021年8月6日 0:00
}
}
cursor = collection.find(query)
df = pd.DataFrame(list(cursor))
df.head()
则需要检查数据库中的日期字段类型是 date 还是 str 字符串,以上代码是将日期定义为间类型来进行查询的而不是字符串,
(4)用浏览器直接访问链接出错,但是使用 python 调用接口则有数据。
这是正常“现象”。
这通常是因为浏览器预期得到的响应格式与实际返回的格式不匹配。这里提到的错误 “Start tag expected, ‘<’ not found” 指出浏览器正在尝试解析返回的数据作为 XML,但是它并没有找到期望的开始标签 ‘<’。
简单来说就是返回的是数据而不是 html 文件,浏览器无法渲染输出。按 f12 打开开发者菜单,找到如图所示的响应页面,可以查看链接返回的数据。
文章写得比较匆忙,此文章后续会在我的博客更新,可以点击阅读原文访问。
如果你对本文章有什么意见、对如何制作文中的图表感兴趣、或者有其它任何问题建议在本文的博客评论区留言,说不定你的问题别人也遇到了。