前言

本笔记介绍了如何使用 Python、pandas 和 SciPy 对天气数据进行基本分析。 它不包含对气象科学的贡献,但说明了如何生成简单的图和基本模型来拟合一些真实的物理观测。

一、相关库引入

import numpy
import scipy.stats
import pandas
import matplotlib.pyplot as plt
plt.style.use("bmh")

让我们使用 pandas 库从 wunderground.com 网站下载并导入一些关于 2013 年图卢兹机场(官方代号为“LFBO”)天气状况的数据。 (为方便起见,因为访问历史数据需要创建一个帐户,所以我们下载了 2013 年的数据,稍微清理了一下,然后上传到 risk-engineering.org 网站。)然后我们看前几行 数据,使用 pandas 数据框的 head 方法。

(1)数据读取

data = pandas.read_csv("https://risk-engineering.org/static/data/TLS-weather-data-2013.csv")
data.head()

(2)数据查看

数据框的列字段提供对列名称的访问。

二、数据一致性检查

对您的数据进行一些检查是一种很好的做法,以确保您了解列的编码方式并检查内容是否合理。 在 Python 中编写此类检查的一种简单方法是使用 assert 函数编写一些断言。 如果断言失败,Python 将打印错误。

我们可以检查我们拥有数据的天数是否是一年中合理的天数。 我们可以检查每天记录的最高温度是否大于当天的平均值和最低温度,记录的风速也是如此。 我们还可以检查所有风速是否为正。

assert(0 < len(data) <= 365)
for index, day in data.iterrows():assert(day["Max TemperatureC"] >= day["Mean TemperatureC"] >= day["Min TemperatureC"])assert(day["Max Wind SpeedKm/h"] >= day["Mean Wind SpeedKm/h"] >= 0)assert(360 >= day["WindDirDegrees"] >= 0)

(1)2013年测得的最低温度查看

def FahrenheitToCelsius(F): return (F - 32) * 5 / 9.0
# as a basic test, check that our Fahrenheit and Celsius scales intersect at -40
FahrenheitToCelsius(-40)
data["Min TemperatureC"].min()

(2)年中的日平均气温是如何变化查看

plt.plot(data["Mean TemperatureC"])
plt.ylabel("Mean daily temperature (°C)");

三、检查随机变量之间的相关性

1 检查各种测量值之间的相关性,例如温度、压力、风速和能见度。

(1)最大温度

plt.scatter(data["Max TemperatureC"], data["Mean Sea Level PressurehPa"])
scipy.stats.pearsonr(data["Max TemperatureC"], data["Mean Sea Level PressurehPa"])

(2)平均温度

plt.scatter(data["Mean TemperatureC"], data["Mean Sea Level PressurehPa"]);
scipy.stats.pearsonr(data["Mean TemperatureC"], data["Mean Sea Level PressurehPa"])

(3)平均能见度

plt.scatter(data["Mean VisibilityKm"], data["Mean Sea Level PressurehPa"])
scipy.stats.pearsonr(data["Mean VisibilityKm"], data["Mean Sea Level PressurehPa"])

2. 检测湿度与温度相关性

露点是空气中水的饱和温度(水蒸气凝结的温度)。 它与温度和湿度水平相关。

data.plot(x="Mean TemperatureC", y="Dew PointC", kind="scatter")
scipy.stats.pearsonr(data["Mean TemperatureC"], data["Dew PointC"])

如果使用概率模型生成用于某些风险计算的天气样本,那么样本尊重输入变量之间的相关性很重要。 否则,可能会在不可能的输入天气变量组合上运行风险模型,而结果将是不切实际的。

三、将概率分布拟合到数据

SciPy 具有允许“拟合”数据的概率分布的功能。 它将计算数据最匹配的分布参数(最低级别的错误)。 首先尝试使用正态分布生成的一些数据。

(1)模拟数据测试

# here we generate some fake "observations"
obs = scipy.stats.norm(loc=10, scale=2).rvs(1000)
scipy.stats.norm.fit(obs)

它告诉我们,根据我们的数据,正态分布的最佳参数是平均值 9.92 和标准差 2.04(实际上,每次运行此笔记本时这些数字都会改变)。 事实上,这非常接近原始参数。 我们可以将我们的“拟合”法线与数据直方图叠加,以直观地检查拟合。

