前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2.5亿条深圳共享单车数据集获取完整教程【纯小白向】

2.5亿条深圳共享单车数据集获取完整教程【纯小白向】

作者头像
renhai
发布2023-12-10 15:02:44
5732
发布2023-12-10 15:02:44
举报

上期深圳市共享单车数据分析【文末附共享单车数据集清单】[1]简单分享了如何使用共享单车数据进行数据分析,有很多人问如何才能获取数据,以及没学过Python,如何获取?

接下来我把代码分享出来,你拿着我的代码,修改一个变量,就可以获取共享单车数据了,不仅如此深圳市政府数据开放平台上其他数据也是同样的道理。

1.数据集介绍

  • 数据集概览:该数据集名为“深圳共享单车企业每日订单表”[2],来源于深圳市政府数据开放平台[3]。它包含从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) 前文已经介绍过了,JavaScriptPython,都可用于调用API。

每种方法都有其特定的使用场景和优势。选择哪种方法取决于你的项目需求、所用技术栈以及个人或团队的熟悉程度。

我们选用简洁性、受欢迎的Python来进行数据获取,使用的方法是requests库,或者可以使用http.client或第三方库如aiohttp(异步请求)。

👉网站:https://opendata.sz.gov.cn/data/api/toApiDetails/29200_00403627[4])上提供了相应的【调用说明】:

调用说明

登录网站,完成前两步:

1、提交应用名称

根据提示填写相关信息,点击提交应用上传,提交成功后可在个人中心-我的应用-我的应用查看 appKey

2、订阅接口

测试接口

写的时候发现有bug,加上startDate参数之后无法查询特定日期的,如果有大佬知道为什么,留言,那么我们只能获取整个数据集了。

所以我们只需用Python写一个requests请求,然后将数据储存到数据库。

如果你需要储存整个数据集(2.7亿条共享单车订单数据),不建议将数据保存在单个Json或csv文件中,因为一个超过电脑内存的文件根本无法一次性读取到内存中,更没办法查询,所以有的人会按照日期分多个子集保存。但是,多个分散的文件不利于维护,也不利于查询,如果只想获取某个共享单车企业的某个时间跨度内的内容,使用数据库就很高效,所以强烈建议选择数据库。

3.配置数据库

数据库我们选择MongoDB Community,访问https://www.mongodb.com/try/download/community下载安装程序:

image-20231207105433102

安装一直默认就行了,记得勾选安装Mongodb compass,是一款直观且用户友好的图形界面工具,用于管理和查询MongoDB数据库。

有任何安装问题访问:

  • 在Windows上安装[5]
  • 在macOS上安装[6]
  • 其他平台[7]

4.配置python环境

对于新手,千万不要使用anaconda管理环境,直接使用python安装包进行安装。

对于新手来说,直接使用Python官方安装包进行安装相较于使用Anaconda管理环境,有以下一些好处:

  1. 简化学习过程:直接安装Python可以帮助新手集中学习Python语言本身,而不是花费时间去理解Anaconda这样的环境管理工具。这对于初学者来说更直接,更容易入门。
  2. 了解基础:直接安装Python能让新手更好地理解Python环境的基本设置,例如如何配置环境变量,如何使用pip进行包管理等。这些是Python编程的基本技能。
  3. 避免资源消耗:Anaconda是一个较大的发行版,包含了许多不一定立即需要的预安装包。对于有限的系统资源或希望避免不必要的复杂性的新手,直接安装Python会更加轻量。
  4. 控制安装包:直接使用Python和pip,用户可以更灵活地控制所安装的包和版本。这对于学习如何管理Python依赖和理解不同库的兼容性很有帮助。
  5. 减少依赖冲突:使用官方Python安装,可以减少由于复杂环境导致的依赖冲突问题。新手在学习初期可能不需要复杂的环境管理,因此直接安装Python可以降低这方面的问题。
  6. 标准化学习材料:许多教程和学习材料都是基于Python官方安装来编写的,直接使用官方版本可以确保与这些教程的一致性。
  7. 体验Python生态:通过直接安装Python,新手可以更直接地体验和了解Python的生态系统,包括各种第三方库和工具。

当然,这并不是说Anaconda没有其优势,特别是在科学计算和数据分析领域,Anaconda提供了许多便利。然而,对于刚开始学习Python的新手来说,直接从基础开始学习往往能提供更坚实的基础。随着学习的深入,用户可以根据需要选择更高级的工具和环境。

python官网

1)Windows安装Python
  1. 下载Python:
    • 访问 Python官网[8]。
    • 选择适合Windows的Python版本进行下载(通常会自动推荐最新版本)。
  2. 安装Python:
    • 打开下载的安装程序。
    • 重要:在安装过程开始时,确保选中“Add Python to PATH”选项,然后点击“Install Now”。
  3. 验证安装:
    • 打开命令提示符(CMD)。
    • 输入 python --version 并按回车。如果安装成功,将显示Python的版本信息。
2)macOS安装Python
  1. 下载Python:
    • 访问 Python官网[9]。
    • 选择适合macOS的Python版本进行下载。
  2. 安装Python:
    • 打开下载的 .pkg 安装文件,然后遵循安装向导的指示完成安装。
  3. 验证安装:
    • 打开终端(Terminal)。
    • 输入 python3 --version 并按回车。如果安装成功,将显示Python的版本信息。

5.安装依赖

pip是Python的包管理工具,用于安装和管理Python包。以下是使用pip安装依赖的基本步骤:

1)确保安装了pip

大多数现代Python安装都自带pip。要检查pip是否已安装,可以在命令行或终端中运行以下命令:

