基于python的百度迁徙迁入、迁出数据分析(七)

news2024/9/24 23:21:36

参考:【Python】基于Python的百度迁徙2——迁徙规模指数(附代码)-CSDN博客

记录于2024年8月,这篇是获取百度迁徙指数,之前我们都在讨论不同城市的迁徙比例关系,这篇我们来获取百度迁徙指数这个数据,代码整体逻辑没变,简化了一下步骤,保存结果为.xlsx,另外把代码拆分成三部分,城市尺度、省份尺度、全国尺度,为了降低读者对这个函数migration_index(FileTittle,classname,direction,CodeDict)的理解成本,需要用哪个部分直接使用即可,但是这里还是解释一下,migration_index(文件夹名称,城市级别(city/province/country),迁徙方向(in/out),城市编码字典);

城市编码第一篇有说明,只需要新建一个.py的文件 文件名叫''ChineseAdminiDivisionsDict'',把城市编码复制进去即可,另外城市编码这个文件一定要和下面运行的这个.py在同一个目录下面,城市编码说明:

基于python的百度迁徙迁入、迁出数据分析(一)_百度迁徙数据怎么爬取-CSDN博客

完整代码#运行环境 Python 3.11(城市尺度版)

import requests  # 导入请求模块
import json  # 导入JSON解析模块
import time  # 导入时间模块
import xlsxwriter  # 导入Excel文件操作模块
from ChineseAdminiDivisionsDict import CitiesCode, ProvinceCode  # 导入中国行政区划字典


def write_header(worksheet, cities):
    worksheet.write(0, 0, '城市代码')  # 写入城市代码标题
    worksheet.write(0, 1, '城市')  # 写入城市名称标题

    cities_order = {}  # 存放城市序号的字典
    for idx, (city_name, code) in enumerate(cities.items(), start=1):
        worksheet.write(idx, 0, str(code))  # 写入城市代码
        worksheet.write(idx, 1, str(city_name))  # 写入城市名称
        cities_order[str(city_name)] = idx  # 记录城市序号
    return cities_order


def fetch_migration_data(url):
    try:
        response = requests.get(url, timeout=2)  # 发送HTTP请求
        time.sleep(3)  # 等待3秒以避免频繁访问
        raw_data = response.text[4:-1]  # 去除响应文本的首尾非数据字符
        data_dict = json.loads(raw_data)  # 解析JSON数据

        if data_dict['errmsg'] == 'SUCCESS':
            return data_dict['data']['list']  # 返回成功数据
        else:
            print('Error fetching data:', data_dict['errmsg'])  # 打印错误信息
            return None
    except Exception as e:
        print(f"An error occurred: {e}")  # 打印异常信息
        return None


def migration_index(file_title, class_name, direction, code_dict):
    direction_name = '迁入' if direction == 'in' else '迁出'  # 根据方向设置标题
    file_path = f'{file_title} {direction_name}规模指数.xlsx'

    workbook = xlsxwriter.Workbook(file_path)  # 创建Excel工作簿
    worksheet = workbook.add_worksheet('Sheet')  # 添加工作表

    cities_order = write_header(worksheet, code_dict)  # 写入头部信息并获取城市序号字典

    for area, code in code_dict.items():
        url = f'http://huiyan.baidu.com/migration/historycurve.jsonp?dt={class_name}&id={code}&type=move_{direction}'
        print(f'{area}: {url}')  # 输出正在处理的城市及URL

        data = fetch_migration_data(url)  # 获取迁移数据

        if data:
            counter_date = 2  # 用于记录日期的位置
            dates = sorted(data.keys())  # 排序日期

            for date in dates:
                index = data[date]  # 获取某天的迁移规模指数
                worksheet.write(0, counter_date, float(date))  # 写入日期
                worksheet.write(cities_order[str(area)], counter_date, float(index))  # 写入迁移规模指数
                counter_date += 1  # 移动到下一个日期列

    workbook.close()  # 关闭工作簿


if __name__ == "__main__":
    migration_index('城市', 'city', 'in', CitiesCode)  # 处理迁入数据
    migration_index('城市', 'city', 'out', CitiesCode)  # 处理迁出数据
    print('全部完成')  # 完成提示

输出结果展示:

完整代码#运行环境 Python 3.11(省份尺度版)

import requests  # 导入请求模块
import json  # 导入JSON解析模块
import time  # 导入时间模块
import xlsxwriter  # 导入Excel文件操作模块
from ChineseAdminiDivisionsDict import CitiesCode, ProvinceCode  # 导入中国行政区划字典


