我们使用Python研究俄罗斯城市的气候

在Python中,您可以使用数据并将其可视化。 不仅程序员可以利用这一点,科学家,生物学家,物理学家和社会学家也可以利用这一点。 今天,与shwars (我们的Python快速 入门课程的策展人)一起,我们将简短地转向气象学家并研究俄罗斯城市的气候。 在用于可视化和处理数据的库中,我们使用Pandas,Matplotlib和Bokeh。



我们对Azure笔记本 (基于云的Jupyther Notebook版本)进行研究。 因此,要开始使用Python,我们不需要在计算机上安装任何软件,并且可以直接在浏览器中工作。 您只需要使用Microsoft帐户登录,创建一个库和其中的新Python 3便携式计算机,然后就可以从本文中获取代码片段并进行实验!

我们得到数据


首先,我们导入所需的主要库。 Pandas是一个用于处理表格数据或所谓的数据框架的库,而pyplot将允许我们构建图形。

import pandas as pd import matplotlib.pyplot as plt 

可以在Internet上轻松找到源数据,但是我们已经以方便的CSV格式为您准备了数据。 CSV是一种文本格式,其中所有列均以逗号分隔。 因此,名称为-逗号分隔值。

熊猫可以从本地磁盘打开CSV文件,也可以直接从Internet打开。 数据本身位于我们在GitHub上存储库中 ,因此我们只需要指定正确的URL。

 data = pd.read_csv("https://raw.githubusercontent.com/shwars/PythonJump/master/Data/climat_russia_cities.csv") data 



重命名表列,以便更方便地按名称访问它们。 我们还需要将字符串转换为数值以便对其进行操作。 当我们尝试使用pd.to_numeric函数执行此操作时,我们发现发生了奇怪的错误。 这是由于在文本中使用了长破折号而不是减号。

 data.columns=["City","Lat","Long","TempMin","TempColdest","AvgAnnual","TempWarmest","AbsMax","Precipitation"] data["TempMin"] = pd.to_numeric(data["TempMin"]) 

 --------------------------------------------------------------------------- ValueError Traceback (most recent call last) pandas/_libs/src/inference.pyx in pandas._libs.lib.maybe_convert_numeric() ValueError: Unable to parse string "−38.0" ... ... ... ValueError: Unable to parse string "−38.0" at position 0 

这个问题产生了一个重要的道义:数据通常以“脏”的形式出现,使用起来不方便,数据科学家的任务是使这些数据清晰可见。
您可以看到我们表中的某些列属于object类型,而不是数字类型float64 。 在此类列中,我们将破折号替换为减号,然后将整个表格转换为数字格式。 不能转换的列(城市名称)将保持不变(为此,我们使用键errors='ignore' )。

 print(data.dtypes) for x in ["TempMin","TempColdest","AvgAnnual"]: data[x] = data[x].str.replace('−','-') data = data.apply(pd.to_numeric,errors='ignore') print(data.dtypes) 

 City object Lat float64 Long float64 TempMin object TempColdest object AvgAnnual object TempWarmest float64 AbsMax float64 Precipitation int64 dtype: object City object Lat float64 Long float64 TempMin float64 TempColdest float64 AvgAnnual float64 TempWarmest float64 AbsMax float64 Precipitation int64 dtype: object 

我们研究数据


现在我们有了干净的数据,我们可以尝试构建有趣的图形。

年平均温度


例如,让我们看看平均温度如何取决于纬度。

 ax = data.plot(x="Lat",y="AvgAnnual",kind="Scatter") ax.set_xlabel("") ax.set_ylabel(" ") 



该图显示越靠近赤道,温度越高。

记录城市


现在,让我们看一下温度最高的城市,看看城市的最低和​​最高温度之间是否存在相关性。

 ax=data.plot(x="TempMin",y="AbsMax",kind="scatter") ax.set_xlabel("  ") ax.set_ylabel("  ") ax.invert_xaxis() 



