用Python分析過去10年地震分布~
回復(fù)“書籍”即可獲贈Python從入門到進階共10本電子書
大家好,我是才哥。
前段時間在黃海海域發(fā)生了5.2級地震,當(dāng)時朋友圈華東一帶的朋友們都“震動”了。

今天,就帶大家一起看看過去10年里地震的分布情況!
目錄:
1. 數(shù)據(jù)獲取
2. 數(shù)據(jù)處理
2.1. 經(jīng)緯度轉(zhuǎn)換
2.2. 發(fā)震時刻數(shù)據(jù)處理
2.3. 地震所在地(省市)
3. 統(tǒng)計與可視化
3.1. 歷年地震數(shù)
3.2. 各省地震數(shù)
3.3. 各城市地震數(shù)
3.4. 地震分布散點圖
3.5. 地址分布熱力圖
3.6. 近10年每月地震分布圖(動態(tài))
4. 補充知識

1. 數(shù)據(jù)獲取

直接在中國地震臺網(wǎng)就可以下載到過去10年的地震數(shù)據(jù)。
中國地震臺網(wǎng):
https://news.ceic.ac.cn/index.html?time=1637318776

大家直接在歷史查詢里選擇時間范圍進行查詢后,點擊保存到本地即可獲取數(shù)據(jù)。
存在本地的數(shù)據(jù)預(yù)覽如下:


2. 數(shù)據(jù)處理

在數(shù)據(jù)獲取的時候, 我們發(fā)現(xiàn)獲取的數(shù)據(jù)包含時間、震級、經(jīng)緯度、深度以及參考位置。而經(jīng)緯度是百度地圖下的,考慮到不同地圖的經(jīng)緯度會存在差異,而我們后續(xù)繪圖采用的是高德地圖,所以這里需要對經(jīng)緯度進行轉(zhuǎn)換。
2.1. 經(jīng)緯度轉(zhuǎn)換
高德開放平臺有對應(yīng)的經(jīng)緯度轉(zhuǎn)換的API,我們可以直接調(diào)用(免費額度夠)。

import?requests
import?pandas?as?pd
#?讀取數(shù)據(jù)
df?=?pd.read_excel(r'eqList.xlsx')
longitude_list?=?[]
latitude_list?=?[]
#?百度地圖經(jīng)緯度轉(zhuǎn)換為高德地圖經(jīng)緯度
for?i?,?location?in?enumerate(df[['經(jīng)度(°)','緯度(°)']].values):
????location?=?str(location[0])+','+str(location[1])
????url?=?'https://restapi.amap.com/v3/assistant/coordinate/convert?'
????
????parames?=?{
????????'locations':location,
????????'coordsys':'baidu',
????????'key':'你的key',
????????}
????
????r?=?eval(requests.get(url,?params=parames).json()['locations'])
????#?經(jīng)度
????longitude_list.append(r[0])
????#?緯度
????latitude_list.append(r[1])
????print(f'\r{i+1}',end='')
df['經(jīng)度(°)']?=?longitude_list
df['緯度(°)']?=?latitude_list
如此,我們就成功將百度地圖系的經(jīng)緯度坐標(biāo)轉(zhuǎn)換為了高德地圖系的經(jīng)緯度坐標(biāo)。
2.2. 發(fā)震時刻數(shù)據(jù)處理
對于發(fā)震時刻來說,我希望的是精確到月份以及小時,用于后續(xù)統(tǒng)計分析。
#?轉(zhuǎn)換為時間格式
df['發(fā)震時刻']?=?pd.to_datetime(df['發(fā)震時刻'])
#?獲取年月
df['月份']?=?df['發(fā)震時刻'].apply(lambda?x:?str(x)[:7])
#?獲取小時
df['小時']?=?df['發(fā)震時刻'].dt.hour
這里我感覺我的獲取年月的操作有點low,有小伙伴有更好的方案還請留言哈,我要學(xué)習(xí)。
2.3. 地震所在地(省市)
由于在原始數(shù)據(jù)中參考位置無法便捷的解析出省和市,我這邊打算用經(jīng)緯度信息通過高德的API來進行獲取。參考此前《你知道海底撈在全國有多少家店嗎?》。
citys?=?[]
provinces?=?[]
for?i?,?location?in?enumerate(df[['經(jīng)度(°)','緯度(°)']].values):
????location?=?str(location[0])+','+str(location[1])
????url?=?'https://restapi.amap.com/v3/geocode/regeo?'
????params?=?{
????????'location':location,
????????'key':'你的key',
????????'extensions':'base',
????????'batch':'false',
????????'roadlevel':0,
????????}
????
????r?=?requests.get(url,?params=params)
????data?=?r.json()['regeocode']
????city?=?data['addressComponent']['city']
????province?=?data['addressComponent']['province']
????if?len(city)==0:
????????city?=?province
????citys.append(city)
????provinces.append(province)
????print(f'\r{i+1}',end='')
df['城市']?=?citys
df['省']?=?provinces
經(jīng)過以上的處理,我們最終得到了以下數(shù)據(jù):


