Используйте Python для анализа распределения землетрясений за последние 10 лет~

Python

Всем привет, меня зовут Кай.

Это случилось в Желтом море некоторое время назад.5.2级Землетрясение, в то время друзья в кругу друзей в Восточном Китае были все"шок".

Сегодня давайте заглянем в прошлое10Распределение землетрясений в году!

1. Сбор данных

прямо в中国地震台网можно скачать впоследние 10 летсейсмические данные.

Китайская сеть землетрясений:

новости.CE IC.AC.can/index.HTML?…

中国地震台网

все напрямуюИсторический запросВыбратьлимит времениСделав запрос, нажмитесохранить в локальномданные можно получить.

Предварительный просмотр локальных данных выглядит следующим образом:

2. Обработка данных

Во время сбора данных мы обнаружили, что полученные данные содержаливремя,величина,широта и долгота,глубинаа такжеИсходное положение. Долгота и широта находятся под картой Baidu.Учитывая, что будут различия в долготе и широте разных карт, а наш последующий рисунок использует карту Gaode, поэтому долготу и широту необходимо преобразовать здесь.

2.1 Преобразование долготы и широты

Открытая платформа AutoNavi имеет соответствующиеПреобразование долготы и широтыизAPI, мы можем вызвать его напрямую (свободной квоты достаточно).

坐标转换

import requests
import pandas as pd
# 读取数据
df = pd.read_excel(r'eqList.xlsx')

longitude_list = []
latitude_list = []
# 百度地图经纬度转换为高德地图经纬度
for i , location in enumerate(df[['经度(°)','纬度(°)']].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'])
    # 经度
    longitude_list.append(r[0])
    # 纬度
    latitude_list.append(r[1])
    print(f'\r{i+1}',end='')

df['经度(°)'] = longitude_list
df['纬度(°)'] = latitude_list

Таким образом, мы успешно преобразовали координаты широты и долготы картографической системы Baidu в координаты широты и долготы картографической системы Gaode.

2.2 Обработка данных во время землетрясения

Что касается времени землетрясения, я надеюсь быть точным до месяца и часа для последующего статистического анализа.

# 转换为时间格式
df['发震时刻'] = pd.to_datetime(df['发震时刻'])
# 获取年月
df['月份'] = df['发震时刻'].apply(lambda x: str(x)[:7])
# 获取小时
df['小时'] = df['发震时刻'].dt.hour

Здесь я чувствую, что моя операция получения года и месяца немногоlow, есть друзья, у которых есть лучшие решения, пожалуйста, оставьте сообщение, я хочу научиться.

2.3. Место землетрясения (провинция и город)

Поскольку эталонное местоположение в исходных данных не может быть легко выделено из провинции и города, я планирую использовать информацию о широте и долготе для передачи данных AutoNavi.APIчтобы получить. Обратитесь к предыдущему «».

citys = []
provinces = []
for i , location in enumerate(df[['经度(°)','纬度(°)']].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

После вышеуказанной обработки мы окончательно получили следующие данные:

3. Статистика и визуализация

В этой части мы выполняем только простой статистический вывод, а не делаем аналогичные прогнозы или другой глубокий анализ, ведь на основе имеющихся необработанных данных мы не можем сделать слишком много ценных выводов.

3.1 Количество землетрясений по годам

Количество малых и средних землетрясений

в соответствии с[2, 4.6]Как интервал средних и малых магнитуд землетрясений,За последние 10 лет в общей сложности 6188 раз, в среднем более 600 раз в год!

中小地震次数

# 中小地震([2,4.6])
df['年份'] = df['发震时刻'].dt.year
df_cn = df[df['省']!='[]']
df_xiao = df_cn.query('2<=`震级(M)`<=4.6')
df_xiao.groupby('年份')['发震时刻'].count().to_frame('次数').reset_index()

Разрушительные землетрясения

в соответствии с[4.7, ∞]Как интервал средних и малых магнитуд землетрясений,За последние 10 лет в общей сложности 505 раз, в среднем более 50 раз в год!

破坏性地震次数

3.2. Количество землетрясений по провинциям

Учитывая, что некоторые землетрясения происходили в акватории моря, эта акватория объединена с акваторией Китайского моря, и мы не участвуем в тех, которые происходят за рубежом.

Кроме того, мы рассматриваем толькоРазрушительное землетрясениераспространение, можно найти в нашей странеСиньцзян,Тибет,Юньнань,ТайваньиСычуаньЭто сейсмоопасная зона!

# 各省 破坏性地震
df_province = df_cn.query('`震级(M)`>=4.7').groupby('省')['发震时刻'].count().to_frame('次数').sort_values(by='次数',ascending=False).reset_index()
провинция Разрушительные землетрясения
Синьцзян 98
Тибет 63
Юньнань 47
Тайвань 47
Сычуань 45
Цинхай 32
Ганьсу 10
Цзилинь 9
Внутренняя Монголия 7
Гуанси 4
Хубэй 3
Гуандун 2
Хэбэй 2
Гуйчжоу 2
Чунцин 2
Хэйлунцзян 2
Цзянсу 1
Фуцзянь 1
Ляонин 1
Шэньси 1

3.3 Количество землетрясений по городам

В моей стране233землетрясения произошли в каждом городе, и города с наибольшим количеством землетрясений в основном сосредоточены вСиньцзян,Сычуань.

Примечание. Статистика здесь представляет собой все данные о землетрясениях.

как Синьцзян克孜勒苏柯尔克孜自治州,和田地区

新疆

Сычуань宜宾и雅安Ждать

四川

Провинция Город частота
Синьцзян-Уйгурский автономный район Кызылсу Киргизский автономный округ 491
Синьцзян-Уйгурский автономный район Хотан район 431
Синьцзян-Уйгурский автономный район Аксу район 308
Тибетский автономный район Нагку 257
провинция Сычуань Ибинь Сити 237
Синьцзян-Уйгурский автономный район Кашгарская область 234
Синьцзян-Уйгурский автономный район Барин Го Юй Монгольский автономный округ 206
провинция Сычуань город Яань 188
Провинция Тайвань Провинция Тайвань 167
провинция Сычуань Аба Тибетский и Цянский автономный округ 167

【ГИФ】

3.4 График рассеяния распределения землетрясений

мы только смотримРазрушительное землетрясениеРаспределение, составленное в соответствии с информацией о координатах широты и долготы.

地震分布

import folium.plugins as plugins
import folium

df = df[df['震级(M)']>=4.7]
ss1 = [[latitude,longitude] for latitude,longitude in df[['纬度(°)', '经度(°)']].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 Тепловая карта распределения адресов

Видно, что юго-западная часть Синьцзяна и восточные воды провинции Тайвань являются сейсмоопасными районами.

地震分布热力图

data_all = df[['纬度(°)', '经度(°)','震级(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 лет (динамическая)

Примечание. Статистика здесь представляет собой все данные о землетрясениях.

【Номер видео】

код чертежа

data_move = []
date_list = df['月份'].sort_values().unique()
for month in date_list:
    data_move.append(df[df['月份'] == month][['纬度(°)', '经度(°)','震级(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('地震动态热力图.html')

4. Дополнительные знания

Карта распределения сейсмических зон

网图-地震带分布图

Мы фильтруем землетрясения магнитудой 5 и выше, чтобы нарисовать карту распределения следующим образом:

В основном совпадают~

Выше все содержание на этот раз, если вы заинтересованы, нажмите在看Приватный чат Xiaobian может получитьданныеха~