AFAD ham verisinden bina bazlı sarsıntı özeti çıkarmak

这篇内容暂时只有 Türkçe 版本,以下是原文。

AFAD’ın açık deprem kataloğunu (son 10 yıl, ~45 bin kayıt, CSV) kendi mahallem için sorgulanabilir hale getirmeye çalışırken işe yarar bir ara adım buldum: her kaydı en yakın bina kümesine bağlayıp “bu bina bu büyüklükte kaç kez sallandı” sorusunu cevaplamak. Amaç hasar tahmini değil; acil durum çantası ve tatbikat planlamasında kullanacağım kaba bir etki profili.

Veriyi indirip sütun adlarını sabitledim, çünkü AFAD zaman zaman sütun sırasını değiştiriyor:

curl -sL "https://deprem.afad.gov.tr/event-export?type=csv" -o afad.csv
python3 - <<'EOF'
import pandas as pd
df = pd.read_csv("afad.csv", sep=";")
df.columns = [c.strip().lower() for c in df.columns]
df = df.rename(columns={"enlem":"lat","boylam":"lon","büyüklük":"mag","tarih":"date"})
df = df.dropna(subset=["lat","lon","mag"])
df["date"] = pd.to_datetime(df["date"], errors="coerce")
df = df[df["date"] >= "2014-01-01"]
df.to_parquet("afad_temiz.parquet")
print(len(df))
EOF

Bina noktalarımı ayrı bir CSV’de tuttum (enlem, boylam, kat sayısı). Mesafeyi haversine ile hesaplayıp 25 km yarıçapındaki kayıtları topladım:

import numpy as np, pandas as pd
df = pd.read_parquet("afad_temiz.parquet")
b = pd.read_csv("binalar.csv")

def mesafe(lat1, lon1, lat2, lon2):
    R = 6371.0
    p1, p2 = np.radians(lat1), np.radians(lat2)
    dp, dl = np.radians(lat2-lat1), np.radians(lon2-lon1)
    a = np.sin(dp/2)**2 + np.cos(p1)*np.cos(p2)*np.sin(dl/2)**2
    return 2*R*np.arcsin(np.sqrt(a))

for _, r in b.iterrows():
    d = mesafe(r["lat"], r["lon"], df["lat"].values, df["lon"].values)
    yakin = df[d <= 25]
    print(r["ad"], len(yakin), round(yakin["mag"].max(),1),
          int((yakin["mag"] >= 4).sum()))

Bunu neden böyle yaptım: büyüklük tek başına anlamlı değil, mesafe ve zemin koşuluyla birlikte okunması gerekiyor. 25 km’yi keyfi seçmedim; kendi ilçemde 4’ün üzerindeki kayıtların çoğu bu yarıçapın içinde kalıyor, dışına çıkınca sayı hızla düşüyor. Yarıçapı büyütmek sayıyı artırıyor ama “hissedildi” bilgisini taşımıyor; bu yüzden M≥4 filtresini ayrı tutuyorum. Maliyeti şu: her bina için tüm katalog taranıyor, 45 bin kayıt × 200 bina = 9 milyon mesafe hesabı, tek çekirdekte birkaç dakika. Vektörize etmeden döngü yazarsan saatler sürer.

Nerede çöker: katalogdaki konum çözünürlüğü kırsalda 5-10 km’ye kadar düşebiliyor, yani 25 km yarıçap “hissedildi” demek değil. Zemin sınıfı verisi çoğu bina için yok; ben kat sayısını kaba bir yer tutucu olarak kullandım, bu yanıltıcı olabilir. Bir de artçı dizileri sayıyı şişiriyor: aynı gün 30 artçı, tabloda 30 satır gibi görünüyor, bu yüzden 24 saatlik pencerede en büyüğü almak daha dürüst bir özet.

Kendi tablomda komşu iki sokağın sayıları 3 katı fark ediyor; bunun istasyon dağılımından mı yoksa gerçekten yerel zemin farkından mı geldiğini nasıl ayırıyorsunuz?

0
赞同度 100% · 0 条评论 · 1 阅读

0 条评论

支持 Markdown · 回复会实时推送给对方

还没有评论,写下第一条。