!pip install geopandas
Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/ Requirement already satisfied: geopandas in /usr/local/lib/python3.7/dist-packages (0.10.2) Requirement already satisfied: fiona>=1.8 in /usr/local/lib/python3.7/dist-packages (from geopandas) (1.8.21) Requirement already satisfied: pyproj>=2.2.0 in /usr/local/lib/python3.7/dist-packages (from geopandas) (3.2.1) Requirement already satisfied: shapely>=1.6 in /usr/local/lib/python3.7/dist-packages (from geopandas) (1.8.2) Requirement already satisfied: pandas>=0.25.0 in /usr/local/lib/python3.7/dist-packages (from geopandas) (1.3.5) Requirement already satisfied: six>=1.7 in /usr/local/lib/python3.7/dist-packages (from fiona>=1.8->geopandas) (1.15.0) Requirement already satisfied: click-plugins>=1.0 in /usr/local/lib/python3.7/dist-packages (from fiona>=1.8->geopandas) (1.1.1) Requirement already satisfied: cligj>=0.5 in /usr/local/lib/python3.7/dist-packages (from fiona>=1.8->geopandas) (0.7.2) Requirement already satisfied: setuptools in /usr/local/lib/python3.7/dist-packages (from fiona>=1.8->geopandas) (57.4.0) Requirement already satisfied: certifi in /usr/local/lib/python3.7/dist-packages (from fiona>=1.8->geopandas) (2022.5.18.1) Requirement already satisfied: click>=4.0 in /usr/local/lib/python3.7/dist-packages (from fiona>=1.8->geopandas) (7.1.2) Requirement already satisfied: attrs>=17 in /usr/local/lib/python3.7/dist-packages (from fiona>=1.8->geopandas) (21.4.0) Requirement already satisfied: munch in /usr/local/lib/python3.7/dist-packages (from fiona>=1.8->geopandas) (2.5.0) Requirement already satisfied: pytz>=2017.3 in /usr/local/lib/python3.7/dist-packages (from pandas>=0.25.0->geopandas) (2022.1) Requirement already satisfied: numpy>=1.17.3 in /usr/local/lib/python3.7/dist-packages (from pandas>=0.25.0->geopandas) (1.21.6) Requirement already satisfied: python-dateutil>=2.7.3 in /usr/local/lib/python3.7/dist-packages (from pandas>=0.25.0->geopandas) (2.8.2)
Merhabalar, öncelikle bugünkü proje konuma biraz değinmek istiyorum, ardından bu notebook boyunca karşılaşacağımız içeriklere dair ufak bilgiler verip, daha sonra detaylandıracağım.
Bu Veri Analizi projesinin amacı, İzmir'deki Acil Durum Toplanma Alanları'nın yer bilgilerini, adeti gibi bilgileri aynı zamanda bazen interaktif bir şekilde, çeşitli görselleştirme yöntemleri kullanarak analiz etmekti. Görselleştirme için kullandığım başlıca kütüphaneler de GeoPandas ve Plotly oldu.
Verilerimden ilkini, İzmir Büyükşehir Belediyesi Açık Veri Portalı'ndan .csv formatı ile indirdim, ikinci verim olan, coğrafi konum bilgilerini içeren klasörü de "https://data.humdata.org/" bağlantılı siteden indirdim. Tabii buradaki veri Türkiye'deki bütün idari bölgelerin sınırlarını içeren bir veriydi ama daha sonrada göreceğimiz üzere bu veriden sadece İzmir'e özel bir filtreleme yapmak mümkün.
Projemizin adımlarını sıralayacak olursak;
- Öncelikle IBB Veri Portalı'ndan indirdiğimiz "acil_durum_alani.csv" adlı dosyayı anlayıp, gerekli haritalandırmalar ve tablolar için işimize yarayacak şekilde oynamalar yapıyoruz.
- Ardından Folium kütüphanesini kullanarak görmek istediğimiz ilçe ve mahallenin input'unu giriyoruz ki böylece haritayı yorumlamamız çok daha kolay ve manuel hale gelmiş oluyor.
- Bu noktaların ısı haritasını oluşturuyoruz. Ardından harita üzerinde bu toplanma alanlarının dağılımlarını ve sayısal adetini incelemek için Marker Cluster kullanarak bir haritalandırma daha yapıyoruz.
- Bu adımda ise Choropleth haritası kullanacağız. Choropleth nedir? Bir bölgenin siyasi haritası diyebiliriz. İlgili bölge verisinin sınırlarını .shp uzantılı bir veriseti içinde tutar ve burada "geometry" adında bir kolon bulunur, bu kolon, içinde polygon veya linestring barındırır ve bunlar enlem-boylam bilgilerinden oluşur.
- İlgili .shp uzantılı dosyayı okuduktan sonra, işimize yarayacak filtreleme işlemlerini yaparız ve böylece Choropleth haritamız için coğrafi verilerimiz hazır hale gelir.
- Bu adımdan sonra ise Plotly kütüphanemiz yardımıyla verilerimizin tablolarını ve treemap'ini çizerek onu anlamlandırmaya devam edeceğiz.
Ön bilgilendirmemizi yaptığımıza göre başlayabiliriz.
import pandas as pd
import geopandas as gpd
df = pd.read_csv('/content/acil_durum_alani_izmir.csv')
df.head()
_id | ILCE | KAPINO | ENLEM | ACIKLAMA | ILCEID | MAHALLE | MAHALLEID | ADI | BOYLAM | YOL | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | ALİAĞA | NaN | 38.882542 | NaN | 3 | YENİŞAKRAN | NaN | Aliağa Afet ve Acil Durum Toplanma Alanı | 27.065505 | NaN |
1 | 2 | ALİAĞA | NaN | 38.774595 | NaN | 3 | UZUNHASANLAR | NaN | Aliağa Afet ve Acil Durum Toplanma Alanı | 27.083296 | NaN |
2 | 3 | ALİAĞA | NaN | 38.795387 | NaN | 3 | ATATÜRK | NaN | Aliağa Afet ve Acil Durum Toplanma Alanı | 26.965196 | NaN |
3 | 4 | ALİAĞA | NaN | 38.701807 | NaN | 3 | B.HAYRETTİN PAŞA | NaN | Aliağa Afet ve Acil Durum Toplanma Alanı | 27.019168 | NaN |
4 | 5 | ALİAĞA | NaN | 38.867270 | NaN | 3 | HACIÖMERLİ | NaN | Aliağa Afet ve Acil Durum Toplanma Alanı | 27.061574 | NaN |
Alttaki hücrede enlem ve boylam bilgilerimde null ifade var mı onu kontrol ediyorum.
print(df[['ENLEM', 'BOYLAM']].isnull().any())
ENLEM False BOYLAM False dtype: bool
Aynı şekilde bütün dataframe için denedim.
print(df.isnull().any())
_id False ILCE False KAPINO True ENLEM False ACIKLAMA True ILCEID False MAHALLE False MAHALLEID True ADI False BOYLAM False YOL True dtype: bool
Alttaki yorum satırlarında, verilerimde herhangi bir düzenleme yapmak istersem, kullanmak amaçlı birkaç işlem uyguladım. Örneğin, verimdeki ilçe isimlerinin sadece baş harfini büyük yapmak isteseydim bu yolları izleyecektim ama gerek görmedim çünkü daha sonra göreceğimiz .shp dosyam ve şuanki dosyamın indeks bilgilerini uyumlu bir hale getirmek için bu yolu izlemek kullanışsız olurdu.
#df['ILCE'].str.lower()
#a = df['ILCE'].str[0].str.upper()
#print(a + df['ILCE'].str[1:].str.lower())
#df['ILCE'] = a + df['ILCE'].str[1:].str.lower()
df
_id | ILCE | KAPINO | ENLEM | ACIKLAMA | ILCEID | MAHALLE | MAHALLEID | ADI | BOYLAM | YOL | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | ALİAĞA | NaN | 38.882542 | NaN | 3 | YENİŞAKRAN | NaN | Aliağa Afet ve Acil Durum Toplanma Alanı | 27.065505 | NaN |
1 | 2 | ALİAĞA | NaN | 38.774595 | NaN | 3 | UZUNHASANLAR | NaN | Aliağa Afet ve Acil Durum Toplanma Alanı | 27.083296 | NaN |
2 | 3 | ALİAĞA | NaN | 38.795387 | NaN | 3 | ATATÜRK | NaN | Aliağa Afet ve Acil Durum Toplanma Alanı | 26.965196 | NaN |
3 | 4 | ALİAĞA | NaN | 38.701807 | NaN | 3 | B.HAYRETTİN PAŞA | NaN | Aliağa Afet ve Acil Durum Toplanma Alanı | 27.019168 | NaN |
4 | 5 | ALİAĞA | NaN | 38.867270 | NaN | 3 | HACIÖMERLİ | NaN | Aliağa Afet ve Acil Durum Toplanma Alanı | 27.061574 | NaN |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
1638 | 1639 | URLA | NaN | 38.228551 | NaN | 18 | DEMİRCİLİ | NaN | Urla Afet ve Acil Durum Toplanma Alanı | 26.686869 | NaN |
1639 | 1640 | URLA | NaN | 38.298871 | NaN | 18 | NOHUTALAN | NaN | Urla Afet ve Acil Durum Toplanma Alanı | 26.525551 | NaN |
1640 | 1641 | URLA | NaN | 38.324379 | NaN | 18 | ALTINTAŞ | NaN | Urla Afet ve Acil Durum Toplanma Alanı | 26.757995 | NaN |
1641 | 1642 | URLA | NaN | 38.331348 | NaN | 18 | YENİKENT | NaN | Urla Afet ve Acil Durum Toplanma Alanı | 26.768912 | NaN |
1642 | 1643 | URLA | NaN | 38.240170 | NaN | 18 | ZEYTİNELİ | NaN | Urla Afet ve Acil Durum Toplanma Alanı | 26.504383 | NaN |
1643 rows × 11 columns
Alttaki satırda, NaN değerlere sahip olduğunu bildiğim kolonları direkt olarak siliyorum.
df = df.drop(df.columns[[2, 4, 7, -1]], axis=1)
df
_id | ILCE | ENLEM | ILCEID | MAHALLE | ADI | BOYLAM | |
---|---|---|---|---|---|---|---|
0 | 1 | ALİAĞA | 38.882542 | 3 | YENİŞAKRAN | Aliağa Afet ve Acil Durum Toplanma Alanı | 27.065505 |
1 | 2 | ALİAĞA | 38.774595 | 3 | UZUNHASANLAR | Aliağa Afet ve Acil Durum Toplanma Alanı | 27.083296 |
2 | 3 | ALİAĞA | 38.795387 | 3 | ATATÜRK | Aliağa Afet ve Acil Durum Toplanma Alanı | 26.965196 |
3 | 4 | ALİAĞA | 38.701807 | 3 | B.HAYRETTİN PAŞA | Aliağa Afet ve Acil Durum Toplanma Alanı | 27.019168 |
4 | 5 | ALİAĞA | 38.867270 | 3 | HACIÖMERLİ | Aliağa Afet ve Acil Durum Toplanma Alanı | 27.061574 |
... | ... | ... | ... | ... | ... | ... | ... |
1638 | 1639 | URLA | 38.228551 | 18 | DEMİRCİLİ | Urla Afet ve Acil Durum Toplanma Alanı | 26.686869 |
1639 | 1640 | URLA | 38.298871 | 18 | NOHUTALAN | Urla Afet ve Acil Durum Toplanma Alanı | 26.525551 |
1640 | 1641 | URLA | 38.324379 | 18 | ALTINTAŞ | Urla Afet ve Acil Durum Toplanma Alanı | 26.757995 |
1641 | 1642 | URLA | 38.331348 | 18 | YENİKENT | Urla Afet ve Acil Durum Toplanma Alanı | 26.768912 |
1642 | 1643 | URLA | 38.240170 | 18 | ZEYTİNELİ | Urla Afet ve Acil Durum Toplanma Alanı | 26.504383 |
1643 rows × 7 columns
df.isnull().any()
_id False ILCE False ENLEM False ILCEID False MAHALLE False ADI False BOYLAM False dtype: bool
df['ILCEID']
0 3 1 3 2 3 3 3 4 3 .. 1638 18 1639 18 1640 18 1641 18 1642 18 Name: ILCEID, Length: 1643, dtype: int64
df['ILCE'].value_counts()
KEMALPAŞA 148 BERGAMA 128 KARŞIYAKA 114 ÖDEMİŞ 101 TİRE 99 KARABAĞLAR 92 MENEMEN 69 ÇEŞME 67 NARLIDERE 66 KİRAZ 64 GÜZELBAHÇE 63 BUCA 59 BORNOVA 52 ÇİĞLİ 51 KINIK 51 BAYINDIR 39 ALİAĞA 39 GAZİEMİR 38 DİKİLİ 37 KONAK 36 BEYDAĞ 35 BAYRAKLI 34 URLA 32 SELÇUK 31 TORBALI 24 KARABURUN 17 MENDERES 16 BALÇOVA 15 SEFERİHİSAR 14 FOÇA 12 Name: ILCE, dtype: int64
import folium
from folium import Choropleth, Circle, Marker
from folium import Choropleth, Circle, Marker
from folium.plugins import HeatMap, MarkerCluster
Hemen alttaki kısımda, görselleştirme yapmak istediğim ilçe ve mahalleyi kendim belirlemek için input verdim ve bu şekilde seçtiğim ilçe ve mahallenin renkleri hem birbirinden farklı olacak hem de şehirin geri kalanından. Bunu interaktif bir şekilde kendim belirlemek istediğim için bu yolu izledim.
A = input('Lütfen ilçenizi giriniz: ')
Lütfen ilçenizi giriniz: KARABAĞLAR
Bu hücrede ve ileride kullanacağım pekçok hücrede, "loc" ve "iloc" gibi metodlar ile çağırmak istediğim kolonları indeks olarak belirliyorum.
df_new = df.set_index('ILCE')
df_new.loc[A]
_id | ENLEM | ILCEID | MAHALLE | ADI | BOYLAM | |
---|---|---|---|---|---|---|
ILCE | ||||||
KARABAĞLAR | 670 | 38.391817 | 19 | OSMAN AKSÜNER | Karabağlar Afet ve Acil Durum Toplanma Alanı | 27.134990 |
KARABAĞLAR | 671 | 38.383309 | 19 | ALİ FUAT CEBESOY | Karabağlar Afet ve Acil Durum Toplanma Alanı | 27.104937 |
KARABAĞLAR | 672 | 38.359430 | 19 | PEKER | Karabağlar Afet ve Acil Durum Toplanma Alanı | 27.124977 |
KARABAĞLAR | 673 | 38.392469 | 19 | KAZIM KARABEKİR | Karabağlar Afet ve Acil Durum Toplanma Alanı | 27.114889 |
KARABAĞLAR | 674 | 38.387857 | 19 | REFET BELE | Karabağlar Afet ve Acil Durum Toplanma Alanı | 27.110503 |
... | ... | ... | ... | ... | ... | ... |
KARABAĞLAR | 757 | 38.393812 | 19 | ESENYALI | Karabağlar Afet ve Acil Durum Toplanma Alanı | 27.093201 |
KARABAĞLAR | 758 | 38.391856 | 19 | ESENYALI | Karabağlar Afet ve Acil Durum Toplanma Alanı | 27.091118 |
KARABAĞLAR | 759 | 38.392686 | 19 | ESENYALI | Karabağlar Afet ve Acil Durum Toplanma Alanı | 27.090624 |
KARABAĞLAR | 760 | 38.399647 | 19 | BAHÇELİEVLER | Karabağlar Afet ve Acil Durum Toplanma Alanı | 27.118203 |
KARABAĞLAR | 761 | 38.386999 | 19 | TAHSİN YAZICI | Karabağlar Afet ve Acil Durum Toplanma Alanı | 27.106874 |
92 rows × 6 columns
df_new
_id | ENLEM | ILCEID | MAHALLE | ADI | BOYLAM | |
---|---|---|---|---|---|---|
ILCE | ||||||
ALİAĞA | 1 | 38.882542 | 3 | YENİŞAKRAN | Aliağa Afet ve Acil Durum Toplanma Alanı | 27.065505 |
ALİAĞA | 2 | 38.774595 | 3 | UZUNHASANLAR | Aliağa Afet ve Acil Durum Toplanma Alanı | 27.083296 |
ALİAĞA | 3 | 38.795387 | 3 | ATATÜRK | Aliağa Afet ve Acil Durum Toplanma Alanı | 26.965196 |
ALİAĞA | 4 | 38.701807 | 3 | B.HAYRETTİN PAŞA | Aliağa Afet ve Acil Durum Toplanma Alanı | 27.019168 |
ALİAĞA | 5 | 38.867270 | 3 | HACIÖMERLİ | Aliağa Afet ve Acil Durum Toplanma Alanı | 27.061574 |
... | ... | ... | ... | ... | ... | ... |
URLA | 1639 | 38.228551 | 18 | DEMİRCİLİ | Urla Afet ve Acil Durum Toplanma Alanı | 26.686869 |
URLA | 1640 | 38.298871 | 18 | NOHUTALAN | Urla Afet ve Acil Durum Toplanma Alanı | 26.525551 |
URLA | 1641 | 38.324379 | 18 | ALTINTAŞ | Urla Afet ve Acil Durum Toplanma Alanı | 26.757995 |
URLA | 1642 | 38.331348 | 18 | YENİKENT | Urla Afet ve Acil Durum Toplanma Alanı | 26.768912 |
URLA | 1643 | 38.240170 | 18 | ZEYTİNELİ | Urla Afet ve Acil Durum Toplanma Alanı | 26.504383 |
1643 rows × 6 columns
df_new1 = df_new.set_index('MAHALLE')
df_new1
_id | ENLEM | ILCEID | ADI | BOYLAM | |
---|---|---|---|---|---|
MAHALLE | |||||
YENİŞAKRAN | 1 | 38.882542 | 3 | Aliağa Afet ve Acil Durum Toplanma Alanı | 27.065505 |
UZUNHASANLAR | 2 | 38.774595 | 3 | Aliağa Afet ve Acil Durum Toplanma Alanı | 27.083296 |
ATATÜRK | 3 | 38.795387 | 3 | Aliağa Afet ve Acil Durum Toplanma Alanı | 26.965196 |
B.HAYRETTİN PAŞA | 4 | 38.701807 | 3 | Aliağa Afet ve Acil Durum Toplanma Alanı | 27.019168 |
HACIÖMERLİ | 5 | 38.867270 | 3 | Aliağa Afet ve Acil Durum Toplanma Alanı | 27.061574 |
... | ... | ... | ... | ... | ... |
DEMİRCİLİ | 1639 | 38.228551 | 18 | Urla Afet ve Acil Durum Toplanma Alanı | 26.686869 |
NOHUTALAN | 1640 | 38.298871 | 18 | Urla Afet ve Acil Durum Toplanma Alanı | 26.525551 |
ALTINTAŞ | 1641 | 38.324379 | 18 | Urla Afet ve Acil Durum Toplanma Alanı | 26.757995 |
YENİKENT | 1642 | 38.331348 | 18 | Urla Afet ve Acil Durum Toplanma Alanı | 26.768912 |
ZEYTİNELİ | 1643 | 38.240170 | 18 | Urla Afet ve Acil Durum Toplanma Alanı | 26.504383 |
1643 rows × 5 columns
B = input('Lütfen mahallenizi giriniz: ')
Lütfen mahallenizi giriniz: FAHRETTİN ALTAY
for i in range(0, len(df['MAHALLE'])):
if df_new['MAHALLE'].iloc[i] == B:
print('a')
a a a a
Gördüğünüz gibi, alt hücrede yer alan haritada, seçtiğim ilçe olan Karabağlar kırmızı renkte, seçtiğim mahalle olan Fahrettin Altay ise mavi renkte görünmekte. Kalan toplanma alanları ise color_product fonksiyonumdaki koşulları sağlamadığı için yeşil renkte görünmekte. Dilerseniz çember üzerine tıklayarak da mahalle ve konum bilgilerini öğrenebilirsiniz.
m_1 = folium.Map(location=[38.41273, 27.13838], tiles = 'cartodbpositron', zoom_control=6)
def color_product():
if df['ILCE'].iloc[i] == A:
if df_new['MAHALLE'].iloc[i] == B:
return 'blue'
return 'red'
else:
return 'darkgreen'
for i in range(0, len(df['ILCE'])):
label = '{}, {}, {}, {}'.format(df['ILCE'].iloc[i], df['MAHALLE'].iloc[i], df['ENLEM'].iloc[i], df['BOYLAM'].iloc[i])
Circle([df['ENLEM'].iloc[i], df['BOYLAM'].iloc[i]], radius=10, popup = label, color=color_product()).add_to(m_1)
m_1
Alttaki hücrede yer alan ısı haritasını ise, yukarıda yer alan harita üzerinden oluşturdum. Böylelikle hem verinin ısı analizini yapabileceğiz hem de çemberlere dokunduğumuzda konum bilgilerini kolayca öğrenebileceğiz.
df_heat = df[['ENLEM', 'BOYLAM']]
df_np = df_heat.to_numpy()
m_3 = folium.Map(location=[38.41273, 27.13838], tiles='cartodbpositron', zoom_start=6)
HeatMap(data=df_np, radius=20).add_to(m_1)
m_1
import math
Bu hücrede ise hem toplam toplanma yeri sayısını harita üzerinde sayısal olarak görmek hem de dağılımlarını daha rahat analiz etmek için Marker Cluster kullandım ve bunun için de math kütüphanesini import ettim.
m_8 = folium.Map(location=[38.41273, 27.13838], tiles='cartodbdark_matter', zoom_start=6)
mc = MarkerCluster()
for idx, row in df.iterrows():
label = '{}, {}'.format(row['MAHALLE'], row['ILCE'])
if not math.isnan(row['BOYLAM']) and not math.isnan(row['ENLEM']):
mc.add_child(Marker([row['ENLEM'], row['BOYLAM']], popup=label))
m_8.add_child(mc)
m_8
Buradan itibaren, yeni bir klasör kullanmaya başlıyoruz ve daha sonra da bu klasörde yer alan "tur_polbna_adm2.shp" dosyasını, çeşitli satır ve sütun işlemleri kullandıktan sonra önceki dosyamız olan .csv uzantılı dosya ile ortak indeksler yardımı ile eşleştireceğiz. Böylelikle, oluşturacağım Choropleth haritasında hem ilçe sınırlarını elde etmiş olacağım hem de toplanma yerleri sayılarına göre de bu haritada renklendirme çalışmaları yapabileceğim.
df_adm = gpd.read_file('/content/tur_polbna_adm2.shp')
df_adm = df_adm.set_index('adm1_tr')
Öncelikle, dosyamızın içeriğinde bütün Türkiye'nin ilçelerinin sınır bilgileri yer almakta. O yüzden önce ilçe isimlerini indeks olarak belirleyip ardından "loc" yardımı ile içlerinden sadece İzmir'de bulunan ilçelere özel yeni bir dataframe yaratıyorum.
df_izmir = df_adm.loc['İZMİR'].copy()
df_izmir
OBJECTID | adm2_tr | adm2_en | adm1_en | adm1 | pcode | Shape_Leng | Shape_Area | geometry | |
---|---|---|---|---|---|---|---|---|---|
adm1_tr | |||||||||
İZMİR | 2 | ÇİĞLİ | CIGLI | IZMIR | TUR035 | TUR035010 | 1.138818 | 0.014430 | POLYGON ((27.06797 38.46423, 27.06785 38.46418... |
İZMİR | 99 | ALİAĞA | ALIAGA | IZMIR | TUR035 | TUR035001 | 1.564311 | 0.039342 | MULTIPOLYGON (((26.88506 38.85473, 26.88596 38... |
İZMİR | 220 | BALÇOVA | BALCOVA | IZMIR | TUR035 | TUR035002 | 0.282493 | 0.001588 | MULTIPOLYGON (((27.05975 38.41520, 27.06006 38... |
İZMİR | 231 | BAYINDIR | BAYINDIR | IZMIR | TUR035 | TUR035003 | 1.105323 | 0.056379 | POLYGON ((27.81550 38.33113, 27.81159 38.32612... |
İZMİR | 233 | BAYRAKLI | BAYRAKLI | IZMIR | TUR035 | TUR035004 | 0.357651 | 0.003100 | POLYGON ((27.18078 38.44803, 27.17771 38.44694... |
İZMİR | 242 | BERGAMA | BERGAMA | IZMIR | TUR035 | TUR035005 | 2.269019 | 0.160788 | POLYGON ((27.18320 39.36502, 27.18488 39.36467... |
İZMİR | 246 | BEYDAĞ | BEYDAG | IZMIR | TUR035 | TUR035006 | 0.580816 | 0.017642 | POLYGON ((28.21052 38.02825, 28.20955 38.02862... |
İZMİR | 264 | BORNOVA | BORNOVA | IZMIR | TUR035 | TUR035007 | 0.778574 | 0.022721 | POLYGON ((27.18385 38.51305, 27.18462 38.51487... |
İZMİR | 275 | BUCA | BUCA | IZMIR | TUR035 | TUR035008 | 0.677499 | 0.018338 | POLYGON ((27.13928 38.36124, 27.13952 38.36151... |
İZMİR | 296 | DİKİLİ | DIKILI | IZMIR | TUR035 | TUR035011 | 1.352566 | 0.055294 | MULTIPOLYGON (((26.83776 38.90428, 26.83410 38... |
İZMİR | 312 | ÖDEMİŞ | ODEMIS | IZMIR | TUR035 | TUR035025 | 1.710193 | 0.104708 | POLYGON ((27.77895 38.21889, 27.77950 38.22127... |
İZMİR | 348 | ÇEŞME | CESME | IZMIR | TUR035 | TUR035009 | 1.746217 | 0.029167 | MULTIPOLYGON (((26.43980 38.18293, 26.43944 38... |
İZMİR | 411 | FOÇA | FOCA | IZMIR | TUR035 | TUR035012 | 1.247064 | 0.025904 | MULTIPOLYGON (((26.73303 38.67545, 26.73305 38... |
İZMİR | 413 | GAZİEMİR | GAZIEMIR | IZMIR | TUR035 | TUR035013 | 0.395737 | 0.007265 | POLYGON ((27.13928 38.36124, 27.13910 38.36077... |
İZMİR | 471 | GÜZELBAHÇE | GUZELBAHCE | IZMIR | TUR035 | TUR035014 | 0.416726 | 0.007970 | POLYGON ((26.95281 38.34366, 26.95253 38.34305... |
İZMİR | 523 | KİRAZ | KIRAZ | IZMIR | TUR035 | TUR035020 | 1.187362 | 0.059012 | POLYGON ((28.48468 38.12181, 28.48407 38.12131... |
İZMİR | 542 | KARŞIYAKA | KARSIYAKA | IZMIR | TUR035 | TUR035017 | 0.495748 | 0.005272 | POLYGON ((27.18743 38.53372, 27.18666 38.53197... |
İZMİR | 544 | KARABAĞLAR | KARABAGLAR | IZMIR | TUR035 | TUR035015 | 0.591353 | 0.009172 | POLYGON ((27.13786 38.39431, 27.13759 38.39394... |
İZMİR | 546 | KARABURUN | KARABURUN | IZMIR | TUR035 | TUR035016 | 1.594056 | 0.043583 | MULTIPOLYGON (((26.31681 38.41674, 26.31390 38... |
İZMİR | 588 | KEMALPAŞA | KEMALPASA | IZMIR | TUR035 | TUR035018 | 1.349875 | 0.070287 | POLYGON ((27.41644 38.54953, 27.41674 38.54923... |
İZMİR | 598 | KINIK | KINIK | IZMIR | TUR035 | TUR035019 | 0.911161 | 0.049814 | POLYGON ((27.34617 38.93394, 27.34584 38.93592... |
İZMİR | 614 | KONAK | KONAK | IZMIR | TUR035 | TUR035021 | 0.381559 | 0.002491 | POLYGON ((27.16848 38.44526, 27.16940 38.44489... |
İZMİR | 673 | MENDERES | MENDERES | IZMIR | TUR035 | TUR035022 | 1.414583 | 0.079858 | POLYGON ((27.21352 38.29224, 27.21420 38.29096... |
İZMİR | 674 | MENEMEN | MENEMEN | IZMIR | TUR035 | TUR035023 | 1.312327 | 0.059402 | POLYGON ((26.88262 38.53423, 26.88260 38.53447... |
İZMİR | 701 | NARLIDERE | NARLIDERE | IZMIR | TUR035 | TUR035024 | 0.346248 | 0.005141 | POLYGON ((27.02022 38.41561, 27.02017 38.41551... |
İZMİR | 815 | SEFERİHİSAR | SEFERIHISAR | IZMIR | TUR035 | TUR035026 | 1.180927 | 0.040339 | MULTIPOLYGON (((26.88347 38.02315, 26.88145 38... |
İZMİR | 818 | SELÇUK | SELCUK | IZMIR | TUR035 | TUR035027 | 0.812669 | 0.032506 | POLYGON ((27.24790 37.98054, 27.24824 37.98093... |
İZMİR | 857 | TİRE | TIRE | IZMIR | TUR035 | TUR035028 | 1.413492 | 0.073564 | POLYGON ((27.77895 38.21889, 27.77977 38.21752... |
İZMİR | 880 | TORBALI | TORBALI | IZMIR | TUR035 | TUR035029 | 1.251935 | 0.059311 | POLYGON ((27.36329 38.32440, 27.36594 38.32415... |
İZMİR | 911 | URLA | URLA | IZMIR | TUR035 | TUR035030 | 2.909728 | 0.072978 | MULTIPOLYGON (((26.68033 38.33170, 26.67860 38... |
Altta da gördüğünüz gibi plot'ta gördüğümüz sınır bilgileri İzmir'in ilçelerine ait.
df_izmir.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7f54dc01d490>
df_izmir = df_izmir.set_index('adm2_tr')
df_izmir
OBJECTID | adm2_en | adm1_en | adm1 | pcode | Shape_Leng | Shape_Area | geometry | |
---|---|---|---|---|---|---|---|---|
adm2_tr | ||||||||
ÇİĞLİ | 2 | CIGLI | IZMIR | TUR035 | TUR035010 | 1.138818 | 0.014430 | POLYGON ((27.06797 38.46423, 27.06785 38.46418... |
ALİAĞA | 99 | ALIAGA | IZMIR | TUR035 | TUR035001 | 1.564311 | 0.039342 | MULTIPOLYGON (((26.88506 38.85473, 26.88596 38... |
BALÇOVA | 220 | BALCOVA | IZMIR | TUR035 | TUR035002 | 0.282493 | 0.001588 | MULTIPOLYGON (((27.05975 38.41520, 27.06006 38... |
BAYINDIR | 231 | BAYINDIR | IZMIR | TUR035 | TUR035003 | 1.105323 | 0.056379 | POLYGON ((27.81550 38.33113, 27.81159 38.32612... |
BAYRAKLI | 233 | BAYRAKLI | IZMIR | TUR035 | TUR035004 | 0.357651 | 0.003100 | POLYGON ((27.18078 38.44803, 27.17771 38.44694... |
BERGAMA | 242 | BERGAMA | IZMIR | TUR035 | TUR035005 | 2.269019 | 0.160788 | POLYGON ((27.18320 39.36502, 27.18488 39.36467... |
BEYDAĞ | 246 | BEYDAG | IZMIR | TUR035 | TUR035006 | 0.580816 | 0.017642 | POLYGON ((28.21052 38.02825, 28.20955 38.02862... |
BORNOVA | 264 | BORNOVA | IZMIR | TUR035 | TUR035007 | 0.778574 | 0.022721 | POLYGON ((27.18385 38.51305, 27.18462 38.51487... |
BUCA | 275 | BUCA | IZMIR | TUR035 | TUR035008 | 0.677499 | 0.018338 | POLYGON ((27.13928 38.36124, 27.13952 38.36151... |
DİKİLİ | 296 | DIKILI | IZMIR | TUR035 | TUR035011 | 1.352566 | 0.055294 | MULTIPOLYGON (((26.83776 38.90428, 26.83410 38... |
ÖDEMİŞ | 312 | ODEMIS | IZMIR | TUR035 | TUR035025 | 1.710193 | 0.104708 | POLYGON ((27.77895 38.21889, 27.77950 38.22127... |
ÇEŞME | 348 | CESME | IZMIR | TUR035 | TUR035009 | 1.746217 | 0.029167 | MULTIPOLYGON (((26.43980 38.18293, 26.43944 38... |
FOÇA | 411 | FOCA | IZMIR | TUR035 | TUR035012 | 1.247064 | 0.025904 | MULTIPOLYGON (((26.73303 38.67545, 26.73305 38... |
GAZİEMİR | 413 | GAZIEMIR | IZMIR | TUR035 | TUR035013 | 0.395737 | 0.007265 | POLYGON ((27.13928 38.36124, 27.13910 38.36077... |
GÜZELBAHÇE | 471 | GUZELBAHCE | IZMIR | TUR035 | TUR035014 | 0.416726 | 0.007970 | POLYGON ((26.95281 38.34366, 26.95253 38.34305... |
KİRAZ | 523 | KIRAZ | IZMIR | TUR035 | TUR035020 | 1.187362 | 0.059012 | POLYGON ((28.48468 38.12181, 28.48407 38.12131... |
KARŞIYAKA | 542 | KARSIYAKA | IZMIR | TUR035 | TUR035017 | 0.495748 | 0.005272 | POLYGON ((27.18743 38.53372, 27.18666 38.53197... |
KARABAĞLAR | 544 | KARABAGLAR | IZMIR | TUR035 | TUR035015 | 0.591353 | 0.009172 | POLYGON ((27.13786 38.39431, 27.13759 38.39394... |
KARABURUN | 546 | KARABURUN | IZMIR | TUR035 | TUR035016 | 1.594056 | 0.043583 | MULTIPOLYGON (((26.31681 38.41674, 26.31390 38... |
KEMALPAŞA | 588 | KEMALPASA | IZMIR | TUR035 | TUR035018 | 1.349875 | 0.070287 | POLYGON ((27.41644 38.54953, 27.41674 38.54923... |
KINIK | 598 | KINIK | IZMIR | TUR035 | TUR035019 | 0.911161 | 0.049814 | POLYGON ((27.34617 38.93394, 27.34584 38.93592... |
KONAK | 614 | KONAK | IZMIR | TUR035 | TUR035021 | 0.381559 | 0.002491 | POLYGON ((27.16848 38.44526, 27.16940 38.44489... |
MENDERES | 673 | MENDERES | IZMIR | TUR035 | TUR035022 | 1.414583 | 0.079858 | POLYGON ((27.21352 38.29224, 27.21420 38.29096... |
MENEMEN | 674 | MENEMEN | IZMIR | TUR035 | TUR035023 | 1.312327 | 0.059402 | POLYGON ((26.88262 38.53423, 26.88260 38.53447... |
NARLIDERE | 701 | NARLIDERE | IZMIR | TUR035 | TUR035024 | 0.346248 | 0.005141 | POLYGON ((27.02022 38.41561, 27.02017 38.41551... |
SEFERİHİSAR | 815 | SEFERIHISAR | IZMIR | TUR035 | TUR035026 | 1.180927 | 0.040339 | MULTIPOLYGON (((26.88347 38.02315, 26.88145 38... |
SELÇUK | 818 | SELCUK | IZMIR | TUR035 | TUR035027 | 0.812669 | 0.032506 | POLYGON ((27.24790 37.98054, 27.24824 37.98093... |
TİRE | 857 | TIRE | IZMIR | TUR035 | TUR035028 | 1.413492 | 0.073564 | POLYGON ((27.77895 38.21889, 27.77977 38.21752... |
TORBALI | 880 | TORBALI | IZMIR | TUR035 | TUR035029 | 1.251935 | 0.059311 | POLYGON ((27.36329 38.32440, 27.36594 38.32415... |
URLA | 911 | URLA | IZMIR | TUR035 | TUR035030 | 2.909728 | 0.072978 | MULTIPOLYGON (((26.68033 38.33170, 26.67860 38... |
Alttaki satırda, daha önceden kullandığımız, yani toplanma yerlerini içeren dataframe'imiz ile indeksi "ILCE" olan yeni bir dataframe oluşturuyoruz.
df_id = df.set_index('ILCE')
df_id
_id | ENLEM | ILCEID | MAHALLE | ADI | BOYLAM | |
---|---|---|---|---|---|---|
ILCE | ||||||
ALİAĞA | 1 | 38.882542 | 3 | YENİŞAKRAN | Aliağa Afet ve Acil Durum Toplanma Alanı | 27.065505 |
ALİAĞA | 2 | 38.774595 | 3 | UZUNHASANLAR | Aliağa Afet ve Acil Durum Toplanma Alanı | 27.083296 |
ALİAĞA | 3 | 38.795387 | 3 | ATATÜRK | Aliağa Afet ve Acil Durum Toplanma Alanı | 26.965196 |
ALİAĞA | 4 | 38.701807 | 3 | B.HAYRETTİN PAŞA | Aliağa Afet ve Acil Durum Toplanma Alanı | 27.019168 |
ALİAĞA | 5 | 38.867270 | 3 | HACIÖMERLİ | Aliağa Afet ve Acil Durum Toplanma Alanı | 27.061574 |
... | ... | ... | ... | ... | ... | ... |
URLA | 1639 | 38.228551 | 18 | DEMİRCİLİ | Urla Afet ve Acil Durum Toplanma Alanı | 26.686869 |
URLA | 1640 | 38.298871 | 18 | NOHUTALAN | Urla Afet ve Acil Durum Toplanma Alanı | 26.525551 |
URLA | 1641 | 38.324379 | 18 | ALTINTAŞ | Urla Afet ve Acil Durum Toplanma Alanı | 26.757995 |
URLA | 1642 | 38.331348 | 18 | YENİKENT | Urla Afet ve Acil Durum Toplanma Alanı | 26.768912 |
URLA | 1643 | 38.240170 | 18 | ZEYTİNELİ | Urla Afet ve Acil Durum Toplanma Alanı | 26.504383 |
1643 rows × 6 columns
Bu yorum satırında, karakterleri türkçeleştirmek için izleyebileceğimiz bir yöntemi "I" ve "İ" harfleri üzerinden göstermek istedim ama elimizdeki veriler çerçevesinde buna gerek kalmadı.
#df_id.index = df_id.index.str.replace('İ', 'I', 3)
Alttaki hücrede, df_common adında yeni bir dataframe oluşturdum. Amaç, Choropleth haritası oluştururken kullanacağım geo_data ve data bilgilerinin yer alacağı dataframe'lerin içeriklerinin eşleşmesini sağlamak. Bu yüzden df_id indeksinin içinde yer alan verileri,df_izmir indeksinde yer alan verilerden oluşturmayı hedefledim. İsim bilgileri eşleşen veriler sayesinde bir kayıp yaşamadan bu amaca ulaştım.
df_common = df_id.loc[df_id.index.isin(df_izmir.index)]
df_common
_id | ENLEM | ILCEID | MAHALLE | ADI | BOYLAM | |
---|---|---|---|---|---|---|
ILCE | ||||||
ALİAĞA | 1 | 38.882542 | 3 | YENİŞAKRAN | Aliağa Afet ve Acil Durum Toplanma Alanı | 27.065505 |
ALİAĞA | 2 | 38.774595 | 3 | UZUNHASANLAR | Aliağa Afet ve Acil Durum Toplanma Alanı | 27.083296 |
ALİAĞA | 3 | 38.795387 | 3 | ATATÜRK | Aliağa Afet ve Acil Durum Toplanma Alanı | 26.965196 |
ALİAĞA | 4 | 38.701807 | 3 | B.HAYRETTİN PAŞA | Aliağa Afet ve Acil Durum Toplanma Alanı | 27.019168 |
ALİAĞA | 5 | 38.867270 | 3 | HACIÖMERLİ | Aliağa Afet ve Acil Durum Toplanma Alanı | 27.061574 |
... | ... | ... | ... | ... | ... | ... |
URLA | 1639 | 38.228551 | 18 | DEMİRCİLİ | Urla Afet ve Acil Durum Toplanma Alanı | 26.686869 |
URLA | 1640 | 38.298871 | 18 | NOHUTALAN | Urla Afet ve Acil Durum Toplanma Alanı | 26.525551 |
URLA | 1641 | 38.324379 | 18 | ALTINTAŞ | Urla Afet ve Acil Durum Toplanma Alanı | 26.757995 |
URLA | 1642 | 38.331348 | 18 | YENİKENT | Urla Afet ve Acil Durum Toplanma Alanı | 26.768912 |
URLA | 1643 | 38.240170 | 18 | ZEYTİNELİ | Urla Afet ve Acil Durum Toplanma Alanı | 26.504383 |
1643 rows × 6 columns
df_izmir = df_adm.loc['İZMİR']
df_izmir
OBJECTID | adm2_tr | adm2_en | adm1_en | adm1 | pcode | Shape_Leng | Shape_Area | geometry | |
---|---|---|---|---|---|---|---|---|---|
adm1_tr | |||||||||
İZMİR | 2 | ÇİĞLİ | CIGLI | IZMIR | TUR035 | TUR035010 | 1.138818 | 0.014430 | POLYGON ((27.06797 38.46423, 27.06785 38.46418... |
İZMİR | 99 | ALİAĞA | ALIAGA | IZMIR | TUR035 | TUR035001 | 1.564311 | 0.039342 | MULTIPOLYGON (((26.88506 38.85473, 26.88596 38... |
İZMİR | 220 | BALÇOVA | BALCOVA | IZMIR | TUR035 | TUR035002 | 0.282493 | 0.001588 | MULTIPOLYGON (((27.05975 38.41520, 27.06006 38... |
İZMİR | 231 | BAYINDIR | BAYINDIR | IZMIR | TUR035 | TUR035003 | 1.105323 | 0.056379 | POLYGON ((27.81550 38.33113, 27.81159 38.32612... |
İZMİR | 233 | BAYRAKLI | BAYRAKLI | IZMIR | TUR035 | TUR035004 | 0.357651 | 0.003100 | POLYGON ((27.18078 38.44803, 27.17771 38.44694... |
İZMİR | 242 | BERGAMA | BERGAMA | IZMIR | TUR035 | TUR035005 | 2.269019 | 0.160788 | POLYGON ((27.18320 39.36502, 27.18488 39.36467... |
İZMİR | 246 | BEYDAĞ | BEYDAG | IZMIR | TUR035 | TUR035006 | 0.580816 | 0.017642 | POLYGON ((28.21052 38.02825, 28.20955 38.02862... |
İZMİR | 264 | BORNOVA | BORNOVA | IZMIR | TUR035 | TUR035007 | 0.778574 | 0.022721 | POLYGON ((27.18385 38.51305, 27.18462 38.51487... |
İZMİR | 275 | BUCA | BUCA | IZMIR | TUR035 | TUR035008 | 0.677499 | 0.018338 | POLYGON ((27.13928 38.36124, 27.13952 38.36151... |
İZMİR | 296 | DİKİLİ | DIKILI | IZMIR | TUR035 | TUR035011 | 1.352566 | 0.055294 | MULTIPOLYGON (((26.83776 38.90428, 26.83410 38... |
İZMİR | 312 | ÖDEMİŞ | ODEMIS | IZMIR | TUR035 | TUR035025 | 1.710193 | 0.104708 | POLYGON ((27.77895 38.21889, 27.77950 38.22127... |
İZMİR | 348 | ÇEŞME | CESME | IZMIR | TUR035 | TUR035009 | 1.746217 | 0.029167 | MULTIPOLYGON (((26.43980 38.18293, 26.43944 38... |
İZMİR | 411 | FOÇA | FOCA | IZMIR | TUR035 | TUR035012 | 1.247064 | 0.025904 | MULTIPOLYGON (((26.73303 38.67545, 26.73305 38... |
İZMİR | 413 | GAZİEMİR | GAZIEMIR | IZMIR | TUR035 | TUR035013 | 0.395737 | 0.007265 | POLYGON ((27.13928 38.36124, 27.13910 38.36077... |
İZMİR | 471 | GÜZELBAHÇE | GUZELBAHCE | IZMIR | TUR035 | TUR035014 | 0.416726 | 0.007970 | POLYGON ((26.95281 38.34366, 26.95253 38.34305... |
İZMİR | 523 | KİRAZ | KIRAZ | IZMIR | TUR035 | TUR035020 | 1.187362 | 0.059012 | POLYGON ((28.48468 38.12181, 28.48407 38.12131... |
İZMİR | 542 | KARŞIYAKA | KARSIYAKA | IZMIR | TUR035 | TUR035017 | 0.495748 | 0.005272 | POLYGON ((27.18743 38.53372, 27.18666 38.53197... |
İZMİR | 544 | KARABAĞLAR | KARABAGLAR | IZMIR | TUR035 | TUR035015 | 0.591353 | 0.009172 | POLYGON ((27.13786 38.39431, 27.13759 38.39394... |
İZMİR | 546 | KARABURUN | KARABURUN | IZMIR | TUR035 | TUR035016 | 1.594056 | 0.043583 | MULTIPOLYGON (((26.31681 38.41674, 26.31390 38... |
İZMİR | 588 | KEMALPAŞA | KEMALPASA | IZMIR | TUR035 | TUR035018 | 1.349875 | 0.070287 | POLYGON ((27.41644 38.54953, 27.41674 38.54923... |
İZMİR | 598 | KINIK | KINIK | IZMIR | TUR035 | TUR035019 | 0.911161 | 0.049814 | POLYGON ((27.34617 38.93394, 27.34584 38.93592... |
İZMİR | 614 | KONAK | KONAK | IZMIR | TUR035 | TUR035021 | 0.381559 | 0.002491 | POLYGON ((27.16848 38.44526, 27.16940 38.44489... |
İZMİR | 673 | MENDERES | MENDERES | IZMIR | TUR035 | TUR035022 | 1.414583 | 0.079858 | POLYGON ((27.21352 38.29224, 27.21420 38.29096... |
İZMİR | 674 | MENEMEN | MENEMEN | IZMIR | TUR035 | TUR035023 | 1.312327 | 0.059402 | POLYGON ((26.88262 38.53423, 26.88260 38.53447... |
İZMİR | 701 | NARLIDERE | NARLIDERE | IZMIR | TUR035 | TUR035024 | 0.346248 | 0.005141 | POLYGON ((27.02022 38.41561, 27.02017 38.41551... |
İZMİR | 815 | SEFERİHİSAR | SEFERIHISAR | IZMIR | TUR035 | TUR035026 | 1.180927 | 0.040339 | MULTIPOLYGON (((26.88347 38.02315, 26.88145 38... |
İZMİR | 818 | SELÇUK | SELCUK | IZMIR | TUR035 | TUR035027 | 0.812669 | 0.032506 | POLYGON ((27.24790 37.98054, 27.24824 37.98093... |
İZMİR | 857 | TİRE | TIRE | IZMIR | TUR035 | TUR035028 | 1.413492 | 0.073564 | POLYGON ((27.77895 38.21889, 27.77977 38.21752... |
İZMİR | 880 | TORBALI | TORBALI | IZMIR | TUR035 | TUR035029 | 1.251935 | 0.059311 | POLYGON ((27.36329 38.32440, 27.36594 38.32415... |
İZMİR | 911 | URLA | URLA | IZMIR | TUR035 | TUR035030 | 2.909728 | 0.072978 | MULTIPOLYGON (((26.68033 38.33170, 26.67860 38... |
Alttaki hücrede oluşturduğum df_izmir_boun'da sadece sınır bilgileri olan geometry kolonunun ve ilçe isimlerinin tutulmasını istedim ardından ilçe isimlerini indekse dönüştürdüm. Bu dataframe'i coğrafi datamız olarak kullanacağız.
df_izmir_boun = df_izmir[['adm2_tr','geometry']].set_index('adm2_tr')
df_izmir_boun
geometry | |
---|---|
adm2_tr | |
ÇİĞLİ | POLYGON ((27.06797 38.46423, 27.06785 38.46418... |
ALİAĞA | MULTIPOLYGON (((26.88506 38.85473, 26.88596 38... |
BALÇOVA | MULTIPOLYGON (((27.05975 38.41520, 27.06006 38... |
BAYINDIR | POLYGON ((27.81550 38.33113, 27.81159 38.32612... |
BAYRAKLI | POLYGON ((27.18078 38.44803, 27.17771 38.44694... |
BERGAMA | POLYGON ((27.18320 39.36502, 27.18488 39.36467... |
BEYDAĞ | POLYGON ((28.21052 38.02825, 28.20955 38.02862... |
BORNOVA | POLYGON ((27.18385 38.51305, 27.18462 38.51487... |
BUCA | POLYGON ((27.13928 38.36124, 27.13952 38.36151... |
DİKİLİ | MULTIPOLYGON (((26.83776 38.90428, 26.83410 38... |
ÖDEMİŞ | POLYGON ((27.77895 38.21889, 27.77950 38.22127... |
ÇEŞME | MULTIPOLYGON (((26.43980 38.18293, 26.43944 38... |
FOÇA | MULTIPOLYGON (((26.73303 38.67545, 26.73305 38... |
GAZİEMİR | POLYGON ((27.13928 38.36124, 27.13910 38.36077... |
GÜZELBAHÇE | POLYGON ((26.95281 38.34366, 26.95253 38.34305... |
KİRAZ | POLYGON ((28.48468 38.12181, 28.48407 38.12131... |
KARŞIYAKA | POLYGON ((27.18743 38.53372, 27.18666 38.53197... |
KARABAĞLAR | POLYGON ((27.13786 38.39431, 27.13759 38.39394... |
KARABURUN | MULTIPOLYGON (((26.31681 38.41674, 26.31390 38... |
KEMALPAŞA | POLYGON ((27.41644 38.54953, 27.41674 38.54923... |
KINIK | POLYGON ((27.34617 38.93394, 27.34584 38.93592... |
KONAK | POLYGON ((27.16848 38.44526, 27.16940 38.44489... |
MENDERES | POLYGON ((27.21352 38.29224, 27.21420 38.29096... |
MENEMEN | POLYGON ((26.88262 38.53423, 26.88260 38.53447... |
NARLIDERE | POLYGON ((27.02022 38.41561, 27.02017 38.41551... |
SEFERİHİSAR | MULTIPOLYGON (((26.88347 38.02315, 26.88145 38... |
SELÇUK | POLYGON ((27.24790 37.98054, 27.24824 37.98093... |
TİRE | POLYGON ((27.77895 38.21889, 27.77977 38.21752... |
TORBALI | POLYGON ((27.36329 38.32440, 27.36594 38.32415... |
URLA | MULTIPOLYGON (((26.68033 38.33170, 26.67860 38... |
Burada ise bir plot_dict oluşturdum ve df_common'un aynı zamanda indeksi olan ilçe isimlerinin değerlerini saydırdım. Sınır haritama(siyasi harita da denebilir) renk verecek veriler bunlar.
plot_dict = df_common.index.value_counts()
plot_dict.head()
KEMALPAŞA 148 BERGAMA 128 KARŞIYAKA 114 ÖDEMİŞ 101 TİRE 99 Name: ILCE, dtype: int64
from geopy.geocoders import Nominatim
import numpy as np
Burada ise, az sonra haritada göstereceğim ilçelerin Marker'lar ile gösterilmesini sağlamak için geocoder çağırmadan hemen önce yeni bir kolon oluşturdum. Amaç, ilçe yanına şehir bilgisini de ekleyerek hatalı geolocation işlemlerini önlemek.
df_izmir['ILCE-IL'] = df_izmir[['adm2_tr', 'adm1_en']].agg('-'.join, axis=1)
/usr/local/lib/python3.7/dist-packages/geopandas/geodataframe.py:1351: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy super().__setitem__(key, value)
Gördüğünüz gibi eşleşme %100.
geolocator = Nominatim(user_agent='kaggle_learn') #turkey eklemeyi unutma, yanlış gösteren yerler var!!!!!
def my_geocoder(row):
try:
point = geolocator.geocode(row).point
return pd.Series({'ENLEM': point.latitude, 'BOYLAM': point.longitude})
except:
return None
df_izmir[['ENLEM', 'BOYLAM']] = df_izmir.apply(lambda x: my_geocoder(x['ILCE-IL']), axis=1)
print("{}% of addresses were geocoded!".format(
(1 - sum(np.isnan(df_izmir["ENLEM"])) / len(df_izmir)) * 100))
data = df_izmir.loc[~np.isnan(df_izmir["ENLEM"])]
data = gpd.GeoDataFrame(
data, geometry=gpd.points_from_xy(df_izmir.BOYLAM, df_izmir.ENLEM))
data.crs = {'init': 'epsg:4326'}
data.head()
100.0% of addresses were geocoded!
/usr/local/lib/python3.7/dist-packages/geopandas/geodataframe.py:1351: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy super().__setitem__(key, value) /usr/local/lib/python3.7/dist-packages/pyproj/crs/crs.py:131: FutureWarning: '+init=<authority>:<code>' syntax is deprecated. '<authority>:<code>' is the preferred initialization method. When making the change, be mindful of axis order changes: https://pyproj4.github.io/pyproj/stable/gotchas.html#axis-order-changes-in-proj-6 in_crs_string = _prepare_from_proj_string(in_crs_string)
OBJECTID | adm2_tr | adm2_en | adm1_en | adm1 | pcode | Shape_Leng | Shape_Area | geometry | ILCE-IL | ENLEM | BOYLAM | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
adm1_tr | ||||||||||||
İZMİR | 2 | ÇİĞLİ | CIGLI | IZMIR | TUR035 | TUR035010 | 1.138818 | 0.014430 | POINT (26.99410 38.49208) | ÇİĞLİ-IZMIR | 38.492077 | 26.994095 |
İZMİR | 99 | ALİAĞA | ALIAGA | IZMIR | TUR035 | TUR035001 | 1.564311 | 0.039342 | POINT (26.97298 38.80097) | ALİAĞA-IZMIR | 38.800972 | 26.972982 |
İZMİR | 220 | BALÇOVA | BALCOVA | IZMIR | TUR035 | TUR035002 | 0.282493 | 0.001588 | POINT (27.04680 38.39240) | BALÇOVA-IZMIR | 38.392398 | 27.046805 |
İZMİR | 231 | BAYINDIR | BAYINDIR | IZMIR | TUR035 | TUR035003 | 1.105323 | 0.056379 | POINT (27.64730 38.22060) | BAYINDIR-IZMIR | 38.220605 | 27.647298 |
İZMİR | 233 | BAYRAKLI | BAYRAKLI | IZMIR | TUR035 | TUR035004 | 0.357651 | 0.003100 | POINT (27.16862 38.46476) | BAYRAKLI-IZMIR | 38.464762 | 27.168617 |
!pip install fontawesome
Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/ Collecting fontawesome Downloading fontawesome-5.10.1.post1-py3-none-any.whl (20 kB) Installing collected packages: fontawesome Successfully installed fontawesome-5.10.1.post1
#import fontawesome as fa ------ Dilerseniz Marker'larınızda kullanacağınız ikonlar için bu CSS tabanlı kütüphaneden yararlanabilirsiniz.
Haritayı oluştururken kullandığımız geo_data .shp dosyamız içerisinde yer alan polygonal veri içeren geometry kolonu yardımıyla, renklendirmemiz ise toplanma yerleri bilgilerini içeren data sayesinde yapıldı. "feature.id" komutu ise haritamızı indeks bilgilerimize göre oluşturabilmemize yarayan bir diğer parametre.
m_7 = folium.Map(location=[38.41273, 27.13838], tiles = 'cartodbpositron', zoom_start=8)
Choropleth(geo_data=df_izmir_boun.__geo_interface__, data=plot_dict, key_on='feature.id', fill_color='YlOrRd', legend_name='Afet Anında Acil Durum Toplanma Yerleri').add_to(m_7)
for i in range(0, len(df_izmir)):
label = '{}, {}'.format(df_izmir['adm2_tr'].iloc[i], df_izmir['pcode'].iloc[i])
folium.Marker([df_izmir['ENLEM'].iloc[i], df_izmir['BOYLAM'].iloc[i]], popup=label, icon=folium.Icon(color="blue")).add_to(m_7)
m_7
Bu hücreden itibaren, haritalandırma işlemlerini sona erdirip tablo işlemlerine başlıyorum. Öncelikle neden Plotly? Çünkü Seaborn ve Matlplotlib'e nazaran görselleştirme işlemi ve tool'ları daha modern ve anlaşılması kolay.
import plotly.express as px
Burada Plotly Plotly kütüphanesinin bir class'ı diyebileceğimiz plotly express yardımı ile bir treemap oluşturdum. Bir çeşit kalıtım gibi düşünebiliriz. En dış kabukta ilçe isimleri yer alırken, ilgili ilçeye basınca da mahalle isimleri yer alıyor. Eğer mahalle altına da inebileceğimiz bir veri olsaydı bu yoldan devam edebilirdik. Böylelikle Plotly, oldukça efektif bir uygulama sağlamış oldu.
fig = px.treemap(df, path=[px.Constant('ILCE'),'ILCE', 'MAHALLE'])
fig.update_layout(title_text='İzmir Acil Durum Toplanma Alanları',
title_x=0.5, title_font=dict(size=30)
)
fig.update_traces(textinfo="label+value")
fig.show()
Burada ise en çok toplanma yerlerine sahip olan ilçeleri göstermeyi hedefledim.
ilce_count = df.groupby(pd.Grouper(key='ILCE')).size().reset_index(name='count')
ilce_count_top = ilce_count.nlargest(len(df['ILCE']), 'count')[['ILCE', 'count']]
fig = px.bar(ilce_count_top, x='ILCE', y='count', color='ILCE', text='count')
fig.update_layout(title_text='İzmir Acil Durum Toplanma Alanları',
title_x=0.5, title_font=dict(size=30))
fig.update_traces(texttemplate='%{text:.2s}', textposition='outside')
fig.show()
Yine bu satırda yeni bir kolon yaratma işlemi var. Amaç, mahalleleri tablo ile gösterirken hem aynı isime sahip ama farklı ilçelere ait mahallelerin karışmasını önlemek hem de veriyi daha anlaşılır kılmak.
df['ILCE-MAHALLE'] = df[['ILCE', 'MAHALLE']].agg('-'.join, axis=1)
df
_id | ILCE | ENLEM | ILCEID | MAHALLE | ADI | BOYLAM | ILCE-MAHALLE | |
---|---|---|---|---|---|---|---|---|
0 | 1 | ALİAĞA | 38.882542 | 3 | YENİŞAKRAN | Aliağa Afet ve Acil Durum Toplanma Alanı | 27.065505 | ALİAĞA-YENİŞAKRAN |
1 | 2 | ALİAĞA | 38.774595 | 3 | UZUNHASANLAR | Aliağa Afet ve Acil Durum Toplanma Alanı | 27.083296 | ALİAĞA-UZUNHASANLAR |
2 | 3 | ALİAĞA | 38.795387 | 3 | ATATÜRK | Aliağa Afet ve Acil Durum Toplanma Alanı | 26.965196 | ALİAĞA-ATATÜRK |
3 | 4 | ALİAĞA | 38.701807 | 3 | B.HAYRETTİN PAŞA | Aliağa Afet ve Acil Durum Toplanma Alanı | 27.019168 | ALİAĞA-B.HAYRETTİN PAŞA |
4 | 5 | ALİAĞA | 38.867270 | 3 | HACIÖMERLİ | Aliağa Afet ve Acil Durum Toplanma Alanı | 27.061574 | ALİAĞA-HACIÖMERLİ |
... | ... | ... | ... | ... | ... | ... | ... | ... |
1638 | 1639 | URLA | 38.228551 | 18 | DEMİRCİLİ | Urla Afet ve Acil Durum Toplanma Alanı | 26.686869 | URLA-DEMİRCİLİ |
1639 | 1640 | URLA | 38.298871 | 18 | NOHUTALAN | Urla Afet ve Acil Durum Toplanma Alanı | 26.525551 | URLA-NOHUTALAN |
1640 | 1641 | URLA | 38.324379 | 18 | ALTINTAŞ | Urla Afet ve Acil Durum Toplanma Alanı | 26.757995 | URLA-ALTINTAŞ |
1641 | 1642 | URLA | 38.331348 | 18 | YENİKENT | Urla Afet ve Acil Durum Toplanma Alanı | 26.768912 | URLA-YENİKENT |
1642 | 1643 | URLA | 38.240170 | 18 | ZEYTİNELİ | Urla Afet ve Acil Durum Toplanma Alanı | 26.504383 | URLA-ZEYTİNELİ |
1643 rows × 8 columns
yer_count = df.groupby(pd.Grouper(key='ILCE-MAHALLE')).size().reset_index(name='count')
Yer_count_top = yer_count.nlargest(len(df['ILCE'].value_counts()), 'count')[['ILCE-MAHALLE', 'count']]
fig = px.bar(Yer_count_top, x='ILCE-MAHALLE', y='count', color='ILCE-MAHALLE', text='count')
fig.update_layout(title_text='İzmir Acil Durum Toplanma Alanları',
title_x=0.5, title_font=dict(size=30))
fig.update_traces(texttemplate='%{text:.2s}', textposition='outside')
fig.show()
Bu tabloda ise amacım, acil durum toplanma alanlarının konum bilgilerini taşıyan noktalar ile tablo üzerinde bir haritalandırma yapmaya çalışmaktı. Gördüğünüz gibi noktalara dokundukça konum bilgilerinin İzmir haritası ile uyumlu olduğunu göreceksiniz.
px.scatter(df, x='BOYLAM', y='ENLEM', color='ILCE-MAHALLE')
Projem şimdilik bu kadardı. İlerleyen dönemlerde eklemelerde bulunup işe yarar bir analiz yapmayı hedeflemeye devam edeceğim. İlginiz için teşekkür ederim.
Ulaş Özbent