3. 統(tǒng)計與可視化

這部分我們只進行簡單的統(tǒng)計展示,不做類似預(yù)測或者別的什么深度分析,畢竟基于現(xiàn)有原始數(shù)據(jù)也得不出太大的有價值結(jié)論。
3.1. 歷年地震數(shù)
中小地震次數(shù)
按照[2, 4.6]作為中小地震等級區(qū)間,近10年一共6188次,年均600余次!

#?中小地震([2,4.6])
df['年份']?=?df['發(fā)震時刻'].dt.year
df_cn?=?df[df['省']!='[]']
df_xiao?=?df_cn.query('2<=`震級(M)`<=4.6')
df_xiao.groupby('年份')['發(fā)震時刻'].count().to_frame('次數(shù)').reset_index()
破壞性地震次數(shù)
按照[4.7, ∞]作為中小地震等級區(qū)間,近10年一共505次,年均50余次!

3.2. 各省地震數(shù)
考慮到一些地震發(fā)生在海域,這里統(tǒng)一化為中國海域,另外對于發(fā)生在國外的咱們這里不參與。
另外,我們只看破壞性地震分布,可以發(fā)現(xiàn)在我國新疆、西藏、云南、臺灣和四川是地震高發(fā)帶!

#?各省?破壞性地震
df_province?=?df_cn.query('`震級(M)`>=4.7').groupby('省')['發(fā)震時刻'].count().to_frame('次數(shù)').sort_values(by='次數(shù)',ascending=False).reset_index()
| 省份 | 破壞性地震次數(shù) |
|---|---|
| 新疆 | 98 |
| 西藏 | 63 |
| 云南 | 47 |
| 臺灣 | 47 |
| 四川 | 45 |
| 青海 | 32 |
| 甘肅 | 10 |
| 吉林 | 9 |
| 內(nèi)蒙古 | 7 |
| 廣西 | 4 |
| 湖北 | 3 |
| 廣東 | 2 |
| 河北 | 2 |
| 貴州 | 2 |
| 重慶 | 2 |
| 黑龍江 | 2 |
| 江蘇 | 1 |
| 福建 | 1 |
| 遼寧 | 1 |
| 陜西 | 1 |
3.3. 各城市地震數(shù)
在我國233個城市發(fā)生過地震,發(fā)生地震次數(shù)最多的城市大多集中在新疆、四川。
注:這里統(tǒng)計的是全部地震數(shù)據(jù)
像新疆的克孜勒蘇柯爾克孜自治州、和田地區(qū)

四川的宜賓和雅安等

