编写这篇文章是为了记录自己是如何分析地震数据集,使用模块,克服一系列 \(bug\) 的过程。如果你是 \(python\) 初入数据分析的小白,那么这篇文章很适合你。阅读栏目时建议不要跳过任何步骤,从头看到尾你会收获很多。
\(Python\) 版本 \(3.10.2\),使用模块(包含两个主流绘图库)
读取数据集的方式很简单,由于列名为中文且带有特殊符号,我们这里对其进行简化全部修改为英文。可以直接修改 \(dataframe\) 的属性。或者使用 \(rename\) 方法。
一般来说中国地震台网中心提供的数据比较权威,不会有问题。但是为了以防万一,我们还是要进行数据清理,删除空行、重复行。
可以看出数据还是比较可靠的。
注册高德地图个人开发者,申请API,选择 Web服务。申请完成后查看开发文档,选择坐标转换。
比较以下两种方式获取的数据
可以看到 \(.values\) 返回的是可迭代的 \(numpy\) 数组对象。我们就可以按照接口规定的方式发送请求了。
Return a Numpy representation of the DataFrame.
Only the values in the DataFrame will be returned, the axes labels will be removed.
通过测试接口拿到的 \(json\) 中,我们关心的数据是 \(regeocode\) -> \(addressComponent\) -> \(city、province\)
循环遍历然后把省份城市加到两个数组内,最后再绑定到 \(dataframe\) 的两个新列上。
这部分代码的意思是假如拿到的 \(city\) 为空,应当把省份给 \(city\),否则会出现数据缺省。
引入编写的工具库函数,进行测试。警告如下
SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead
变量 \(df\)(df_test) 其实是一个“标签”(描述符)而不是一个“容器”。截取数据的前三行,\(df\) 实际是一个指向 \(data\) 前三行的描述符,在内存中并没有为 \(df\) 分配新的地址存储希望截取的数据。
因此针对 \(df\) 的修改,会产生警告。因为 \(df\) 既没有数据也没有列名,其指向的是 \(data\) 的前三行。
这就是 \(python\) 所谓的“链式索引”(chained indexing)而引起的错误或警告。
但 \(python\) 比较聪明,为了防止报错退出程序,会自己拷贝一份我们希望截取的内容,使 \(df\) 指向拷贝的数据块,才能完成变更列名以及完成后面的计算。
解决方法是在截取数据的语句后加一个 \(.copy()\) 复制一份数据给 \(df\) 。
还是原来的代码,这里我们限定一些列防止行输出过长。
成功通过接口处理数据!
因为接口有使用次数限制,为了方便后续调试。我们将 \(6000\) 多行数据统一转换,保存为 \(csv\) 文件。这也会加快 \(pandas\) 模块读取数据集的速度。
有部分境内但没有明确城市省份的地震统一归为其他(一般为海域、边境地区)。 对 \(city、province\) 进行替换
这段代码放在末尾,用于一次性生成完整的 \(html\) 文件,具体可参考
\(pyecharts\) 和 \(plotly\) 分开写在两个文件中,引入需要的库。
M>=4.5级的属于可造成破坏的地震,但破坏轻重还与震源深度、震中距等多种因素有关。发震时刻、震级、震中统称为"地震三要素"。
统计 \(12\) 年内各地区发生 \(M>=4.5\) 强震的次数。
只考虑省份,不考虑境内其他地方,通过 \(query\) 进行过滤,再用 \(groupby\) 进行分组。
由于 \(pyecharts\) 地图模块的省份名必须是短省份名,否则将无法正确显示。为 \(utils\) 工具包编写如下函数,原理是根据字典查询并返回短省份名。
通过统计2010-2022年各省份 M>= 4.5 地震次数
需要注意的是使用 \(items()\) 获取的迭代器只能完整迭代一次。再次迭代会得到空数组。
category_gap=8 为各个柱体的间隔距离。
使用 \(lambda\) 匿名函数处理每行字段震级化为整数再进行 \(groupby\) ,速度较慢,后续有新方法会更新。
通过统计2010-2022年国内地震震级分布
使用 \(sort\_values\) 对特定列排序,并给定 \(ascending\) 参数要求降序排序,最后挑选前十个。
这里需要注意如果不使用 \(tolist()\) 会出现如下错误
通过统计2010-2022年中国前十大地震
\(symbol\_size\) 为点的大小。\(min\_=3\) 将图表前部分剔除。因为数据集的数据 \(M>=3\)。
通过震级震源深度散点图
需要注意的是给定一个 \(mapbox\_style\) 否则图表将无法正常显示。
结合全球地震带分布图分析,可以看出热力图轮廓与全球地震带分布图轮廓非常相似。基本上吻合。强地震大部分都发生在板块交界处。
这里用了另外一种方法,比上面的方法更加简洁,并明确指定了初始化图表的中心方位。
我国位于亚欧大陆东部,太平洋的西岸地区,两大地震带对于我国都有影响。我国的西南地区的喜马拉雅山脉和横断山脉地区就是地中海-喜马拉雅地震带经过的区域,亚欧板块和印度洋板块在南北方向上碰撞挤压,形成一系列呈东西走向的地震断裂带,以及横断山脉地区南北走向的地震断裂带。与此有关的地震带包括喜马拉雅地震带、青藏高原地震带、西北地震带、南北地震带、腾冲-澜沧地震带、滇西地震带和滇东地震带。
我国西部地区总体而言是地震相对高发的地区,包括西藏自治区、青海省、新疆维吾尔自治区、甘肃省、宁夏回族自治区、四川省和云南省等地都有较高的地震风险,其中越靠近地中海-喜马拉雅地震带,地震风险越高,比如说云南、四川、西藏等地区都是地震高风险省区。此外,我国东部海域地区又处在环太平洋地震带通过的地区,亚欧板块和太平洋板块在东西方向上相互挤压,形成一系列东北西南走向的地震断裂带。与此有关的地震带包括环太平洋地震带、东南沿海地震带和华北地震带。
相对而言环太平洋地震带离我国的距离比地中海-喜马拉雅地震带要远一些,因此,总体影响要小一些,但是某些地区地震活跃程度却非常高,比如我国的台湾省刚好地处环太平洋地震带,是我国地震频率最高的省份。除此之外广东省、福建省、安徽省、江苏省、山东省、河北省、河南省、山西省、陕西省、北京市、天津市、辽宁省、吉林省和黑龙江省都有地震带的分布。除去以上省份,我们发现内蒙古自治区、上海市、浙江省、江西省、湖北省、湖南省、贵州省和广西壮族自治区基本上没有地震带涉及,也就是地震风险相对较低的省份。
为了能够使用特殊日期函数,必须进行整列的日期转换。
需要注意图表属性 \(x\_axis\) 必须是字符串数组,否则将不能正常显示。
按月份来看每月地震次数在 30~90 次的范围波动。可通过方差判断各年月地震次数波动。
偶尔会有地震次数高峰期,可能是因为地壳活动过于强烈。
这里引入了 \(Jscode\) 特殊化要显示的标签。前面数据我们需要获取到字典数组。\(total\) 实际上是在计算行数。