mu, sigma = scipy.stats.norm.fit(obs)
fitted = scipy.stats.norm(mu, sigma)
plt.hist(obs, bins=30, density=True, alpha=0.5);
x = numpy.linspace(obs.min(), obs.max(), 100)
plt.plot(x, fitted.pdf(x), lw=3);

上图可以看出拟合的很好。

(2)气象数据拟合

让我们对图卢兹机场的风速数据进行相同的操作。 一些文献研究表明风速不是正态分布的; 一般服从对数正态分布或威布尔分布。 让我们从尝试拟合对数正态分布(SciPy 中的 scipy.stats.lognorm)开始。

wind = data["Mean Wind SpeedKm/h"]
shape, loc, scale = scipy.stats.lognorm.fit(wind, floc=0)
fitted = scipy.stats.lognorm(shape, loc, scale)
plt.hist(wind, density=True, alpha=0.5)
support = numpy.linspace(wind.min(), wind.max(), 100)
plt.plot(support, fitted.pdf(support), "r-", lw=3)
plt.title("TLS wind speed in 2013", weight="bold")
plt.xlabel("Mean wind speed (km/h)");

我们使用概率图来直观地检查拟合分布与数据的拟合程度。 这显示了根据理论分布的分位数绘制的样本分位数。 检查它如何适合概率图的边缘(在分布的尾部)尤为重要。 我们首先检查正态分布,发现它不太适合低风速。

wind = data["Mean Wind SpeedKm/h"]
mu, sigma = scipy.stats.norm.fit(wind)
fitted = scipy.stats.norm(mu, sigma)
scipy.stats.probplot(wind, dist=fitted, plot=plt.figure().add_subplot(111))
plt.title("Normal probability plot of TLS wind speed", weight="bold")
# also run a Kolmogorov-Smirnov test to measure goodness of fit
scipy.stats.kstest(wind, "norm")

拟合度还不错,除了分布的尾部(低风速和高风速)。 然后我们检查对数正态分布,发现它更适合低风速,而不太适合高风速。

fitted = scipy.stats.lognorm(shape, loc, scale)
scipy.stats.probplot(wind, dist=fitted, plot=plt.figure().add_subplot(111))
plt.title("Lognormal probability plot of TLS wind speed", weight="bold")
scipy.stats.kstest(wind, "lognorm", (shape,loc,scale))

最后,我们检查 Weibull 分布。

p0, p1, p2 = scipy.stats.weibull_min.fit(wind, floc=0)
fitted = scipy.stats.weibull_min(p0, p1, p2)
plt.hist(wind, density=True, alpha=0.5)
plt.plot(support, fitted.pdf(support), "r-", lw=2)
plt.title("Wind speed in TLS in 2013, with Weibull fit", weight="bold")
plt.xlabel("Mean wind speed (km/h)");
scipy.stats.probplot(wind, dist=fitted, plot=plt.figure().add_subplot(111))
plt.title("Weibull probability plot for TLS wind speed", weight="bold")
scipy.stats.kstest(wind, "weibull_min", args=(p0, p1, p2))

四、结论

与对数正态分布相比,Kolmogorov-Smirnov 距离统计对于 Weibull 分布的效果略差。 分位数-分位数图表明,除了一个极值点(可能是异常值)外,它在最高观测风速下更符合观测结果。 如果我们将我们的模型用于优化目的,围绕最常见的风速,我们将选择 Weibull 分布。 如果我们使用模型是为了安全,最高风速是最危险的,我们会改用对数正态图,因为它可以更好地预测观察到的最高风速。