| 省 | 城市 | 次數(shù) |
|---|---|---|
| 新疆維吾爾自治區(qū) | 克孜勒蘇柯爾克孜自治州 | 491 |
| 新疆維吾爾自治區(qū) | 和田地區(qū) | 431 |
| 新疆維吾爾自治區(qū) | 阿克蘇地區(qū) | 308 |
| 西藏自治區(qū) | 那曲市 | 257 |
| 四川省 | 宜賓市 | 237 |
| 新疆維吾爾自治區(qū) | 喀什地區(qū) | 234 |
| 新疆維吾爾自治區(qū) | 巴音郭楞蒙古自治州 | 206 |
| 四川省 | 雅安市 | 188 |
| 臺灣省 | 臺灣省 | 167 |
| 四川省 | 阿壩藏族羌族自治州 | 167 |

3.4. 地震分布散點圖
我們只看破壞性地震分布,根據(jù)經(jīng)緯度坐標(biāo)信息繪制

import?folium.plugins?as?plugins
import?folium
df?=?df[df['震級(M)']>=4.7]
ss1?=?[[latitude,longitude]?for?latitude,longitude?in?df[['緯度(°)',?'經(jīng)度(°)']].values.tolist()]
m?=?folium.Map([39.904989,?116.405285],
??????????????tiles='https://webrd01.is.autonavi.com/appmaptile?&x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=7',
???????????????zoom_start=6,
???????????????attr='高德')
groups?=?folium.FeatureGroup('')
for?l,label?in?zip(ss1,df['參考位置'].to_list()):
????groups.add_child(
????????folium.CircleMarker(
????????????location=l,
????????????radius=1,
????????????color='red',
????????????fill=True,
????????????fill_color='red',
????????????fill_opacity=0.4,
????????????popup=folium.Popup(html=label,max_width=100),
????????)
????)
m.add_child(groups)
m.add_child(folium.LatLngPopup())?
m.save('地震分布.html')???????????????
3.5. 地址分布熱力圖
可以看到新疆西南部,和臺灣省東部海域?qū)儆诘卣鸲喟l(fā)地段。

data_all?=?df[['緯度(°)',?'經(jīng)度(°)','震級(M)']].values.tolist()
m?=?folium.Map([39.904989,?116.405285],
???????????????tiles='https://webrd01.is.autonavi.com/appmaptile?&x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=7',
???????????????zoom_start=6,
???????????????attr='高德')
hm?=?plugins.HeatMap(data_all,?radius=10,?
?????????????????????gradient={.1:?'green',?.6:?'yellow',?1:?'red'},
?????????????????????)
hm.add_to(m)
hm.save('地震熱力圖.html')
3.6. 近10年每月地震分布圖(動態(tài))
注:這里統(tǒng)計的是全部地震數(shù)據(jù)
繪制代碼
data_move?=?[]
date_list?=?df['月份'].sort_values().unique()
for?month?in?date_list:
????data_move.append(df[df['月份']?==?month][['緯度(°)',?'經(jīng)度(°)','震級(M)']].values.tolist())
m?=?folium.Map([39.904989,?116.405285],
???????????????tiles='https://webrd01.is.autonavi.com/appmaptile?&x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=7',
???????????????zoom_start=6,
???????????????attr='高德')
time_index?=?df['月份'].sort_values().unique().tolist()
hm?=?plugins.HeatMapWithTime(data_move,?
?????????????????????????????index=time_index,
?????????????????????????????radius=10)
hm.add_to(m)
hm.save('地震動態(tài)熱力圖.html')
4. 補充知識

地震帶分布圖

我們篩選 5級以上地震繪制分布圖如下:

基本吻合~

????小伙伴們,快快用實踐一下吧!如果在學(xué)習(xí)過程中,有遇到任何問題,歡迎加我好友,我拉你進Python學(xué)習(xí)交流群共同探討學(xué)習(xí)。
-------------------?End?-------------------
往期精彩文章推薦:

歡迎大家點贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持
想加入Python學(xué)習(xí)群請在后臺回復(fù)【入群】
萬水千山總是情,點個【在看】行不行
/今日留言主題/
隨便說一兩句吧~~
