Kurs

Bu eğitimde, coğrafi uzamsal verilerle çalışmak için popüler olan iki paketi tanıyacaksınız: geopandas ve Shapely. Ardından bu iki paketi kullanarak coğrafi uzamsal verileri Python ile içe aktaracak ve 30 Ağustos'tan 18 Eylül'e kadar Kasırga Florence'ın izini çizeceksiniz.
Coğrafi Uzamsal Veri Nedir?
Mekansal veri, coğrafi uzamsal veri, CBS verisi veya jeoveri; bir binanın, caddenin, kasabanın, şehrin, ülkenin vb. coğrafi konumunu bir coğrafi koordinat sistemine göre tanımlayan sayısal veriler için kullanılan adlardır. Mekansal verilerden yalnızca konumu değil, aynı zamanda herhangi bir nesnenin uzunluğunu, boyutunu, alanını veya şeklini de öğrenebilirsiniz. Elde edebileceğiniz mekansal veri türlerine bir örnek: bir nesnenin enlem, boylam ve yükselti gibi koordinatlarıdır. Coğrafi Bilgi Sistemleri (CBS) veya diğer özel yazılım uygulamaları coğrafi uzamsal verilere erişmek, görselleştirmek, işlemek ve analiz etmek için kullanılabilir.
Neden Coğrafi Uzamsal Veri?
Coğrafi uzamsal verilerin günlük yaşamımızda çok sayıda uygulaması vardır. Örneğin, bir konumdan diğerine gitmek için kullandığınız Haritalar uygulaması. Her gün gördüğünüz bir diğer örnek ise hava durumu kanalıdır.

Evet, coğrafi uzamsal veriler bir şeyin konum bilgisini çevresindeki diğer şeylerle ilişkisi bağlamında göstermek için kullanılır: şehir haritasındaki eviniz, dünya haritasındaki kasırga vb. Bu eğitimde yıkıcı Kasırga Florence'a bakacak ve konumunu takip edeceksiniz.
Paket gereksinimleri
İleri atlamayın. Bu önemli bir bölüm. Gereksinimleri karşıladığınızdan emin değilseniz yeniden kontrol edin. Her şeyden önce aşağıdaki paketlerin tümünün kurulu olması gerekir.
- Pandas: veri yapıları ve veri analizi araçları sağlar
- Numpy: Python ile bilimsel hesaplama için temel bir paket
- SciPy:(“Sâypay” diye telaffuz edilir) matematik, bilim ve mühendislik için Python tabanlı açık kaynak yazılım ekosistemi
- RTree: çeşitli gelişmiş mekansal indeksleme özellikleri sunan libspatialindex için ctypes tabanlı bir Python sarmalayıcısı
- GDAL: raster ve vektör coğrafi uzamsal veri formatları için çevirici kütüphane
- Fiona: mekansal veri dosyalarını okur ve yazar
- Shapely: Geometrik nesneler, yüklemler ve işlemler
- GeoPandas: pandas'ın veri tiplerini genişleterek geometrik türler üzerinde mekansal işlemlere olanak tanır.
- PySAL: yüksek seviyeli uygulamaların geliştirilmesini desteklemek amacıyla Python ile yazılmış mekansal analiz fonksiyonları kütüphanesi.
- Matplotlib: Python 2D çizim kütüphanesi
- Missingno: Python için eksik veri görselleştirme modülü
Her şeyin çalıştığından emin olmak için paketleri yukarıdaki sırayla kurun. Bazı paketler diğerleri için önkoşuldur; örneğin: GeoPandas kurmak için Shapely gerekir ve Shapely kurmak için; RTree, GDAL ve Fiona yüklü olmalıdır. Bir paketi kurmanın en kolay yolu: pip install PACKAGE_NAME
Windows kullanıyorsanız ve bu şekilde kuramıyorsanız, ilgili paketleri indirmek için şu web sitesine bakın ve pip install PATH_TO_PACKAGE yapın.
Veri hakkında
Bildiğiniz gibi, korkutucu Kasırga Florence kısa süre önce Amerika Birleşik Devletleri'nin Doğu Kıyısı'nın bir kısmından geçti ve tahmini 17 milyar ABD doları hasara yol açtı. Bu eğitim, nereden geldiğini, ne zaman ve nerede güçlendiğini bulmanıza, bu doğal afet hakkında daha fazla şey anlamanıza ve Python'da analiz etmenize yardımcı olacaktır. Bu kasırga hakkında bilgi sağlayan birçok web sitesi var. Örneğin bu web sitesi, ABD'deki çeşitli fırtına ve kasırgalar için 1902'den 2018'e kadar veri sağlıyor; üzerinde çalışmanız için bolca veri var. Bu eğitimde yalnızca Kasırga Florence verilerini kullanacaksınız.
Ayrıca internetten ABD haritası coğrafi uzamsal verilerini kullanacaksınız. Eric Celeste'in blog yazısında ABD ilçe ve eyaletleri için her türlü sınır veri dosyası yer alıyor. Bu eğitimde kullanılan veri, ABD Eyaletleri, 5m, GeoJSON dosyasıdır.
# Load all importance packages
import geopandas
import numpy as np
import pandas as pd
from shapely.geometry import Point
import missingno as msn
import seaborn as sns
import matplotlib.pyplot as plt
% matplotlib inline
Önce, ilk coğrafi uzamsal veri çerçevesine bakalım: ABD Eyaletleri Coğrafi Verisi
# Getting to know GEOJSON file:
country = geopandas.read_file("data/gz_2010_us_040_00_5m.json")
country.head()

