<txp:article status="sticky" limit=1 /> ->  Textpattern Warning: Die Werte für Attribute müssen in Hochkommata eingeschlossen werden  on line 916
textpattern/lib/txplib_misc.php:916 trigger_error()
textpattern/publish.php:1090 splat()
textpattern/publish.php:1012 processTags()
textpattern/publish.php:496 parse()
index.php:33 textpattern()
Peterpedia-Flash: Making of "Spam: Leihgaben ausgewertet"
Übersicht Peterpedia lesen What's up Peterpedia? Administration Suche

Making of "Spam: Leihgaben ausgewertet" · Jun 16, 19:44 von stargaming

Die tolle Grafik in Spam: Leihgaben ausgewertet wurden anhand dieses Codeschnipsels erstellt.

Ich hab’s mit Python 2.5 getestet. Dazu braucht man noch Matplotlib zum Plotten.

Die Daten werden aus Mbox-Dateien extrahiert — solche legt z. B. Thunderbird im Benutzerordner an. In der aktuellen Einstellung werden da einfach nur alle Beträge in Dollar rausgelesen.

Benutzt wird das Programm mit keinen Programmparametern (dann erwartet es die Daten in der Datei “Test”), sonst kann auch die Quelldatei über die Befehlszeile angegeben werden. Ausgabe passiert immer nach “loans.png”. Die Transparenz (wie im Artikel) habe ich mit Gimp nachgebessert, da ich sonst noch PIL (Python Imaging Library) oder sonstiges benutzen hätte müssen.

python:
  1. #!/usr/bin/env python
  2. # encoding: utf-8
  3. #
  4. #
  5.  
  6. from __future__ import with_statement, division
  7.  
  8. # logging
  9. from logging import *
  10. basicConfig(level=DEBUG,
  11.             datefmt='%M:%S',
  12.             format='%(relativeCreated)05d %(levelname)8s: %(message)s')
  13. debug('Enabled log.')
  14.  
  15. # reading mbox-format Mailboxes (Mozilla/Netscape)
  16. debug('Loading mailbox reader..')
  17. from mailbox import mbox
  18.  
  19. # parsing utilites
  20. debug('Loading email parsers..')
  21. import datetime as _dt
  22. _strptime = _dt.datetime.strptime
  23. from re import compile as _compile
  24. from operator import itemgetter as _item
  25. from collections import defaultdict as _dict
  26.  
  27. # plotting framework
  28. debug('Loading plotting framework..')
  29. import pylab
  30.  
  31. info('All packages included.')
  32.  
  33. money = _compile(r'''\$(\d{1,3}),000''')
  34. avg = lambda *a:sum(a) // len(a)
  35.  
  36. def main(path):
  37.     info('Opening mbox..')
  38.     repo = mbox(path)
  39.     info('Creating database..')
  40.     loan = _dict(list)
  41.     info('Parsing %d emails..', len(repo))
  42.     for mail in repo.itervalues():
  43.         amount = money.search(mail.as_string())
  44.         if amount:
  45.             date = _strptime(mail.get_from(), '- %a %b %d %H:%M:%S %Y')
  46.             amount = int(amount.group(1).replace(',', ''))
  47.             loan[date].append(amount)
  48.     del repo
  49.     info('Matched %d emails.', len(loan))
  50.     info('Building an average value of every date..')
  51.     loanavg = list()
  52.     for date, amounts in loan.iteritems():
  53.         loanavg.append((date, avg(*amounts)))
  54.     del loan
  55.     info('Sorting results..')
  56.     loanavg.sort(key=_item(0))
  57.     info('Extracting information..')
  58.     x, y = zip(*loanavg)
  59.     x = pylab.date2num(x)
  60.     del loanavg
  61.  
  62.     info('Plotting %d dates..', len(x))
  63.     debug('Drawing first plot..')
  64.     pylab.xlabel('date')
  65.     pylab.ylabel('loan in $1000')
  66.     pylab.plot_date(x,
  67.                     y,
  68.                     xdate=True,
  69.                     linestyle='-',
  70.                     markersize=0.01,
  71.                    )
  72.     pylab.axis('tight')
  73.  
  74.     info('Saving plot to file..')
  75.     pylab.savefig('loans.png', facecolor='white')
  76.     info('Showing plot..')
  77.     pylab.show()
  78.  
  79.  
  80. if __name__ == '__main__':
  81.     from sys import argv
  82.     if len(argv) >= 2:
  83.         main(' '.join(argv[1:]))
  84.     else:
  85.         main('Test')

Artikel bearbeiten