def write_header(worksheet, cities):
    worksheet.write(0, 0, '城市代码')  # 写入城市代码标题
    worksheet.write(0, 1, '城市')  # 写入城市名称标题

    cities_order = {}  # 存放城市序号的字典
    for idx, (city_name, code) in enumerate(cities.items(), start=1):
        worksheet.write(idx, 0, str(code))  # 写入城市代码
        worksheet.write(idx, 1, str(city_name))  # 写入城市名称
        cities_order[str(city_name)] = idx  # 记录城市序号
    return cities_order


def fetch_migration_data(url):
    try:
        response = requests.get(url, timeout=2)  # 发送HTTP请求
        time.sleep(3)  # 等待3秒以避免频繁访问
        raw_data = response.text[4:-1]  # 去除响应文本的首尾非数据字符
        data_dict = json.loads(raw_data)  # 解析JSON数据

        if data_dict['errmsg'] == 'SUCCESS':
            return data_dict['data']['list']  # 返回成功数据
        else:
            print('Error fetching data:', data_dict['errmsg'])  # 打印错误信息
            return None
    except Exception as e:
        print(f"An error occurred: {e}")  # 打印异常信息
        return None


def migration_index(file_title, class_name, direction, code_dict):
    direction_name = '迁入' if direction == 'in' else '迁出'  # 根据方向设置标题
    file_path = f'{file_title} {direction_name}规模指数.xlsx'

    workbook = xlsxwriter.Workbook(file_path)  # 创建Excel工作簿
    worksheet = workbook.add_worksheet('Sheet')  # 添加工作表

    cities_order = write_header(worksheet, code_dict)  # 写入头部信息并获取城市序号字典

    for area, code in code_dict.items():
        url = f'http://huiyan.baidu.com/migration/historycurve.jsonp?dt={class_name}&id={code}&type=move_{direction}'
        print(f'{area}: {url}')  # 输出正在处理的城市及URL

        data = fetch_migration_data(url)  # 获取迁移数据

        if data:
            counter_date = 2  # 用于记录日期的位置
            dates = sorted(data.keys())  # 排序日期

            for date in dates:
                index = data[date]  # 获取某天的迁移规模指数
                worksheet.write(0, counter_date, float(date))  # 写入日期
                worksheet.write(cities_order[str(area)], counter_date, float(index))  # 写入迁移规模指数
                counter_date += 1  # 移动到下一个日期列

    workbook.close()  # 关闭工作簿


if __name__ == "__main__":
    migration_index('省份', 'province', 'in', ProvinceCode)  # 处理迁入数据
    migration_index('省份', 'province', 'out', ProvinceCode)  # 处理迁出数据
    print('全部完成')  # 完成提示

输出结果展示:

完整代码#运行环境 Python 3.11(全国尺度版)

import requests  # 导入请求模块
import json  # 导入JSON解析模块
import time  # 导入时间模块
import xlsxwriter  # 导入Excel文件操作模块
from ChineseAdminiDivisionsDict import CitiesCode, ProvinceCode  # 导入中国行政区划字典


def write_header(worksheet, cities):
    worksheet.write(0, 0, '城市代码')  # 写入城市代码标题
    worksheet.write(0, 1, '城市')  # 写入城市名称标题

    cities_order = {}  # 存放城市序号的字典
    for idx, (city_name, code) in enumerate(cities.items(), start=1):
        worksheet.write(idx, 0, str(code))  # 写入城市代码
        worksheet.write(idx, 1, str(city_name))  # 写入城市名称
        cities_order[str(city_name)] = idx  # 记录城市序号
    return cities_order


def fetch_migration_data(url):
    try:
        response = requests.get(url, timeout=2)  # 发送HTTP请求
        time.sleep(3)  # 等待3秒以避免频繁访问
        raw_data = response.text[4:-1]  # 去除响应文本的首尾非数据字符
        data_dict = json.loads(raw_data)  # 解析JSON数据

        if data_dict['errmsg'] == 'SUCCESS':
            return data_dict['data']['list']  # 返回成功数据
        else:
            print('Error fetching data:', data_dict['errmsg'])  # 打印错误信息
            return None
    except Exception as e:
        print(f"An error occurred: {e}")  # 打印异常信息
        return None


