Мировая сейсмическая активность за последние 30 дней: различия между версиями

Материал из Поле цифровой дидактики
Нет описания правки
Строка 1: Строка 1:
== Введение ==
= Мониторинг мировой сейсмической активности =
'''Цель анализа:''' Изучение пространственно-временных паттернов перемещений животных на основе открытых данных Movebank.


'''Источник данных:''' [https://www.movebank.org/ Movebank] - база данных трекинга животных Института Макса Планка.
== Метаинформация ==
* '''Автор:''' Студент(ки) группы ИНДОР-211 - [PolezhaevaMA]
* '''Дата исследования:''' {{CURRENTDAY}} {{CURRENTMONTHNAME}} {{CURRENTYEAR}}
* '''Источник данных:''' USGS Earthquake Hazards Program
* '''Период анализа:''' последние 30 дней
* '''Порог магнитуды:''' M ≥ 4.5


== Загрузка и обработка данных ==
== Цель исследования ==
<syntaxhighlight lang="python" line="line">
Проанализировать глобальную сейсмическую активность за последние 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 numpy as np
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}")


# Загрузка данных из Movebank API
try:
def load_movebank_data():
     response = requests.get(URL, timeout=30)
     MOVE_BASE_URL = "https://www.movebank.org/movebank/service/direct-read&quot;
     print(f"Статус ответа: {response.status_code}")
    STUDY_ID = 481484139  # ID исследования миграции птиц
      
    params = {
        "entity_type": "event",
        "study_id": STUDY_ID,
        "format": "csv",
        "attributes": "individual_id,timestamp,location_long,location_lat,ground_speed,heading"
    }
      
      
    response = requests.get(MOVE_BASE_URL, params=params)
     if response.status_code == 200 and response.text.strip():
     if response.status_code == 200:
         data = response.json()
        df = pd.read_csv(pd.compat.StringIO(response.text))
         print("✓ JSON успешно загружен")
         df['timestamp'] = pd.to_datetime(df['timestamp'])
         return df
     else:
     else:
         # Демонстрационные данные при недоступности API
         print("✗ Пустой ответ от сервера")
         return generate_demo_data()
        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 = load_movebank_data()
# ГРАФИК 3: Широта эпицентра (как скорость ветра)
print(f"Загружено записей: {len(df)}")
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 дней для выявления закономерностей в изменении магнитуды, глубины и географического положения эпицентров землетрясений.

Задачи проекта

  1. Собрать данные о землетрясениях магнитудой ≥ 4.5 через USGS API
  2. Обработать и структурировать данные с помощью библиотеки Pandas
  3. Построить три графика: динамика магнитуды, распределение глубин, широтное смещение эпицентров
  4. Рассчитать основные статистические показатели
  5. Интерпретировать полученные результаты

Гипотеза исследования

За 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. Динамика магнитуды

Файл:Earthquake 3graphs 30days.png
Три графика сейсмической активности: магнитуда, глубина, широта

Анализ графика магнитуды:

  • Красная линия показывает изменение силы землетрясений во времени
  • Оранжевая пунктирная линия — порог сильного землетрясения (M ≥ 6)
  • Красная пунктирная линия — порог крупного землетрясения (M ≥ 7)
  • Точки соответствуют отдельным сейсмическим событиям

График 2. Глубина очага

Анализ графика глубин:

  • Темно-синие столбцы — землетрясения в земной коре (до 70 км)
  • Голубые столбцы — глубокие землетрясения (>70 км)
  • Красная пунктирная линия — граница между корой и мантией

График 3. Широта эпицентра

Анализ широтного распределения:

  • Зеленая линия показывает изменение широты эпицентров во времени
  • Черная пунктирная линия — экватор (0°)
  • Положительные значения — северное полушарие, отрицательные — южное

Статистические результаты

Показатель Значение
Всего землетрясений (M ≥ 4.5) (заполняется после выполнения)
Максимальная магнитуда M (заполняется)
Средняя магнитуда M (заполняется)
Максимальная глубина (заполняется) км
Минимальная глубина (заполняется) км
Средняя глубина (заполняется) км

Выводы

На основе анализа трех графиков можно сделать следующие выводы:

  1. По магнитуде: большинство землетрясений имеют магнитуду в диапазоне 4.5-5.5, крупные события (M≥7) происходят редко
  2. По глубине: преобладают неглубокие землетрясения (0-70 км), что соответствует зонам разломов земной коры
  3. По широте: эпицентры концентрируются в Тихоокеанском огненном кольце (между 60° ю.ш. и 60° с.ш.)

Практическая значимость

  • Для науки: создана методика анализа сейсмических данных с открытым кодом
  • Для экологии: определены зоны повышенной сейсмической опасности
  • Для образования: разработан учебный кейс по работе с реальными API

Используемые источники данных