代码语言:javascript
复制
pip --version

如果pip已安装,该命令将显示pip的版本信息。如果没有安装pip,您需要先安装它。安装方法依赖于您的操作系统,通常在Python官网上有详细的安装指南。

2)使用pip安装包

要使用pip安装一个Python包,可以在命令行或终端中使用以下命令格式:

代码语言:javascript
复制
pip install <package_name>

本次环境需要使用以下命令:

代码语言:javascript
复制
pip install pandas requests pymongo jupyterlab -i https://pypi.tuna.tsinghua.edu.cn/simple

简要说明:

  • pandas: 一个强大的数据分析和处理库。
  • requests: 用于发送HTTP请求的库,非常适合与API交互。
  • pymongo: 用于在Python中操作MongoDB数据库的库。
  • jupyterlab: 一个交互式的开发环境,特别适合数据科学和可视化。
  • -i https://pypi.tuna.tsinghua.edu.cn/simple 这部分指定了一个自定义的包索引源,即清华大学提供的PyPI镜像。这个镜像源在中国大陆访问速度更快,有助于解决由于网络问题导致的慢速或失败的包安装问题。

6.准备代码

我们新建一个文件夹,比如就叫shenzhen_data,然后新建一个文本文件,重命名为main.py,之后用记事本打开,复制以下代码:

代码语言:javascript
复制
"""
深圳共享单车数据研究——获取数据
数据名称:共享单车企业每日订单表
更新日期:2021-12-09    上架日期:2021-12-09
更新频率:不定期
数据量:244,638,540条
数据容量:1,957,108,320
浏览量:22,913次
调用量:18,669,737次
下载量:3,037次
开放方式:实名认证
开放数源单位:深圳市交通运输局
数据简介:共享单车企业每日订单表
重要提示:
1. 本数据集内使用的坐标系为bd09坐标系!
2. 储存到数据库的时间是UTC时间,需要转换为北京时间!
"""
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

修改此处并保存:

代码语言:javascript
复制
app_key =  "4137xxxxxxxxxxxxxxxx68d0d5" # <<<<<<<< 填写从深圳开放数据平台申请的app_key

7.运行

定位到代码所在文件夹:

代码语言:javascript
复制
cd /path/to/shenzhen_data

运行Python:

代码语言:javascript
复制
python main.py

查看输出,如下图所示则成功运行

7.查看数据

打开Mongodb compass,点击connect,连接到本地数据库:

Mongodb compass连接数据库

查看数据

如上图显示有订单表则成功了,可以刷新显示Documents(数据量)一直在增长,获取点击《深圳共享单车企业每日订单表》查看数据详情:

集合详情

8.读取某一天的数据

代码语言:javascript
复制
import pandas as pd
from datetime import datetime, timedelta, timezone
from pymongo import MongoClient

# MongoDB 连接
mongo_url = "mongodb://localhost:27017/" # os.environ.get("MONGO_URL")
client = MongoClient(mongo_url)
db = client['交通类大数据']
collection = db['深圳共享单车企业每日订单表']

# 将查询时间调整为 UTC 时间 提高查询效率
# (北京时间比UTC时间快8小时)获取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()

df

重要提示:

  1. 本数据集内使用的坐标系为bd09坐标系!
  2. 储存到数据库的时间是UTC时间,需要转换为北京时间!

文章写得比较匆忙,此文章后续会在我的博客[10]更新,可以点击阅读原文[11]访问。

如果你对本文章有什么意见、对如何制作文中的图表感兴趣、或者有其它任何问题建议在本文的博客评论区留言,说不定你的问题别人也遇到了。

  • 我的博客[12]
  • 我的GITHUB[13]
  • 我的GITEE[14]
  • 微信公众号: renhai-lab
  • 我的知乎[15]
  • RSS[16]

参考资料

[1]

深圳市共享单车数据分析【文末附共享单车数据集清单】: https://blog.renhai-lab.tech/archives/共享单车数据分析

[2]

深圳共享单车企业每日订单表”: https://opendata.sz.gov.cn/data/dataSet/toDataDetails/29200_00403627

[3]

深圳市政府数据开放平台: https://opendata.sz.gov.cn/

[4]

👉网站:https://opendata.sz.gov.cn/data/api/toApiDetails/29200_00403627: https://opendata.sz.gov.cn/data/api/toApiDetails/29200_00403627

[5]

在Windows上安装: https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-windows/#std-label-install-mdb-community-windows

[6]

在macOS上安装: https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-os-x/#std-label-install-mdb-community-macos

[7]

其他平台: https://www.mongodb.com/docs/manual/installation/

[8]

Python官网: https://www.python.org/downloads/

[9]

Python官网: https://www.python.org/downloads/

[10]

我的博客: https://blog.renhai-lab.tech/

[11]

阅读原文: https://blog.renhai-lab.tech/archives/深圳共享单车数据获取教程

[12]

我的博客: https://blog.renhai-lab.tech/

[13]

我的GITHUB: https://github.com/renhai-lab

[14]

我的GITEE: https://gitee.com/renhai-lab

[15]

我的知乎: https://www.zhihu.com/people/Ing_ideas

[16]

RSS: https://blog.renhai-lab.tech/rss.xml

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-12-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 renhailab 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.数据集介绍
  • 2.获取方式
    • 1)直接下载
      • 2)调用API接口
      • 3.配置数据库
      • 4.配置python环境
        • 1)Windows安装Python
          • 2)macOS安装Python
          • 5.安装依赖
            • 1)确保安装了pip
              • 2)使用pip安装包
              • 6.准备代码
              • 7.查看数据
              相关产品与服务
              数据库
              云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档