def migration_index(file_title, class_name, direction, code_dict):
    direction_name = '迁入' if direction == 'in' else '迁出'  # 根据方向设置标题
    file_path = f'{file_title} {direction_name}规模指数.xlsx'

    workbook = xlsxwriter.Workbook(file_path)  # 创建Excel工作簿
    worksheet = workbook.add_worksheet('Sheet')  # 添加工作表

    cities_order = write_header(worksheet, code_dict)  # 写入头部信息并获取城市序号字典

    for area, code in code_dict.items():
        url = f'http://huiyan.baidu.com/migration/historycurve.jsonp?dt={class_name}&id={code}&type=move_{direction}'
        print(f'{area}: {url}')  # 输出正在处理的城市及URL

        data = fetch_migration_data(url)  # 获取迁移数据

        if data:
            counter_date = 2  # 用于记录日期的位置
            dates = sorted(data.keys())  # 排序日期

            for date in dates:
                index = data[date]  # 获取某天的迁移规模指数
                worksheet.write(0, counter_date, float(date))  # 写入日期
                worksheet.write(cities_order[str(area)], counter_date, float(index))  # 写入迁移规模指数
                counter_date += 1  # 移动到下一个日期列

    workbook.close()  # 关闭工作簿


QUANGUO = {'全国': 0}  # 全国编码

if __name__ == "__main__":
    migration_index('全国', 'country', 'in', QUANGUO)  # 处理全国迁入数据
    migration_index('全国', 'country', 'out', QUANGUO)  # 处理全国迁出数据
    print('全部完成')

输出结果展示:

三个尺度的版本都在这里了,需要哪个尺度的直接用即可,另外这个数据是获取的是百度迁徙数据库有的所有历史数据,数据范围(20190112, 20190309),(20230104, 20230506),(20240123, 20240807(也就是截止数据获取日期前一天));

文章仅用于分享个人学习成果与个人存档之用,分享知识,如有侵权,请联系作者进行删除。所有信息均基于作者的个人理解和经验,不代表任何官方立场或权威解读。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1993179.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大学新生入门编程的最佳路径:嵌入式领域的深入探索

对于大学新生来说,编程已成为一项必不可少的技能。面对众多编程语言和学习资源,新生们常常感到迷茫。如何选择适合自己的编程语言?如何制定有效的学习计划?如何避免常见的学习陷阱?本文将为你提供嵌入式领域的编程入门…

测试工具之JMeter

JMeter Apache JMeter应用程序是开源软件,是一个100%纯Java应用程序,旨在负载测试功能行为和衡量性能。它最初是为测试Web应用程序而设计的,但后来扩展到其他测试功能。 JMeter是一个免费、开源、跨平台的性能测试工具,于20世纪90年代后期面世。这是一个成熟、健全且具有…

开源一套金融大模型插件(ChatGPT)

shares vscode 插件A 股量化交易系统自研金融大模型,复利Chat 源码地址: https://github.com/xxjwxc/shares

NPDP考前怎么复习?NPDP200问PDF版来啦~

距离NPDP下半年考试还有4个月的时间,现在正是备考的黄金期。 以下复习建议~ 01.制定详细计划 首先,根据考试大纲,可以将内容划分为几个模块,如新产品开发流程、市场研究、产品规划等,并为每个模块设定学习目标和时间…

C语言 | Leetcode C语言题解之第328题奇偶链表