Yeni yüklediğiniz veri çerçevesinin türünü kontrol ettiğinizde bunun bir Geo Data Frame olduğunu görebilirsiniz; bu da bir Pandas DataFrame'in tüm normal özelliklerine sahiptir.
type(country)
geopandas.geodataframe.GeoDataFrame
Koordinatları içeren sütunun veri türünü kontrol etmek: GeoSeries.
type(country.geometry)
geopandas.geoseries.GeoSeries
GeoSeries içindeki her değer bir Shapely Nesnesidir. Şu türlerde olabilir:
- Nokta (Point)
- Çizgi (Line)
- Poligon (Polygon)
- Çoklu Poligon (MultiPolygon)
Her nesne farklı türde fiziksel nesneler için kullanılabilir: örneğin bina için Nokta, cadde için Çizgi, şehir için Poligon ve içinde birden çok şehir bulunan ülke için Çoklu Poligon. Her bir Geometrik nesne hakkında daha fazla bilgi için şu makaleyi okuyun: https://shapely.readthedocs.io/en/stable/manual.html#geometric-objects
type(country.geometry[0])
shapely.geometry.multipolygon.MultiPolygon
Bir Pandas DataFrame'e benzer şekilde, bir GeoDataFrame'in de, veri çerçevesinin içindeki geometry bilgisini kullanarak bir harita çizen plot özniteliği vardır:
country.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x1cfe68c1358>

Gördüğünüz gibi, ABD haritası çerçeveye göre nispeten küçük. Bunun nedeni bilginin Alaska, Hawaii ve Porto Riko'yu da içermesi ve bunların etrafa dağılmış olması. Bu eğitimin amacı için, kasırga bu iki eyaletin yakınına gitmediği için Alaska ve Hawaii'yi hariç tutabilirsiniz. Kendi grafiğinizi özelleştirmek için figür boyutu ve renk de ekleyebilirsiniz:
# Exclude Alaska and Hawaii for now
country[country['NAME'].isin(['Alaska','Hawaii']) == False].plot(figsize=(30,20), color='#3B3C6E');

O kadar da zor değil, değil mi! Artık ABD haritasına sahipsiniz, haydi kasırga verilerini içe aktaralım:
florence = pd.read_csv('data/florence.csv')
florence.head()

Keşifsel Veri Analizi
Herhangi bir veri kümesini yüklediğinizde her zaman ilk yapmanız gerekenler şunlardır:
- Bilgileri ve veri türünü kontrol etmek
- Herhangi bir eksik değer var mı
- İstatistiksel veriler
florence.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 105 entries, 0 to 104
Data columns (total 11 columns):
AdvisoryNumber 105 non-null object
Date 105 non-null object
Lat 105 non-null float64
Long 105 non-null float64
Wind 105 non-null int64
Pres 105 non-null int64
Movement 105 non-null object
Type 105 non-null object
Name 105 non-null object
Received 105 non-null object
Forecaster 104 non-null object
dtypes: float64(2), int64(2), object(7)
memory usage: 9.1+ KB
Eksik değerleri missingno paketiyle kontrol ediyoruz. Bu paket, eksik veriyi görselleştirerek gösteren kullanışlı bir pakettir. Aşağıda görebileceğiniz gibi, bu eğitim için ihtiyaç duymadığınız "Forecaster" sütununda yalnızca bir eksik değer var. Şimdilik bunu yok sayabilirsiniz.
# Notice you can always adjust the color of the visualization
msn.bar(florence, color='darkolivegreen');