基于Python分析气象数据教程-1相关推荐

  1. python sci数据_scanpy学习笔记:用Python分析单细胞数据

    Scanpy 是一个基于 Python 分析单细胞数据的软件包,内容包括预处理,可视化,聚类,拟时序分析和差异表达分析等.本文翻译自 scanpy 的官方教程 Preprocessing and cl ...

  2. 基于python的电影数据可视化分析与推荐系统

    温馨提示:文末有 CSDN 平台官方提供的博主 Wechat / QQ 名片 :) 1. 项目简介 本项目利用网络爬虫技术从国外某电影网站和国内某电影评论网站采集电影数据,并对电影数据进行可视化分析, ...

  3. python大数据分析实例-如何用Python分析大数据(以Twitter数据挖掘为例)

    原标题:如何用Python分析大数据(以Twitter数据挖掘为例) 来源:艾翻译(http://www.itran.cc/) 原文标题:Twitter Data Mining: A Guide to ...

  4. python气象数据分析_基于Python的气象观测数据的解析与存储

    基于 Python 的气象观测数据的解析与存储 师利霞, 黄元媛 [摘 要] 为了达到"一次解析,各处使用"的目的,根据工作的实际需要,使 用 Python 技术对以文本格式存放的 ...

  5. 酷狗音乐的爬取,基于python,从无到有完整教程-上:搭建环境及爬取原理讲解

    酷狗音乐的爬取,基于python,从无到有完整教程,使用微软新edge作为虚拟浏览器 搭建环境及爬取原理讲解 ⬇⬇⬇ 编码环境及工具准备: 编码工具:PyCharm 所需的库: import requ ...

  6. [学习笔记]黑马程序员Spark全套视频教程,4天spark3.2快速入门到精通,基于Python语言的spark教程

    文章目录 视频资料: 思维导图 一.Spark基础入门(环境搭建.入门概念) 第二章:Spark环境搭建-Local 2.1 课程服务器环境 2.2 Local模式基本原理 2.3 安装包下载 2.4 ...

  7. 零基础小白如何使用Python分析调查数据

    进行调查和民意调查是收集数据和深入了解诸如客户为何离开我们网站等问题的最佳方法之一.还是为什么选民会吸引这位候选人?但是分析调查数据可能是一个真正的挑战! 在本教程中,我们将逐步介绍如何使用Pytho ...

  8. 基于Python分析深圳程序员工资有多高?

    基于Python分析深圳程序员工资有多高? 概述 前言 统计结果 爬虫技术分析 爬虫代码实现 爬虫分析实现 后记 前言 多图预警.多图预警.多图预警.校招季,毕业也多,跳槽也多.我们的职业发展还是要顺 ...

  9. 大数据如何使用Python分析微信数据

    截至2020年第二季度,微信拥有超过27亿活跃用户.这意味着,如果你正在阅读大数据如何使用Python分析微信数据,那么你很可能是微信用户.但是,你到底有多少微信用户?你实际发布了多少?我们可以使用P ...

最新文章

  1. OpenCV for Ios 学习笔记(4)-标记检测1
  2. 基于python的界面自动化测试-基于Selenium+Python的web自动化测试框架
  3. 从方法到实践!深度解读:企业数据治理到底治什么?怎么治?
  4. [Python人工智能] 十三.如何评价神经网络、loss曲线图绘制、图像分类案例的F值计算
  5. RPC 技术及其框架 Sekiro 在爬虫逆向中的应用,加密数据一把梭
  6. 分布式任务调度平台一站式讲解
  7. 信安教程第二版-第14章恶意代码防范技术原理
  8. java 类继承命名_Java 语言的类间的继承关系是( )。_学小易找答案
  9. 自注意力机制_自注意力机制在计算机视觉中的应用【附PPT与视频资料】
  10. EMNLP21' | 细粒度情感分析新突破 —— 通过有监督对比学习方法学习隐式情感...
  11. 【快速高斯模糊的实现】
  12. (附源码)计算机毕业设计ssm房屋中介管理信息系统
  13. 小程序{errcode:40029,errmsg:invalid code, hints: [ req_id: 8H_oSa0564ns12 ]}
  14. 艾永亮:疯传的秘密,一个手表如何一夜之间席卷全校?(下)
  15. 时光飞逝,思考,实践,伴我一生的经验
  16. Ubuntu 18.04 与 Win10 双系统
  17. app毕业设计 基于uni-app框架商城app、图书商城app毕设题目课题选题作品(2)后台管理功能
  18. apktool反编译及后续打包
  19. 电阻(4)之上拉电阻与下拉电阻详解
  20. 当技术为组织所累时怎么办?将你的组织架构旋转90度!

热门文章

  1. Gvim gf跳转、回退、分屏
  2. PAT-BASIC1062——最简分数
  3. Array some() 用法
  4. 大数据培训技术 Cube和Cuboid
  5. 【邢不行|量化小讲堂系列44-实战篇】历年排名前10的基金,在第2年表现如何?Python告诉你答案
  6. Ubuntu磁盘空间不足解决
  7. UR5 Gazebo仿真配置(不使用MoveIt)
  8. libsvm for matlab安装与测试
  9. Yes yes yes yes yes yes
  10. 阿里mns超大消息传输