如您所见,在这种情况下不存在这种关联。 有些城市的气候属于大陆性气候,只有冷热城市。 我们发现温度分布最大的城市,即大陆性气候急剧的城市。

 data['spread'] = data['TempWarmest'] - data['TempColdest'] data.nlargest(3,'spread') 



这次,我们未创下最高纪录,而是最暖和最冷月份的平均值。 不出所料,萨哈共和国(雅库特)的城市分散程度最大。

冬季和夏季


为了进一步研究,请考虑距莫斯科300公里半径内的城市。 要计算纬度和经度之间的距离,我们使用geopy库,该库必须首先使用pip install

 !pip install geopy import geopy.distance 

在表格中再增加一列-到莫斯科的距离。

 msk_coords = tuple(data.loc[data["City"]==""][["Lat","Long"]].iloc[0]) data["DistMsk"] = data.apply(lambda row : geopy.distance.distance(msk_coords,(row["Lat"],row["Long"])).km,axis=1) data.head() 



我们使用表达式仅选择我们感兴趣的行。

 msk = data.loc[data['DistMsk']<300] msk 



对于这些城市,我们制定了最低,平均每年和最高温度的时间表。

 ax=msk.plot(x="City",y=["TempColdest","AvgAnnual","TempWarmest"],kind="bar",stacked="true") ax.legend(["","",""],loc='lower right') 



通常,在莫斯科附近300公里内未观察到异常。 伊凡诺沃(Ivanovo)位于其余城市的北部,因此气温低了几度。

处理地理数据


现在,让我们尝试在地图上显示参考城市的年平均降雨量,并查看降雨量如何取决于地理位置。 为此,我们使用了另一个可视化库Bokeh 。 还需要安装它。

然后,我们计算另一列-圆圈的大小,该列将显示降雨量。 凭经验选择系数。

 !pip install bokeh from bokeh.io import output_file, output_notebook, show from bokeh.models import ( GMapPlot, GMapOptions, ColumnDataSource, Circle, LogColorMapper, BasicTicker, ColorBar, DataRange1d, PanTool, WheelZoomTool, BoxSelectTool, HoverTool ) from bokeh.models.mappers import ColorMapper, LinearColorMapper from bokeh.palettes import Viridis5 from bokeh.plotting import gmap 

要使用地图,您需要Google Maps API密钥。 它必须在站点上独立获得。

有关使用Bokeh在地图上绘制图表的更多详细说明,请参见此处此处

 google_key = "<INSERT YOUR KEY HERE>" data["PrecipSize"] = data["Precipitation"] / 50.0 map_options = GMapOptions(lat=msk_coords[0], lng=msk_coords[1], map_type="roadmap", zoom=4) plot = gmap(google_key,map_options=map_options) plot.title.text = "    " source = ColumnDataSource(data=data) my_hover = HoverTool() my_hover.tooltips = [('', '@City'),('','@Precipitation')] plot.circle(x="Long", y="Lat", size="PrecipSize", fill_color="blue", fill_alpha=0.8, source=source) plot.add_tools(PanTool(), WheelZoomTool(), BoxSelectTool(), my_hover) output_notebook() show(plot) 



如您所见,降雨量最多的地区是沿海城市。 尽管有相当多的城市的降雨量是平均水平甚至低于全国水平。

完整的代码以及由Dmitry Soshnikov编写的注释,您可以在此处独立查看和运行。

总结


我们展示了该语言的功能,而无需使用复杂的算法,特定的库或编写数百行代码。 但是,即使配备了标准工具,您也可以分析数据并得出一些结论。

数据集远不能完美地组合在一起,因此在开始使用可视化之前,需要将它们整理好。 可视化的质量将在很大程度上取决于所使用数据的质量。

图表和图形的种类繁多,因此不必仅限于标准库。

GeoplotlibPlotly ,简约皮革等。

如果您想了解更多有关在Python中使用数据的知识,并熟悉人工智能,那么我们邀请您参加Binary District的一日密集课程-AI的Python快速入门

Source: https://habr.com/ru/post/zh-CN422463/


All Articles