Bazı istatistiksel bilgilere göz atın; ortalama rüzgar hızı, bu kasırganın maksimum ve minimum rüzgar hızı gibi bazıları çok yararlı olabilir.
# Statistical information
florence.describe()
| Lat | Long | Wind | Pres | |
|---|---|---|---|---|
| count | 105.000000 | 105.000000 | 105.000000 | 105.000000 |
| mean | 25.931429 | 56.938095 | 74.428571 | 981.571429 |
| std | 7.975917 | 20.878865 | 36.560765 | 22.780667 |
| min | 12.900000 | 18.400000 | 25.000000 | 939.000000 |
| 25% | 18.900000 | 41.000000 | 40.000000 | 956.000000 |
| 50% | 25.100000 | 60.000000 | 70.000000 | 989.000000 |
| 75% | 33.600000 | 76.400000 | 105.000000 | 1002.000000 |
| max | 42.600000 | 82.900000 | 140.000000 | 1008.000000 |
Çoğu veri için temizlik yapmanız ve yalnızca üzerinde çalışmanız gerekenleri almanız gerekir. Burada yalnızca zamanı, koordinatları: enlem ve boylamı, Rüzgar hızını, Basıncı ve Adı ihtiyacınız var. Movement ve Type isteğe bağlıdır, ancak diğerleri kaldırılabilir.
# dropping all unused features:
florence = florence.drop(['AdvisoryNumber', 'Forecaster', 'Received'], axis=1)
florence.head()

Normalde veriyi tek başına çizdiriyorsanız koordinat için ekstra özen göstermeye gerek yoktur. Ancak haritadaki görünüme benzer görünmesini istiyorsanız boylam ve enlemi kontrol etmek önemlidir. Burada boylam batıdır; veriyi doğru çizdirmek için sayının başına "-" eklemeniz gerekir:
# Add "-" in front of the number to correctly plot the data:
florence['Long'] = 0 - florence['Long']
florence.head()

Ardından, Kasırga koordinatlarını oluşturmak için Enlem ve Boylamı birleştirebilir ve bunu görselleştirme amacıyla GeoPoint'e dönüştürebilirsiniz.
# Combining Lattitude and Longitude to create hurricane coordinates:
florence['coordinates'] = florence[['Long', 'Lat']].values.tolist()
florence.head()

# Change the coordinates to a geoPoint
florence['coordinates'] = florence['coordinates'].apply(Point)
florence.head()

florence veri çerçevesinin ve florence verisinin coordinates sütununun türünü kontrol ediyoruz. Bunlar pandas DataFrame ve pandas Series.
type(florence)
pandas.core.frame.DataFrame
type(florence['coordinates'])
pandas.core.series.Series
Veriyi coğrafi uzamsal veriye dönüştürdükten sonra, florence veri çerçevesinin ve Florence verisinin coordinates sütununun türünü tekrar kontrol edeceğiz. Artık bunlar Geo DataFrame ve GeoSeries.
# Convert the count df to geodf
florence = geopandas.GeoDataFrame(florence, geometry='coordinates')
florence.head()

type(florence)
geopandas.geodataframe.GeoDataFrame
type(florence['coordinates'])
geopandas.geoseries.GeoSeries
Dikkat edin: Artık bir Geo DataFrame ve Geo Series olmasına rağmen hâlâ normal bir DataFrame ve Series gibi davranıyor. Bu, veri çerçevesi üzerinde filtreleme, groupby işlemleri yapabileceğiniz veya bir sütunun min, max ya da ortalama değerlerini çıkarabileceğiniz anlamına gelir.
# Filtering from before the hurricane was named.
florence[florence['Name']=='Six']

# Groupping by name to see how many names it has in the data set:
florence.groupby('Name').Type.count()
Name
FLORENCE 6
Florence 85
SIX 4
Six 10
Name: Type, dtype: int64
Kasırga Florence'ın ortalama rüzgar hızını bulma:
print("Mean wind speed of Hurricane Florence is {} mph and it can go up to {} mph maximum".format(round(florence.Wind.mean(),4),
florence.Wind.max()))
Mean wind speed of Hurricane Florence is 74.4286 mph and it can go up to 140 mph maximum
Yani Kasırga Florence'ın ortalama rüzgar hızı saatte 74,43 mil (saatte 119,78 km) ve maksimum hızı saatte 140 mil (saatte 225,308 km). Bu rüzgar hızının ne kadar ürkütücü olduğunu hayal etmek için, Birleşik Krallık Kraliyet Donanması tarafından geliştirilen Beaufort Rüzgar Ölçeği, rüzgar etkilerinin su ve karadaki görünümünü gösterir. Saatte 48 ila 55 mil hızda bile ağaçları kırıp köklerinden sökebilir ve "önemli yapısal hasara" yol açabilir.

