%matplotlib inline
from datetime import datetime as dt
from datetime import timedelta
import pandas as pd
import geopandas
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import numpy as np
import seaborn as sns
import contextily as cx
import matplotlib.ticker as mticker
from SeismicPortal.dl_quakes import CANARY_BOX, SeismicPortal
sns.set_theme()
plt.rcParams['figure.figsize'] = [30, 15]
sp = SeismicPortal()
# results = sp.download_earthquakes(start_time=dt.now() - timedelta(days=14), **CANARY_BOX)
results = sp.download_earthquakes(start_time=dt.now() - timedelta(days=60), **CANARY_BOX)
1737 earthquakes downloaded.
master_df = pd.DataFrame([q.get("properties") for q in results])
# Tranform data
# Remove timezone info to remove numpy deprecation warning
master_df["time"] = master_df["time"].apply(lambda x: x.strip("Z"))
master_df["lastupdate"] = master_df["lastupdate"].apply(lambda x: x.strip("Z"))
master_df["lastupdate"] = pd.to_datetime(master_df["lastupdate"])
master_df["time"] = pd.to_datetime(master_df["time"])
master_df["date"] = master_df["time"].dt.date
# Enhance data
# Create magnitude bins
m_bins = [
pd.Interval(left=0, right=2),
pd.Interval(left=2, right=3),
pd.Interval(left=3, right=4),
pd.Interval(left=4, right=5),
pd.Interval(left=5, right=float("inf"))
]
# m_bins_small = [
# pd.Interval(left=-float("inf"), right=3),
# pd.Interval(left=3, right=float("inf")),
# ]
magnitude_ranges = []
for index, row in master_df.iterrows():
for r in m_bins:
if row["mag"] in r:
magnitude_ranges.append(r)
master_df['mag_range'] = magnitude_ranges
# Auto create bins
# master_df['mag_range'] = pd.cut(master_df['mag'], bins = 5)
# Add mean magnitude and depth per day
master_df = pd.merge(master_df, master_df.groupby("date").mean().round(decimals=3)[["mag", "depth"]], on="date", suffixes=("", "_mean"), how="right")
master_df = master_df.sort_values("time", ascending=False, ignore_index=True)
master_df
lastupdate | magtype | evtype | lon | auth | lat | depth | unid | mag | time | source_id | source_catalog | flynn_region | date | mag_range | mag_mean | depth_mean | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2021-10-09 12:56:00 | ml | ke | -17.84 | MDD | 28.55 | 14.0 | 20211009_0000175 | 2.8 | 2021-10-09 12:49:28.300 | 1046131 | EMSC-RTS | CANARY ISLANDS, SPAIN REGION | 2021-10-09 | (2, 3] | 2.754 | 13.761 |
1 | 2021-10-09 12:21:00 | ml | ke | -17.85 | MDD | 28.57 | 14.0 | 20211009_0000167 | 2.8 | 2021-10-09 12:17:10.900 | 1046122 | EMSC-RTS | CANARY ISLANDS, SPAIN REGION | 2021-10-09 | (2, 3] | 2.754 | 13.761 |
2 | 2021-10-09 13:03:00 | ml | ke | -17.83 | MDD | 28.46 | 18.0 | 20211009_0000176 | 2.4 | 2021-10-09 12:06:57.100 | 1046132 | EMSC-RTS | CANARY ISLANDS, SPAIN REGION | 2021-10-09 | (2, 3] | 2.754 | 13.761 |
3 | 2021-10-09 12:00:00 | ml | ke | -17.86 | MDD | 28.58 | 10.0 | 20211009_0000163 | 2.4 | 2021-10-09 11:53:09.600 | 1046118 | EMSC-RTS | CANARY ISLANDS, SPAIN REGION | 2021-10-09 | (2, 3] | 2.754 | 13.761 |
4 | 2021-10-09 11:33:00 | ml | ke | -17.84 | MDD | 28.56 | 11.0 | 20211009_0000158 | 3.4 | 2021-10-09 11:25:53.700 | 1046065 | EMSC-RTS | CANARY ISLANDS, SPAIN REGION | 2021-10-09 | (3, 4] | 2.754 | 13.761 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
1732 | 2021-08-12 05:41:00 | ml | ke | -16.25 | MDD | 28.16 | 22.0 | 20210812_0000062 | 1.8 | 2021-08-12 05:18:56.700 | 1022382 | EMSC-RTS | CANARY ISLANDS, SPAIN REGION | 2021-08-12 | (0, 2] | 1.650 | 15.000 |
1733 | 2021-08-11 17:44:00 | ml | ke | -16.26 | MDD | 28.13 | 35.0 | 20210811_0000155 | 2.1 | 2021-08-11 17:37:33.100 | 1022199 | EMSC-RTS | CANARY ISLANDS, SPAIN REGION | 2021-08-11 | (2, 3] | 1.925 | 21.000 |
1734 | 2021-08-11 07:05:00 | ml | ke | -17.85 | MDD | 29.53 | 10.0 | 20210811_0000060 | 2.6 | 2021-08-11 06:42:25.400 | 1022071 | EMSC-RTS | CANARY ISLANDS, SPAIN REGION | 2021-08-11 | (2, 3] | 1.925 | 21.000 |
1735 | 2021-08-11 07:13:00 | ml | ke | -16.30 | MDD | 27.98 | 24.0 | 20210811_0000062 | 1.5 | 2021-08-11 06:25:15.700 | 1022075 | EMSC-RTS | CANARY ISLANDS, SPAIN REGION | 2021-08-11 | (0, 2] | 1.925 | 21.000 |
1736 | 2021-08-11 02:50:00 | ml | ke | -16.20 | MDD | 28.15 | 15.0 | 20210811_0000017 | 1.5 | 2021-08-11 02:34:55.400 | 1022018 | EMSC-RTS | CANARY ISLANDS, SPAIN REGION | 2021-08-11 | (0, 2] | 1.925 | 21.000 |
1737 rows × 17 columns
df = master_df[master_df["time"] >= dt(2021, 9, 1)]
fig, ax = plt.subplots()
ax.tick_params(axis='x', rotation=45, labelsize=9, direction="in")
ax.set_title(f"Earthquakes over time by magnitude range (last {df.iloc[0].date - df.iloc[-1].date})")
sns.countplot(data=df.sort_values("date"), x="date", palette="flare", hue="mag_range", hue_order=df["mag_range"].sort_values().unique(), dodge=True);
df = master_df[master_df["time"] >= dt(2021, 9, 28)]
fig, ax = plt.subplots()
ax.set_title(f"Earthquakes over time by depth (last {df.iloc[0].date - df.iloc[-1].date})")
ax.tick_params(axis='x', rotation=45, labelsize=9, direction="in")
ax.yaxis.set_major_formatter(mticker.FormatStrFormatter('%.1f km'))
ax.invert_yaxis()
sns.scatterplot(data=df, x="time", y="depth", hue="mag", size="mag", sizes=(10, 200), palette="seismic");
df = master_df[master_df["date"] < master_df.iloc[0].date]
fig, ax = plt.subplots()
ax.tick_params(axis='x', rotation=45, labelsize=9, direction="in")
ax.set_title(f"Earthquakes over time (last {df.iloc[0].date - df.iloc[-1].date})")
sns.lineplot(data=df.groupby("date").size().reset_index(), x="date", y=df.groupby("date").size().reset_index()[0]);
df = master_df[master_df["time"] >= dt.now() - timedelta(days=45)]
fig, ax = plt.subplots()
ax.tick_params(axis='x', rotation=45, labelsize=9, direction="in")
ax.set_title(f"Earthquakes over time with daily mean magnitude (last {df.iloc[0].date - df.iloc[-1].date})")
sns.countplot(data=df.sort_values("date"), x="date", palette="flare", hue="mag_mean", dodge=False);
print(f"This notebook was last updated: {dt.utcnow()} UTC")
This notebook was last updated: 2021-10-09 13:05:15.977947 UTC