Python期末大作业——获取北上广深历史天气并做数据可视化

news2024/11/15 15:27:52

前言

嗨喽,大家好呀~这里是爱看美女的茜茜呐

知识点:

  • 动态数据抓包

  • requests发送请求

  • 结构化+非结构化数据解析

一、开发环境:

所使用软件工具:

  • python 3.8 运行代码

  • pycharm 2022.3.2 辅助敲代码 专业版

需安装第三方模块:

  • requests 发送请求 pip install requests

  • parsel 解析数据 pip install parsel

第三方模块安装:

  1. win + R 输入 cmd 点击确定, 输入安装命令 pip install 模块名 (pip install requests) 回车

  2. 在pycharm中点击Terminal(终端) 输入安装命令

如果出现爆红, 可能是因为 网络连接超时, 可切换国内镜像源,命令如下:

pip install -i https://pypi.doubanio.com/simple/ requests

python资料、源码、教程\福利皆: 点击此处跳转文末名片获取

二、获取数据

导入模块

import requests     # 发送请求要用的模块 需要额外安装的
import parsel
import csv
f = open('天气.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.writer(f)
csv_writer.writerow(['日期', '最高温度', '最低温度', '天气', '风向', '城市'])
city_list = [54511, 58362, 59287, 59493]
for city in city_list:
    city_name = ''
    if city == 54511:
        city_name = '北京'
    elif city == 58362:
        city_name = '上海'
    elif city == 59287:
        city_name = '广州'
    elif city == 59493:
        city_name = '深圳'
    for year in range(2013, 2023):
        for month in range(1, 13):
        完整源码、解答、教程皆+VX:pytho8987获取,验证备注“777”
            url = f'https://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D={city}&areaInfo%5BareaType%5D=2&date%5Byear%5D={year}&date%5Bmonth%5D={month}'
  1. 发送请求
            response = requests.get(url=url)
  1. 获取数据
            html_data = response.json()['data']
  1. 解析数据
            select = parsel.Selector(html_data)
            trs = select.css('.history-table tr')   # 拿到31个tr
            for tr in trs[1:]:                      # 第一个表头不要
                tds = tr.css('td::text').getall()   # 针对每个tr进行提取 取出所有的td里面的内容
                tds.append(city_name)               # 把城市追加到列表里面
                print(tds)
  1. 保存数据
                csv_writer.writerow(tds)

数据可视化

导入包

import pandas as pd
import datetime
from pyecharts import options as opts
from pyecharts.charts import *
from pyecharts.commons.utils import JsCode

读入数据

data = pd.read_csv('天气.csv')
data

数据预览

data.sample(5)

data.info()

分割日期/星期

data[['日期','星期']] = data['日期'].str.split(' ',expand=True,n=1)

data

去除多余字符

data[['最高温度','最低温度']] = data[['最高温度','最低温度']].apply(lambda x: x.str.replace('°','').replace('', '0'))
data.head()

计算下雪天气

data.loc[data['天气'].str.contains('雪'),'下雪吗']='是'
data.fillna('否',inplace=True)

分割日期时间

data['日期'] = pd.to_datetime(data['日期'])
data[['最高温度','最低温度']] = data[['最高温度','最低温度']].astype('int')
data['年份'] = data['日期'].dt.year
完整源码、解答、教程皆+VX:pytho8987获取,验证备注“777”
data['月份'] = data['日期'].dt.month
data['日'] = data['日期'].dt.day
# 预览
data.sample(5)

各城市初雪的时间

s_data = data[data['下雪吗']=='是']
s_data[(s_data['月份']>=9)].groupby('年份').first().reset_index()

各城市下雪天气分布

s_data.groupby(['城市','年份'])['日期'].count().to_frame('下雪天数').reset_index()

做透视表

data_bj = data[(data['年份'] == 2021) & (data['城市'] == '北京')]
data_bj = data_bj.groupby(['月份','天气'], as_index=False)['日期'].count()
data_pivot =  pd.pivot(data_bj,
                values='日期',
                index='月份',
                columns='天气')
data_pivot = data_pivot.astype('float')
# 按照 索引年月倒序排序
data_pivot.sort_index(ascending=False,inplace=True)

data_pivot

北上广深2021年10月份天气热力图分布

import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import seaborn as sns

#设置全局默认字体 为 雅黑
plt.rcParams['font.family'] = ['Microsoft YaHei'] 
# 设置全局轴标签字典大小
plt.rcParams["axes.labelsize"] = 14  
# 设置背景
sns.set_style("darkgrid",{"font.family":['Microsoft YaHei', 'SimHei']})  
# 设置画布长宽 和 dpi
plt.figure(figsize=(18,8),dpi=100)
# 自定义色卡
cmap = mcolors.LinearSegmentedColormap.from_list("n",['#95B359','#D3CF63','#E0991D','#D96161','#A257D0','#7B1216']) 
# 绘制热力图

ax = sns.heatmap(data_pivot, cmap=cmap, vmax=30, 
                 annot=True, # 热力图上显示数值
                 linewidths=0.5,
                ) 
# 将x轴刻度放在最上面
ax.xaxis.set_ticks_position('top') 
plt.title('北京最近10个月天气分布',fontsize=16) #图片标题文本和字体大小
plt.show()

data_gz= data[(data['年份'] == 2021) & (data['城市'] == '广州')]
data_gz = data_gz.groupby(['月份','天气'], as_index=False)['日期'].count()
data_sz= data[(data['年份'] == 2021) & (data['城市'] == '深圳')]
完整源码、解答、教程皆+VX:pytho8987获取,验证备注“777”
data_sz = data_sz.groupby(['月份','天气'], as_index=False)['日期'].count()
data_sh= data[(data['年份'] == 2021) & (data['城市'] == '上海')]
data_sh = data_sh.groupby(['月份','天气'], as_index=False)['日期'].count()

data_pivot_gz =  pd.pivot(data_gz,
                values='日期',
                index='月份',
                columns='天气')
data_pivot_gz = data_pivot_gz.astype('float')
# 按照 索引年月倒序排序
data_pivot_gz.sort_index(ascending=False,inplace=True)

#设置全局默认字体 为 雅黑
plt.rcParams['font.family'] = ['Microsoft YaHei'] 
# 设置全局轴标签字典大小
plt.rcParams["axes.labelsize"] = 14  
# 设置背景
sns.set_style("darkgrid",{"font.family":['Microsoft YaHei', 'SimHei']})  
# 设置画布长宽 和 dpi
plt.figure(figsize=(18,8),dpi=100)
# 自定义色卡
cmap = mcolors.LinearSegmentedColormap.from_list("n",['#95B359','#D3CF63','#E0991D','#D96161','#A257D0','#7B1216']) 
# 绘制热力图

ax_sz = sns.heatmap(data_pivot_gz, cmap=cmap, vmax=31, 
                 annot=True, # 热力图上显示数值
                 linewidths=0.5,
                ) 
# 将x轴刻度放在最上面
ax_sz.xaxis.set_ticks_position('top') 
plt.title('广州最近10个月天气分布',fontsize=16) #图片标题文本和字体大小
plt.show()

data_pivot_sh =  pd.pivot(data_sh,
                values='日期',
                index='月份',
                columns='天气')
data_pivot_sh = data_pivot_sh.astype('float')
# 按照 索引年月倒序排序
data_pivot_sh.sort_index(ascending=False,inplace=True)

#设置全局默认字体 为 雅黑
plt.rcParams['font.family'] = ['Microsoft YaHei'] 
# 设置全局轴标签字典大小
plt.rcParams["axes.labelsize"] = 14  
# 设置背景
sns.set_style("darkgrid",{"font.family":['Microsoft YaHei', 'SimHei']})  
# 设置画布长宽 和 dpi
完整源码、解答、教程皆+VX:pytho8987获取,验证备注“777”
plt.figure(figsize=(18,8),dpi=100)
# 自定义色卡
cmap = mcolors.LinearSegmentedColormap.from_list("n",['#95B359','#D3CF63','#E0991D','#D96161','#A257D0','#7B1216']) 
# 绘制热力图

ax_sz = sns.heatmap(data_pivot_sh, cmap=cmap, vmax=31, 
                 annot=True, # 热力图上显示数值
                 linewidths=0.5,
                ) 
# 将x轴刻度放在最上面
ax_sz.xaxis.set_ticks_position('top') 
plt.title('上海最近10个月天气分布',fontsize=16) #图片标题文本和字体大小
plt.show()

尾语

感谢你观看我的文章呐~本次航班到这里就结束啦 🛬

希望本篇文章有对你带来帮助 🎉,有学习到一点知识~

躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。

最后,宣传一下呀~👇👇👇更多源码、资料、素材、解答、交流皆点击下方名片获取呀👇👇

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

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

相关文章

Spring AOP 快速入门

文章目录 一. 什么是Spring AOP二. 为什么要学习Spring AOP三. 学习 Spring AOP3.1 AOP 的组成3.1.1 切面 (Aspect)3.1.2 切点 (Pointcut)3.1.3 通知 (advice)3.1.4 连接点(Joinpoint) 3.2 实现 Spring AOP1. 添加 Spring Boot 的 AOP 框架2. 创建切面3. 创建切点4. 创建通知5.…

vue3自定义指令——元素平滑移动

vue提供一个用户可以高度自定义的指令入口directives 利用这个入口我们实现一个常见的元素平滑移动的自定义指令 ‘sl’ 首先我们结合指令创建一个多元素的界面: 这个场景我们在很多网站,商城都有见过,特别对于移动端的清单类界面 我们的终极…

Linux如何找回root密码

Linux如何找回root密码 首先,启动系统,进入开机界面,在界面中按“e”进入编辑界面。如图 进入编辑界面,使用键盘上的上下键把光标往下移动,找到以““Linux16”开头内容所在的行数”,在行的最后面输入&…

【几分醉意赠书活动 - 03期】 | 《Python系列丛书》

个人主页: 几分醉意的CSDN博客主页_传送门 个人主页: 陈老板的CSDN博客主页_传送门 赠书活动 | 第三期 本期好书推荐:《Python系列丛书》 粉丝福利:书籍赠送:共计送出30本 参与方式:关注公众号:…

IP-GUARD是否支持对打了水印的文档去除水印?

是否支持对打了水印的文档去除水印? 支持,从4.64.1005.0版本开始,支持对打了文档水印的文档做去水印的操作,但只是支持去除非图片类型的显式水印。支持右键文件去除、申请去除、自我备案去除三种方式。 例如: 对客户端…

短视频电商平台的流量货币化率

通过对内容社区的流量规模流量货币化率的估算,可以得出对应的商业化即变现能力,如电商GMV,广告收入规模。 货币化率 Take Rate 货币化率(Take Rate,TR)是电商平台报表指标而非业务指标,是广告收…

一步到位Python Django部署,浅谈Python Django框架

Django是一个使用Python开发的Web应用程序框架,它遵循MVC(Model-View-Controller)设计模式,旨在帮助开发人员更快、更轻松地构建和维护高质量的Web应用程序。Django提供了强大的基础设施和工具,以便于处理复杂的业务逻…

【Eclipse】Eclipse的下载与安装

一.下载 下载地址:https://www.eclipse.org/downloads/packages/ 根据自己电脑的操作系统下载对应的版本 二.安装 解压到你想存放的路径上 设置该路径作为项目/代码存放的默认路径 \

修改knative func build的image

问题描述 基于func create创建的function的source code,并基于build创建出function对应的image。我们需在该image内创建安装iperf3。 解决步骤及遇到的errors 1. 查看本地的image,并运行该image podman images docker run -it -u root -p 10001:22 $…

Stream流 - 取最大对象、最小对象

需求:Dnl 对象包含属性 ygz(有功总)、wgz(无功总),统计 Dnl 对象集合的最大有功总、最小有功总的对象。 集合: 对象1:ygz11.1、wgz22.2 对象2:ygz22.1、wgz66.2 对象3&a…

2023网络安全面试题汇总(附答案)

大家好,我是小V ,本人 17 年就读于一所普通的本科学校,20 年 6 月在三年经验的时候顺利通过校招实习面试进入大厂,现就职于某大厂安全联合实验室。 又到了毕业季,大四的漂亮学姐即将下架,大一的小学妹还在来的路上&…

网络安全入门教程(非常详细)从零基础入门到精通,看完这一篇就够了

朋友们如果有需要全套《黑客&网络安全入门&进阶学习包》,可以👇下方自取(如遇问题,可以在评论区留言哦)~ 👇👇👇 《黑客&网络安全入门&进阶学习包》 👆&…

STM32F407硬件I2C实现MPU6050通讯(CUBEIDE)

STM32F407硬件I2C实现MPU6050通讯 文章目录 STM32F407硬件I2C实现MPU6050通讯cubeide设置写操作与读操作函数实现复位,读取温度,角度等函数封装mpu6050.cmpu6050.h代码分析 DMP移植1.修改头文件路径为自己的头文件路径2.修改I2C读写函数为自己mcu平台的读…

6.12黄金何时走出区间震荡?后市如何布局

近期有哪些消息面影响黄金走势?下周黄金多空该如何研判? ​黄金消息面解析:周一(6月12日)亚市盘中,现货黄金维持震荡,金价现报1960美元/盎司。本周黄金交易员将迎来美国CPI数据以及美联储利率决议,预计将对…

vue3+ts+vite实现pinia

本篇文章主要从事3部分 单个store下的文件进行使用模块下进行使用(pinia不像vuex那样使用模块化了 直接在store下定义ts文件即可)pinia持久化使用 安装pinia : cnpm install pinia 安装持久化 cnpm install pinia-plugin-persistedstate 1.单文件: index.ts (先不要管user.ts)…

详细讲解!如何模拟后台API调用场景

目录 简介 Postman 迁移至 ApiFox ApiFox 导入 Postman ApiFox 展示 API 调用场景 增加断言验证 API 使用测试执行场景 API 序列 总结 简介 在进行Web性能测试时,我们不仅需要测试前端页面的性能,还需要测试与后台API的交互性能,以及…

Spring Cloud常用组件介绍(Netflix、Alibaba)

Spring Cloud常用组件介绍 文章目录 **Spring Cloud常用组件介绍**一、说明**1.1.什么是Spring Cloud**1.2.Spring Cloud的组件选型 **二、组件介绍****2.1.服务注册与发现****2.1.1.Netflix Eureka****1)分布式模型****2)主要组件****3)工作…

骑行陡坡村,潇潇洒洒出品

2023年6月10日群峰环抱小村庄盘山陡坡蜜桃香唇干舌燥咬一口甘甜香沁嘴边淌久旱叶枯悯农急乌云密布盼雷响但得雷神甘露下雨中狂奔又何妨

高效搞定文件重命名和归类!使用文件批量改名高手轻松实现

文件夹管理是计算机使用中非常重要的一项任务,对于个人电脑用户或企业机构来说,都需要对文件夹进行有效管理归类和重命名。 第一步,打开文件批量改名高手,进入文件批量重命名板块并点击添加文件,选择需要重命名的文件…

IOS应用跳转URL scheme和Universal Links

简介 IOS常见的跳转方式有URL scheme和Universal Links。这两个均可以实现App之间的跳转,以及通过网页实现跳转到对应的App内。通过本文章可以了解到两者的区别和具体的使用方法,以及参数的传递。应对常见的几种跳转需求。 URL scheme:需要配置URL sch…