Bu anda orada olmak istemezsiniz.
Görselleştirme
Pandas DataFrame'e benzer şekilde, bir GeoDataFrame'in de .plot özniteliği vardır. Ancak bu öznitelik, GeoDataFrame içindeki koordinat bilgisini kullanarak eşleme yapar. Bir göz atalım:
florence.plot(figsize=(20,10));

Ne oldu? Yalnızca bir sürü noktayı, hiçbir referans olmadan görüyorsunuz. Yanlış giden bir şey mi var?
Hayır, her şey yolunda. Bu veri çerçevesi yalnızca her zaman noktasında Kasırga Florence'ın koordinat (konum) bilgisini içerdiğinden, sadece boş bir harita üzerinde konumu çizebiliriz.
O hâlde bir sonraki adım, kasırganın konumunu ABD haritası üzerinde çizmek; böylece nereye çarptığını ve o anda ne kadar güçlü olduğunu görebiliriz. Bunu yapmak için, ABD haritası koordinatlarını (başta yüklediğimiz veriler) temel olarak kullanacak ve üzerine Kasırga Florence'ın konumunu çizeceksiniz.
# Plotting to see the hurricane overlay the US map:
fig, ax = plt.subplots(1, figsize=(30,20))
base = country[country['NAME'].isin(['Alaska','Hawaii']) == False].plot(ax=ax, color='#3B3C6E')
# plotting the hurricane position on top with red color to stand out:
florence.plot(ax=base, color='darkred', marker="*", markersize=10);

Harika görünüyor! Şimdi, şu ayrıntılarla tamamlayacağız:
- Başlık ekleme
- Kasırga konumunu rüzgar hızına göre renklendirme; böylece her şehre vurduğunda ne kadar güçlü olduğunu görebilirsiniz.
- Eksenleri kaldırma
- Lejand ekleme
- Sonucu daha sonra kullanmak üzere bir resim dosyasına kaydetme
fig, ax = plt.subplots(1, figsize=(20,20))
base = country[country['NAME'].isin(['Alaska','Hawaii']) == False].plot(ax=ax, color='#3B3C6E')
florence.plot(ax=base, column='Wind', marker="<", markersize=10, cmap='cool', label="Wind speed(mph)")
_ = ax.axis('off')
plt.legend()
ax.set_title("Hurricane Florence in US Map", fontsize=25)
plt.savefig('Hurricane_footage.png',bbox_inches='tight');

Demek ki kasırga, doğu kıyısı açıklarındayken en güçlü halindeydi. Karaya yaklaştıkça güç kaybetmeye başladı, ancak saatte 60 ile 77 mil aralığındaki rüzgar hızlarında bile korkunç hasarlara yol açabilir.
Sonuç
Harika iş! Python'da coğrafi uzamsal verilerle çalışmak için gereken bazı temel adımları öğrendiniz. Ayrıca coğrafi uzamsal verileri nasıl görselleştireceğinizi ve bir hikâye anlatmak için çizimlerin şekil, renk ve bindirme katmanlarını nasıl özelleştireceğinizi öğrendiniz. Becerilerinizi uygulamak isterseniz, elinizi denemeniz için çevrimiçi olarak çok sayıda coğrafi uzamsal veri mevcut. Yukarıda verdiğim hava durumu web sitesi bunlara bir örnek.
Kaynaklar için lütfen şu kitaba göz atın: Karim Bahgat'ın (2015) “Python Geospatial Development Essentials” adlı eseri daha derinlemesine bir rehberlik sunar.
Benimle iletişime geçmek isterseniz dqvu.ubc@gmail.com adresine e-posta gönderebilir veya LinkedIn üzerinden bağlantı kurabilirsiniz. İyi öğrenmeler ve güvende kalın!
Python'da coğrafi uzamsal veriler hakkında daha fazla bilgi edinmek isterseniz, DataCamp'in Python'da Coğrafi Uzamsal Verileri Görselleştirme kursunu alın.
Aşağıda bu eğitimde kullanılan veriler yer almaktadır:
