Matplotlib İle Gmail Analizi

Python'un son gunlerde çok fazla kullanılmaya başladığı alanlardan birisi de kuşkusuz bilimsel araştırmalar oldu.Marsa gonderilen Curiosity'nin bile test kısımları Python ile yapılmıştı.Ben de bu yuzden onceden beri ilgili olduğum bu alana şoyle bir bakayım dedim.Kutuphaneler ile uğraştığımdan kendimi bir kaç çizim kutuphanesi aradım.Geçen yazımda gosterdiğim gibi Turtle adında bir tane bulmuştum.Ancak onun ile bilimsel araştırma duzeyinde ciddi proje yapmak pek mumkun değil.Sadece algoritma duzeyinizin gelişmesinde rol oynabilir.Ben biraz daha matlab'a yakın bir kutuphane arıyordum ve matplotlibi buldum.Adı bana matlabı andırıyor.Hatta syntaxı bile matlab'dan Python'a geçeceklerin rahat alışması için benzer yapılmış.

Bende bu kutuphane ile uğraşırken guzel bir kod parçası buldum ve bunu kendime gore biraz değiştirdim.Bu kod ile gmail adresinize gelen mailleri zamanlara gore kıyaslayıp guzel bir grafik elde edebiliyorsunuz.En azından guzel bir çizim aracı arayanlar için ornek olabilir.Kod aşağıdaki gibi.Benim mail adresime ait ornek çıktılar da hemen alt tarafta.

Kodun yaptığı işe gelirsen oncelikle gmail adresimizden maillerin başlık kısımlarını alıyor ve daha sonra bunları çeşitli zamanlarda gelen mailler olarak donduruyor.İlk 2 fonksiyon bu işe yarıyor.Son fonksiyonda matplotlib kutuphanesi ile gelen verileri ekrana basıyor.Aşağıdaki kod ile son 5 yıla ait gelen maillerinizin grafiğini çizdirebilirsiniz.Eğer giden maillerinize bakmak isterseniz alt kısımda yer alan inbox ismini sent yapmanız yeterlidir.

Aşağıdaki kodu çalıştırmak için sadece mail adresiniz ve şifrenizi girmeniz yeterlidir.Ayrıcana ben gmail kullandım diye sizde onu kullanmak zorunda değilsiniz.İlk fonksiyonda değişiklik yaparak diğer sunucularda da kullanılabilir hale getirebilirsiniz.

from imaplib import IMAP4_SSL
from datetime import date, timedelta, datetime
from time import mktime
from email.utils import parsedate
from pylab import plot_date, show, xticks, date2num
from pylab import figure, hist, num2date
from matplotlib.dates import DateFormatter


def getHeaders(address, password, folder, d):
    """ retrieve the headers of the emails
        from d days ago until now """
    # imap connection
    mail = IMAP4_SSL('imap.gmail.com')
    mail.login(address, password)
    mail.select(folder)
    # retrieving the uids
    interval = (date.today() - timedelta(d)).strftime("%d-%b-%Y")
    result, data = mail.uid('search', None,
                            '(SENTSINCE {date})'.format(date=interval))
    # retrieving the headers
    result, data = mail.uid('fetch', data[0].replace(' ', ','),
                            '(BODY[HEADER.FIELDS (DATE)])')
    mail.close()
    mail.logout()
    return data

def diurnalPlot(headers):
    xday = []
    ytime = []
    for h in headers:
        if len(h) > 1:
            timestamp = mktime(parsedate(h[1][5:].replace('.', ':')))
            mailstamp = datetime.fromtimestamp(timestamp)
            xday.append(mailstamp)
            # Time the email is arrived
            # Note that years, month and day are not important here.
            y = datetime(2010, 10, 14,
                         mailstamp.hour, mailstamp.minute, mailstamp.second)
            ytime.append(y)

    plot_date(xday, ytime, '.', alpha=.7)
    xticks(rotation=30)
    return xday, ytime

def dailyDistributioPlot(ytime):
    """ draw the histogram of the daily distribution """
    # converting dates to numbers
    numtime = [date2num(t) for t in ytime]
    # plotting the histogram
    ax = figure().gca()
    _, _, patches = hist(numtime, bins=24, alpha=.5)
    # adding the labels for the x axis
    tks = [num2date(p.get_x()) for p in patches]
    xticks(tks, rotation=75)
    # formatting the dates on the x axis
    ax.xaxis.set_major_formatter(DateFormatter('%H:%M'))

print 'Fetching emails...'
headers = getHeaders('info@halitalptekin.com',
                     'mailsifrem', 'inbox', 365 * 5)

print 'Plotting some statistics...'
xday, ytime = diurnalPlot(headers)
dailyDistributioPlot(ytime)
print len(xday), 'Emails analysed.'
show()

Ben baya mail silmeme rağmen toplam 2035 mailimi inceledi.Ve sonuçları da çok kısa bir sure içerisinde gosterdi.

Python Gmail Matplotlib

Python Gmail Matplotlib 2

comments powered by Disqus