题目: 题解: struct ListNode* oddEvenList(struct ListNode* head) {if (head NULL) {return head;}struct ListNode* evenHead head->next;struct ListNode* odd head;struct ListNode* even evenHead;while (even ! NULL && even->…

`【《Spark SQL 深度探索:内置函数、数据源处理与自定义函数实践》】

前言: 💞💞大家好,我是书生♡,本阶段和大家一起分享和探索大数据技术Spark—SparkSQL,本篇文章主要讲述了:Spark SQL 深度探索:内置函数、数据源处理与自定义函数实践等等。欢迎大家…

Netty技术全解析:MessageToMessageCodec类深度解析

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

有序数组的平方(LeetCode)

题目 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 解题 以下算法时间复杂度为 def sortedSquares(nums):n len(nums)result [0] * n # 创建一个结果数组&#xff0c;长度与 nums 相同le…

【wiki知识库】08.添加用户登录功能--前端Vue部分修改

&#x1f34a; 编程有易不绕弯&#xff0c;成长之路不孤单&#xff01; 目录 &#x1f34a; 编程有易不绕弯&#xff0c;成长之路不孤单&#xff01; 一、今日目标 二、前端Vue模块的修改 2.1 the-header组件 2.2 store工具 2.3 router路由配置修改 一、今日目标 上篇文章…

河南萌新联赛2024第(四)场:河南理工大学

河南萌新联赛2024第&#xff08;四&#xff09;场&#xff1a;河南理工大学 2024.8.7 13:00————17:00 过题数5/12 补题数8/12 该出奇兵了 小雷的神奇电脑 岗位分配 简单的素数 AND 小雷的算式 循环字符串 聪明且狡猾的恶魔 马拉松 尖塔第四强的高手 比赛 抓字符 B - 小雷…

企业如何选择靠谱的第三方软件测试机构?

第三方软件测试机构是专门提供软件测试服务的第三方检测机构&#xff0c;旨在对软件的功能、性能、安全性等方面进行系统评估&#xff0c;确保其满足设定的标准和需求。这些机构通常拥有丰富的行业经验和专业资质&#xff0c;可以为企业提供包括项目验收测试、软件确认测试、安…

贪吃蛇之地图的绘制

首先我们要知道地图位置大体是怎么样的 绘出一个大概的地图 设置了2020的方格 源码在这里 #include<curses.h>void initNcurse() {initscr();keypad(stdscr,1); }void gamePic() {int hang;int lie;for(hang0;hang<20;hang){if(hang0){for(lie0;lie<20;lie){pr…

开通期权分仓账户需要多少资金?

在金融衍生品市场&#xff0c;期权分仓账户犹如一艘精巧的帆船&#xff0c;承载着投资者的智慧与梦想&#xff0c;驶向财富的彼岸。然而&#xff0c;每一艘帆船的启航&#xff0c;都需备足风帆与给养&#xff0c;即那开启航程所必需的资金之舟&#xff0c;下文为大家介绍开通期…

【C语言基础习题】C语言练习题——bite 寒假班作业(6)【未完成】

编程小白如何成为大神?大学新生的最佳入门攻略 编程已成为当代大学生的必备技能,但面对众多编程语言和学习资源,新生们常常感到迷茫。如何选择适合自己的编程语言?如何制定有效的学习计划?如何避免常见的学习陷阱?让我们一起探讨大学新生入门编程的最佳路径,为你的大学…

【进阶篇-Day14:JAVA中IO流之转换流、序列化流、打印流、Properties集合的介绍】

目录 1、转换流1.1 转换流分类&#xff1a;1.2 转换流的作用&#xff08;1&#xff09;按照指定的字符编码读写操作&#xff1a;&#xff08;2&#xff09;将字节流转换为字符流进行操作&#xff1a; 2、序列化流2.1 序列化的基本使用&#xff1a;2.2 序列化的操作流程&#xf…

《Token-Label Alignment for Vision Transformers》ICCV2023

摘要 这篇论文探讨了数据混合策略&#xff08;例如CutMix&#xff09;在提高卷积神经网络&#xff08;CNNs&#xff09;性能方面的有效性&#xff0c;并指出这些策略在视觉Transformer&#xff08;ViTs&#xff09;上同样有效。然而&#xff0c;发现了一个“token fluctuation…

mp3音频怎么压缩小一点?音频压缩的6个简单方法

在日常的数字生活中&#xff0c;MP3音频文件凭借其广泛的兼容性和相对较高的音质&#xff0c;已然成为了连接音乐创作者与听众之间不可或缺的桥梁。从个人音乐收藏到社交媒体分享&#xff0c;再到专业音频项目的交付&#xff0c;MP3格式以其便捷性占据了重要地位。然而&#xf…

MLP:全连接神经网络的并行执行

目录 MLP:全连接神经网络的并行执行 假设 代码解释 注意事项 MLP:全连接神经网络的并行执行 为了继续解释这段代码,我们需要做一些假设和补充,因为原始代码片段中DummyModel、Shard和mx.array的具体实现没有给出。不过,基于常见的编程模式和深度学习框架的惯例,我们…

【Linux网络】Linux网络初探:开启网络世界的大门

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 前言&#xff1a;我们已经系统的学习了Linux的基本操作、进程、线程、文件、通信等待&#xff0c;但是在如今社会没有网络通信方式是万万不行的&#xff0c;今天我们就走进网络中&#xff0c;系统的学习一下有关Linux网…

电脑外接设备管理软件有哪些(三款USB外设管理软件推荐)

“小张&#xff0c;你上次用U盘拷贝资料时&#xff0c;有没有担心过数据安全问题&#xff1f;” “是啊&#xff0c;李姐&#xff0c;我总感觉用U盘传文件不太放心&#xff0c;万一数据被误删或者泄露就麻烦了。” 正是这样的担忧&#xff0c;促使了电脑外接设备管理软件的出现…