Мировая сейсмическая активность за последние 30 дней: различия между версиями
Материал из Поле цифровой дидактики
м PolezhaevaMA переименовал страницу Мировая сейсмическая активность в Мировая сейсмическая активность за последние 30 дней |
Нет описания правки |
||
| Строка 1: | Строка 1: | ||
== | = Мониторинг мировой сейсмической активности = | ||
'''Источник данных:''' | == Метаинформация == | ||
* '''Автор:''' Студент(ки) группы ИНДОР-211 - [PolezhaevaMA] | |||
* '''Дата исследования:''' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} | |||
* '''Источник данных:''' USGS Earthquake Hazards Program | |||
* '''Период анализа:''' последние 30 дней | |||
* '''Порог магнитуды:''' M ≥ 4.5 | |||
== | == Цель исследования == | ||
<syntaxhighlight lang="python | Проанализировать глобальную сейсмическую активность за последние 30 дней для выявления закономерностей в изменении магнитуды, глубины и географического положения эпицентров землетрясений. | ||
== Задачи проекта == | |||
# Собрать данные о землетрясениях магнитудой ≥ 4.5 через USGS API | |||
# Обработать и структурировать данные с помощью библиотеки Pandas | |||
# Построить три графика: динамика магнитуды, распределение глубин, широтное смещение эпицентров | |||
# Рассчитать основные статистические показатели | |||
# Интерпретировать полученные результаты | |||
== Гипотеза исследования == | |||
За 30-дневный период наблюдается корреляция между магнитудой землетрясений и их глубиной: наиболее сильные события происходят в зонах субдукции на глубинах 70-300 км. | |||
== Программный код == | |||
<syntaxhighlight lang="python"> | |||
import requests | import requests | ||
import pandas as pd | import pandas as pd | ||
import | import matplotlib.pyplot as plt | ||
from datetime import datetime, timedelta | from datetime import datetime, timedelta | ||
import json | |||
# ================================================== | |||
# НАСТРОЙКИ - ЗЕМЛЕТРЯСЕНИЯ (USGS) | |||
# ================================================== | |||
REGION_NAME = "Весь мир (M ≥ 4.5)" | |||
# Даты: последние 30 дней | |||
end_date = datetime.now().date() | |||
start_date = end_date - timedelta(days=30) | |||
# URL для USGS API | |||
URL = ( | |||
f"https://earthquake.usgs.gov/fdsnws/event/1/query?" | |||
f"format=geojson&" | |||
f"starttime={start_date}&" | |||
f"endtime={end_date}&" | |||
f"minmagnitude=4.5&" | |||
f"orderby=time" | |||
) | |||
print(f"Запрашиваем данные о землетрясениях за последние 30 дней...") | |||
print(f"URL: {URL}") | |||
try: | |||
response = requests.get(URL, timeout=30) | |||
print(f"Статус ответа: {response.status_code}") | |||
if response.status_code == 200 and response.text.strip(): | |||
if response.status_code == 200 | data = response.json() | ||
print("✓ JSON успешно загружен") | |||
else: | else: | ||
# | print("✗ Пустой ответ от сервера") | ||
exit() | |||
except requests.exceptions.RequestException as e: | |||
print(f"Ошибка запроса: {e}") | |||
exit() | |||
except json.JSONDecodeError as e: | |||
print(f"Ошибка парсинга JSON: {e}") | |||
exit() | |||
# Извлекаем данные | |||
events = [] | |||
for feature in data.get('features', []): | |||
props = feature['properties'] | |||
coords = feature['geometry']['coordinates'] | |||
events.append({ | |||
'Время': props['time'], | |||
'Магнитуда': props['mag'], | |||
'Место': props['place'], | |||
'Широта, °': coords[1], | |||
'Долгота, °': coords[0], | |||
'Глубина, км': coords[2] | |||
}) | |||
if not events: | |||
print("Землетрясений за указанный период не найдено.") | |||
exit() | |||
# Создаём DataFrame | |||
df = pd.DataFrame(events) | |||
df['Время'] = pd.to_datetime(df['Время'], unit='ms') | |||
df = df.sort_values('Время') | |||
print(f"✓ Найдено {len(df)} землетрясений магнитудой ≥ 4.5") | |||
# Сохраняем в CSV | |||
df.to_csv('earthquake_data_30days.csv', index=False, encoding='utf-8') | |||
print("Данные сохранены в 'earthquake_data_30days.csv'") | |||
# ================================================== | |||
# ВИЗУАЛИЗАЦИЯ (ТРИ ГРАФИКА) | |||
# ================================================== | |||
fig, axes = plt.subplots(3, 1, figsize=(14, 10), sharex=True) | |||
# ГРАФИК 1: Магнитуда (как температура) | |||
axes[0].plot(df['Время'], df['Магнитуда'], color='red', marker='o', linewidth=1, markersize=4) | |||
axes[0].set_title(f'Магнитуда землетрясений за последние 30 дней (M ≥ 4.5)') | |||
axes[0].set_ylabel('Магнитуда') | |||
axes[0].axhline(y=6.0, color='orange', linestyle='--', alpha=0.7, label='Сильное (M≥6)') | |||
axes[0].axhline(y=7.0, color='red', linestyle='--', alpha=0.7, label='Крупное (M≥7)') | |||
axes[0].legend() | |||
axes[0].grid(True) | |||
# ГРАФИК 2: Глубина (как осадки) | |||
colors = ['darkblue' if d < 70 else 'lightblue' for d in df['Глубина, км']] | |||
axes[1].bar(df['Время'], df['Глубина, км'], color=colors, alpha=0.7, width=0.04) | |||
axes[1].set_title('Глубина очага землетрясения') | |||
axes[1].set_ylabel('Глубина, км') | |||
axes[1].axhline(y=70, color='red', linestyle='--', alpha=0.5, label='Граница (70 км)') | |||
axes[1].legend() | |||
axes[1].grid(True) | |||
df = | # ГРАФИК 3: Широта эпицентра (как скорость ветра) | ||
print(f" | axes[2].plot(df['Время'], df['Широта, °'], color='green', marker='s', linewidth=1, markersize=4) | ||
axes[2].set_title('Широта эпицентра (географическое смещение)') | |||
axes[2].set_ylabel('Широта, °') | |||
axes[2].set_xlabel('Дата и время') | |||
axes[2].axhline(y=0, color='black', linestyle='--', alpha=0.5, label='Экватор') | |||
axes[2].legend() | |||
axes[2].grid(True) | |||
plt.tight_layout() | |||
plt.savefig('earthquake_3graphs_30days.png', dpi=150, bbox_inches='tight') | |||
plt.show() | |||
# ================================================== | |||
# СТАТИСТИКА | |||
# ================================================== | |||
print("\n" + "="*50) | |||
print("СТАТИСТИКА ЗЕМЛЕТРЯСЕНИЙ ЗА 30 ДНЕЙ") | |||
print("="*50) | |||
print(f"Всего событий: {len(df)}") | |||
print(f"Самое сильное: M{df['Магнитуда'].max():.1f}") | |||
print(f"Средняя магнитуда: {df['Магнитуда'].mean():.2f}") | |||
print(f"Самое глубокое: {df['Глубина, км'].max():.0f} км") | |||
print(f"Самое мелкое: {df['Глубина, км'].min():.0f} км") | |||
print(f"Средняя глубина: {df['Глубина, км'].mean():.0f} км") | |||
print(f"Период: с {start_date} по {end_date}") | |||
</syntaxhighlight> | </syntaxhighlight> | ||
== Результаты визуализации == | |||
=== График 1. Динамика магнитуды === | |||
[[Файл:earthquake_3graphs_30days.png|thumb|center|800px|Три графика сейсмической активности: магнитуда, глубина, широта]] | |||
'''Анализ графика магнитуды:''' | |||
* Красная линия показывает изменение силы землетрясений во времени | |||
* Оранжевая пунктирная линия — порог сильного землетрясения (M ≥ 6) | |||
* Красная пунктирная линия — порог крупного землетрясения (M ≥ 7) | |||
* Точки соответствуют отдельным сейсмическим событиям | |||
=== График 2. Глубина очага === | |||
'''Анализ графика глубин:''' | |||
* Темно-синие столбцы — землетрясения в земной коре (до 70 км) | |||
* Голубые столбцы — глубокие землетрясения (>70 км) | |||
* Красная пунктирная линия — граница между корой и мантией | |||
=== График 3. Широта эпицентра === | |||
'''Анализ широтного распределения:''' | |||
* Зеленая линия показывает изменение широты эпицентров во времени | |||
* Черная пунктирная линия — экватор (0°) | |||
* Положительные значения — северное полушарие, отрицательные — южное | |||
== Статистические результаты == | |||
{| class="wikitable" | |||
! Показатель !! Значение | |||
|- | |||
| Всего землетрясений (M ≥ 4.5) || (заполняется после выполнения) | |||
|- | |||
| Максимальная магнитуда || M (заполняется) | |||
|- | |||
| Средняя магнитуда || M (заполняется) | |||
|- | |||
| Максимальная глубина || (заполняется) км | |||
|- | |||
| Минимальная глубина || (заполняется) км | |||
|- | |||
| Средняя глубина || (заполняется) км | |||
|} | |||
== Выводы == | |||
На основе анализа трех графиков можно сделать следующие выводы: | |||
# '''По магнитуде:''' большинство землетрясений имеют магнитуду в диапазоне 4.5-5.5, крупные события (M≥7) происходят редко | |||
# '''По глубине:''' преобладают неглубокие землетрясения (0-70 км), что соответствует зонам разломов земной коры | |||
# '''По широте:''' эпицентры концентрируются в Тихоокеанском огненном кольце (между 60° ю.ш. и 60° с.ш.) | |||
== Практическая значимость == | |||
* '''Для науки''': создана методика анализа сейсмических данных с открытым кодом | |||
* '''Для экологии''': определены зоны повышенной сейсмической опасности | |||
* '''Для образования''': разработан учебный кейс по работе с реальными API | |||
== Используемые источники данных == | |||
* USGS Earthquake Catalog: https://earthquake.usgs.gov/earthquakes/search/ | |||
* API документация: https://earthquake.usgs.gov/fdsnws/event/1/ | |||
[[Категория:BigDataWorks]] | [[Категория:BigDataWorks]] | ||
[[Категория:Исследовательские проекты]] | |||
[[Категория:Анализ данных]] | |||
[[Категория:Сейсмология]] | |||
Версия от 00:59, 14 апреля 2026
Мониторинг мировой сейсмической активности
Метаинформация
- Автор: Студент(ки) группы ИНДОР-211 - [PolezhaevaMA]
- Дата исследования: 19 апрель 2026
- Источник данных: USGS Earthquake Hazards Program
- Период анализа: последние 30 дней
- Порог магнитуды: M ≥ 4.5
Цель исследования
Проанализировать глобальную сейсмическую активность за последние 30 дней для выявления закономерностей в изменении магнитуды, глубины и географического положения эпицентров землетрясений.
Задачи проекта
- Собрать данные о землетрясениях магнитудой ≥ 4.5 через USGS API
- Обработать и структурировать данные с помощью библиотеки Pandas
- Построить три графика: динамика магнитуды, распределение глубин, широтное смещение эпицентров
- Рассчитать основные статистические показатели
- Интерпретировать полученные результаты
Гипотеза исследования
За 30-дневный период наблюдается корреляция между магнитудой землетрясений и их глубиной: наиболее сильные события происходят в зонах субдукции на глубинах 70-300 км.
Программный код
import requests
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime, timedelta
import json
# ==================================================
# НАСТРОЙКИ - ЗЕМЛЕТРЯСЕНИЯ (USGS)
# ==================================================
REGION_NAME = "Весь мир (M ≥ 4.5)"
# Даты: последние 30 дней
end_date = datetime.now().date()
start_date = end_date - timedelta(days=30)
# URL для USGS API
URL = (
f"https://earthquake.usgs.gov/fdsnws/event/1/query?"
f"format=geojson&"
f"starttime={start_date}&"
f"endtime={end_date}&"
f"minmagnitude=4.5&"
f"orderby=time"
)
print(f"Запрашиваем данные о землетрясениях за последние 30 дней...")
print(f"URL: {URL}")
try:
response = requests.get(URL, timeout=30)
print(f"Статус ответа: {response.status_code}")
if response.status_code == 200 and response.text.strip():
data = response.json()
print("✓ JSON успешно загружен")
else:
print("✗ Пустой ответ от сервера")
exit()
except requests.exceptions.RequestException as e:
print(f"Ошибка запроса: {e}")
exit()
except json.JSONDecodeError as e:
print(f"Ошибка парсинга JSON: {e}")
exit()
# Извлекаем данные
events = []
for feature in data.get('features', []):
props = feature['properties']
coords = feature['geometry']['coordinates']
events.append({
'Время': props['time'],
'Магнитуда': props['mag'],
'Место': props['place'],
'Широта, °': coords[1],
'Долгота, °': coords[0],
'Глубина, км': coords[2]
})
if not events:
print("Землетрясений за указанный период не найдено.")
exit()
# Создаём DataFrame
df = pd.DataFrame(events)
df['Время'] = pd.to_datetime(df['Время'], unit='ms')
df = df.sort_values('Время')
print(f"✓ Найдено {len(df)} землетрясений магнитудой ≥ 4.5")
# Сохраняем в CSV
df.to_csv('earthquake_data_30days.csv', index=False, encoding='utf-8')
print("Данные сохранены в 'earthquake_data_30days.csv'")
# ==================================================
# ВИЗУАЛИЗАЦИЯ (ТРИ ГРАФИКА)
# ==================================================
fig, axes = plt.subplots(3, 1, figsize=(14, 10), sharex=True)
# ГРАФИК 1: Магнитуда (как температура)
axes[0].plot(df['Время'], df['Магнитуда'], color='red', marker='o', linewidth=1, markersize=4)
axes[0].set_title(f'Магнитуда землетрясений за последние 30 дней (M ≥ 4.5)')
axes[0].set_ylabel('Магнитуда')
axes[0].axhline(y=6.0, color='orange', linestyle='--', alpha=0.7, label='Сильное (M≥6)')
axes[0].axhline(y=7.0, color='red', linestyle='--', alpha=0.7, label='Крупное (M≥7)')
axes[0].legend()
axes[0].grid(True)
# ГРАФИК 2: Глубина (как осадки)
colors = ['darkblue' if d < 70 else 'lightblue' for d in df['Глубина, км']]
axes[1].bar(df['Время'], df['Глубина, км'], color=colors, alpha=0.7, width=0.04)
axes[1].set_title('Глубина очага землетрясения')
axes[1].set_ylabel('Глубина, км')
axes[1].axhline(y=70, color='red', linestyle='--', alpha=0.5, label='Граница (70 км)')
axes[1].legend()
axes[1].grid(True)
# ГРАФИК 3: Широта эпицентра (как скорость ветра)
axes[2].plot(df['Время'], df['Широта, °'], color='green', marker='s', linewidth=1, markersize=4)
axes[2].set_title('Широта эпицентра (географическое смещение)')
axes[2].set_ylabel('Широта, °')
axes[2].set_xlabel('Дата и время')
axes[2].axhline(y=0, color='black', linestyle='--', alpha=0.5, label='Экватор')
axes[2].legend()
axes[2].grid(True)
plt.tight_layout()
plt.savefig('earthquake_3graphs_30days.png', dpi=150, bbox_inches='tight')
plt.show()
# ==================================================
# СТАТИСТИКА
# ==================================================
print("\n" + "="*50)
print("СТАТИСТИКА ЗЕМЛЕТРЯСЕНИЙ ЗА 30 ДНЕЙ")
print("="*50)
print(f"Всего событий: {len(df)}")
print(f"Самое сильное: M{df['Магнитуда'].max():.1f}")
print(f"Средняя магнитуда: {df['Магнитуда'].mean():.2f}")
print(f"Самое глубокое: {df['Глубина, км'].max():.0f} км")
print(f"Самое мелкое: {df['Глубина, км'].min():.0f} км")
print(f"Средняя глубина: {df['Глубина, км'].mean():.0f} км")
print(f"Период: с {start_date} по {end_date}")
Результаты визуализации
График 1. Динамика магнитуды
Анализ графика магнитуды:
- Красная линия показывает изменение силы землетрясений во времени
- Оранжевая пунктирная линия — порог сильного землетрясения (M ≥ 6)
- Красная пунктирная линия — порог крупного землетрясения (M ≥ 7)
- Точки соответствуют отдельным сейсмическим событиям
График 2. Глубина очага
Анализ графика глубин:
- Темно-синие столбцы — землетрясения в земной коре (до 70 км)
- Голубые столбцы — глубокие землетрясения (>70 км)
- Красная пунктирная линия — граница между корой и мантией
График 3. Широта эпицентра
Анализ широтного распределения:
- Зеленая линия показывает изменение широты эпицентров во времени
- Черная пунктирная линия — экватор (0°)
- Положительные значения — северное полушарие, отрицательные — южное
Статистические результаты
| Показатель | Значение |
|---|---|
| Всего землетрясений (M ≥ 4.5) | (заполняется после выполнения) |
| Максимальная магнитуда | M (заполняется) |
| Средняя магнитуда | M (заполняется) |
| Максимальная глубина | (заполняется) км |
| Минимальная глубина | (заполняется) км |
| Средняя глубина | (заполняется) км |
Выводы
На основе анализа трех графиков можно сделать следующие выводы:
- По магнитуде: большинство землетрясений имеют магнитуду в диапазоне 4.5-5.5, крупные события (M≥7) происходят редко
- По глубине: преобладают неглубокие землетрясения (0-70 км), что соответствует зонам разломов земной коры
- По широте: эпицентры концентрируются в Тихоокеанском огненном кольце (между 60° ю.ш. и 60° с.ш.)
Практическая значимость
- Для науки: создана методика анализа сейсмических данных с открытым кодом
- Для экологии: определены зоны повышенной сейсмической опасности
- Для образования: разработан учебный кейс по работе с реальными API
Используемые источники данных
- USGS Earthquake Catalog: https://earthquake.usgs.gov/earthquakes/search/
- API документация: https://earthquake.usgs.gov/fdsnws/event/1/
