Udim aylık bültenlerinden verileri çıkarma

Bitirme ödevimde kullanmak için Kandilli'den Van depremi ve sonrasında olan depremleri almak istedim. Fakat bu veriler kolaylıkla kullanılabilecek bir biçimde sunulmuyor. Bu yüzden AFAD'ın verilerine baktım fakat orada da Van depreminin büyüklüğü 6.7 olarak duruyordu. Ben de Kandilli'nin pdf olarak yayınladığı aylık bültenlerden depremleri çıkarmayı denedim.

pdf2text araçları maalesef bu iş için yeterli değildi. Tablo yapısını tanıyamadıklarından düzgün bir çıktı vermiyorlardı. Python için PDFMiner kütüphanesi de çok yavaş çalışınca diğer pdf kütüphanelerine bakmam gerekti. Poppler, Podofo gibi yaygın olarak kullanılan kütüphanelerin dökümanların yok denecek kadar az olması biraz ürküttü ama sonunda poppler'ın python binding'i ile ilgili küçük tutorial buldum. Python sınıflarının fonksiyonlara bakarak işime yarayacak Page sınıfının get_text fonksiyonunu çalıştırmaya çalıştım. Bu fonksiyonun ilk argümanı selection style, ikincisi ise rectangle. Selection style için poppler.SELECTION_GLYPH, poppler.SELECTION_LINE, poppler.SELECTION_WORD gibi argümanlar olsa da 0 (Sanırım SELECTION_GLYPH) kullanmak benim için en iyi sonucu verdiği için onu kullandım. Rectangle için python binding bir fonksiyon vermediği için elle bu basit fonksiyonu yazmam gerekti.

def new_rect(x1, y1, x2, y2):
    r = poppler.Rectangle()
    r.x1 = x1
    r.y1 = y1
    r.x2 = x2
    r.y2 = y2
    return r

Sonrasında bütün satırı bir seçim ile almak istedim fakat bunda da sorunlar çıkıyordu. Bu yüzden her değeri ayrı ayrı seçip işleme aldım. Deprem büyüklüklerini de tersten seçerek(sağdan sola) oluşan bazı sorunları gidermiş oldum. Böylece o kadar depremi tek tek seçerek bir kullanılabilir bir veriye çevirebildim. Biraz zorlama bir yöntem de olsa elle yapmaktan iyidir :)

Verileri ilk olarak mongodb'ye aktardım. Verilerin doğruluğunu test etmek için de Ekim 2011 bültenindeki "38.2-39.2 Kuzey, 42.5-44.5 Doğu koordinatları arasındaki depremlerin günlük dağılım grafiği" başlıklı grafiği matplotlib kullanarak oluşturarak muradıma ermiş oldum.

Grafik için kullanılan kod:

import datetime
import matplotlib.pyplot as plt
import numpy
import pymongo
quakes = pymongo.Connection().test.quakes
query = {'location': {'\$within': {'\$box': [[38.2, 42.5],
                                             [39.2, 44.5]]}},
         'date': {'\$gte':datetime.datetime(2011,10, 23)}}
dates = []
for quake in quakes.find(query):
    dates.append(quake['date'])
days = numpy.array(map(lambda x:x.day, dates))
plt.hist(days, bins=9)
plt.xlim(23, 31)
plt.savefig('van.jpg')
plt.show()

Ve Sonuç: van

Kodlar github'da: https://github.com/rdno/kandillibulten