Мировая сейсмическая активность за последние 30 дней
Материал из Поле цифровой дидактики
Мониторинг мировой сейсмической активности
Общая информация
- Авторы: Студентки группы - PolezhaevaMA, Самира Мохаммад
- Дата исследования: 15 апрель 2026
- Источник данных: USGS Earthquake Hazards Program
- Период анализа: последние 30 дней
Цель исследования
Проанализировать глобальную сейсмическую активность за последние 30 дней для выявления закономерностей в изменении магнитуды, глубины и географического положения эпицентров землетрясений.
Задачи проекта
- Собрать данные о землетрясениях магнитудой ≥ 4.5 через USGS API
- Обработать и структурировать данные с помощью библиотеки Pandas
- Построить три графика: динамика магнитуды, распределение глубин, широтное смещение эпицентров
- Рассчитать основные статистические показатели
- Интерпретировать полученные результаты
Программный код
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) | 549 |
| Максимальная магнитуда | 7.5 М |
| Средняя магнитуда | 4.86 М |
| Максимальная глубина | 650 км |
| Минимальная глубина | 6 км |
Выводы
На основе анализа трех графиков можно сделать следующие выводы:
- По магнитуде: большинство землетрясений имеют магнитуду в диапазоне 4.5-5.5, крупные события (M≥7) происходят редко
- По глубине: преобладают неглубокие землетрясения (0-70 км), что соответствует зонам разломов земной коры
- По широте: эпицентры концентрируются в Тихоокеанском огненном кольце (между 60° ю.ш. и 60° с.ш.)
Практическая значимость
- Для науки: создана методика анализа сейсмических данных с открытым кодом
- Для экологии: определены зоны повышенной сейсмической опасности
- Для образования: разработан учебный кейс по работе с реальными API
Используемые технологии
| Компонент | Технология | Назначение |
|---|---|---|
| API | USGS FDSN Web Service | Получение данных о землетрясениях в реальном времени |
| Язык программирования | Python | Основной язык разработки |
| HTTP-запросы | Requests | Отправка запросов к API и получение ответов |
| Обработка данных | Pandas | Структурирование, фильтрация и анализ данных |
| Визуализация | Matplotlib | Построение графиков магнитуды, глубины и широты |
| Работа с JSON | json | Парсинг ответов API |
| Работа с данными | datetime | Вычисление временных интервалов |
| Формат хранения | CSV | Сохранение результатов для дальнейшего анализа |
Используемые источники данных
- USGS Earthquake Catalog: https://earthquake.usgs.gov/earthquakes/search/
- API документация: https://earthquake.usgs.gov/fdsnws/event/1/
