Мировая сейсмическая активность за последние 30 дней: различия между версиями
Материал из Поле цифровой дидактики
Создана пустая страница |
Нет описания правки |
||
| (не показано 14 промежуточных версий 2 участников) | |||
| Строка 1: | Строка 1: | ||
= Мониторинг мировой сейсмической активности = | |||
== Общая информация == | |||
* '''Авторы:''' Студентки группы [[Категория:ИНДОР-211]] - [[Участник:PolezhaevaMA|PolezhaevaMA]], [[Участник:Самира Мохаммад|Самира Мохаммад]] | |||
* '''Дата исследования:''' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}} | |||
* '''Источник данных:''' USGS Earthquake Hazards Program | |||
* '''Период анализа:''' последние 30 дней | |||
== Цель исследования == | |||
Проанализировать глобальную сейсмическую активность за последние 30 дней для выявления закономерностей в изменении магнитуды, глубины и географического положения эпицентров землетрясений. | |||
== Задачи проекта == | |||
# Собрать данные о землетрясениях магнитудой ≥ 4.5 через USGS API | |||
# Обработать и структурировать данные с помощью библиотеки Pandas | |||
# Построить три графика: динамика магнитуды, распределение глубин, широтное смещение эпицентров | |||
# Рассчитать основные статистические показатели | |||
# Интерпретировать полученные результаты | |||
== Программный код == | |||
<syntaxhighlight lang="python"> | |||
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}") | |||
</syntaxhighlight> | |||
== Результаты визуализации == | |||
=== График 1. Динамика магнитуды === | |||
[[Файл:Магнитура.png|thumb|center|1000px|Динамика магнитуды за последние 30 дней]] | |||
'''Анализ графика магнитуды:''' | |||
* Красная линия показывает изменение силы землетрясений во времени | |||
* Оранжевая пунктирная линия — порог сильного землетрясения (M ≥ 6) | |||
* Красная пунктирная линия — порог крупного землетрясения (M ≥ 7) | |||
* Точки соответствуют отдельным сейсмическим событиям | |||
=== График 2. Глубина очага === | |||
[[Файл:Глубина очага.png|thumb|center|1000px|Глубина очага землетрясения]] | |||
'''Анализ графика глубин:''' | |||
* Темно-синие столбцы — землетрясения в земной коре (до 70 км) | |||
* Голубые столбцы — глубокие землетрясения (>70 км) | |||
* Красная пунктирная линия — граница между корой и мантией | |||
=== График 3. Широта эпицентра === | |||
[[Файл:Широта эпицентра.png|thumb|center|1000px|Широта эпицентра]] | |||
'''Анализ широтного распределения:''' | |||
* Зеленая линия показывает изменение широты эпицентров во времени | |||
* Черная пунктирная линия — экватор (0°) | |||
* Положительные значения — северное полушарие, отрицательные — южное | |||
== Статистические результаты == | |||
{| class="wikitable" | |||
! Показатель !! Значение | |||
|- | |||
| Всего землетрясений (M ≥ 4.5) || 549 | |||
|- | |||
| Максимальная магнитуда || 7.5 М | |||
|- | |||
| Средняя магнитуда || 4.86 М | |||
|- | |||
| Максимальная глубина || 650 км | |||
|- | |||
| Минимальная глубина || 6 км | |||
|} | |||
== Выводы == | |||
На основе анализа трех графиков можно сделать следующие выводы: | |||
# '''По магнитуде:''' большинство землетрясений имеют магнитуду в диапазоне 4.5-5.5, крупные события (M≥7) происходят редко | |||
# '''По глубине:''' преобладают неглубокие землетрясения (0-70 км), что соответствует зонам разломов земной коры | |||
# '''По широте:''' эпицентры концентрируются в Тихоокеанском огненном кольце (между 60° ю.ш. и 60° с.ш.) | |||
== Практическая значимость == | |||
* '''Для науки''': создана методика анализа сейсмических данных с открытым кодом | |||
* '''Для экологии''': определены зоны повышенной сейсмической опасности | |||
* '''Для образования''': разработан учебный кейс по работе с реальными API | |||
== Используемые технологии == | |||
{| class="wikitable" style="width: 100%;" | |||
|- | |||
! style="width: 20%;" | Компонент | |||
! style="width: 25%;" | Технология | |||
! style="width: 55%;" | Назначение | |||
|- | |||
| '''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/ | |||
[[Категория:BigDataWorks]] | |||
[[Категория:ИНДОР-211]] | |||
[[Категория:Работы ИНДОР-211]] | |||
Текущая версия от 12:09, 14 апреля 2026
Мониторинг мировой сейсмической активности
Общая информация
- Авторы: Студентки группы - PolezhaevaMA, Самира Мохаммад
- Дата исследования: 17 апрель 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/
