voting/bin/membership-graph.py
Tobias Mueller 044a449b46 Add a simple visualization script
Inititally written by Daniel Siegel. It can plot graphs based on CSV
data. Feel free to move this script to a more appropriate place.
2009-09-02 15:48:05 +02:00

128 lines
4.1 KiB
Python

#!/usr/bin/env python
'''
Simple script which takes CSV Data either from stdin or a given filename and plots a graph out of that.
You might want to retrieve CSV Data by executing the following command:
mysql -h button-back -u anonvoting -p foundation -B -e 'SELECT DATE_FORMAT(first_added, "%Y-%m") AS date, COUNT(*) as joined FROM foundationmembers GROUP BY date;' | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' | awk 'FNR>1'
mysql -h button-back -u anonvoting -p foundation -B -e "SET @start = '2009-01-01', @end = '2009-08-30'; SELECT DATE_FORMAT(DATE_ADD(last_renewed_on, INTERVAL 2 YEAR), '%Y-%m') as date, COUNT(*) as dropped_out FROM foundationmembers WHERE last_renewed_on >= DATE_SUB(@start, INTERVAL 2 YEAR) AND last_renewed_on <= DATE_SUB(@end, INTERVAL 2 YEAR) GROUP BY date;" | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' | awk 'FNR>1'
'''
import logging
import pylab
from pylab import figure, title, bar, xticks, yticks, gca, savefig
import sys
plot_title = "New Foundation Members"
figwidth = 40
figheight = 3
def bar_date_graph(name_value_dict, graph_title="", output_name="bargraph.png", show=False):
fig = figure(
#figsize=(figwidth, figheight)
)
title(graph_title,
#size="x-small"
)
sortedkeys, sortedvalues = zip(*sorted(zip(name_value_dict.keys(),
name_value_dict.values()), reverse=False))
for i, value in zip(range(len(sortedvalues)), sortedvalues):
bar(i + 0.25, value, color="#73d216")
pylab.xticks(pylab.arange(0.65, len(sortedkeys)),
[("%s: %d" % (name, value))
for name, value in zip(sortedkeys, sortedvalues)],
#size="xx-large",
)
yticks(
#size="xx-large"
)
gca().yaxis.grid(which="major")
fig.autofmt_xdate()
savefig(output_name)
if show:
pylab.show()
def normalize(*args):
out = []
for a in args:
cleaned = a.strip(' "')
#cleaned = int(a)
out.append(cleaned)
return out
if __name__=="__main__":
from optparse import OptionParser
parser = OptionParser("usage: %prog [options] INFILE")
parser.add_option("-l", "--loglevel", dest="loglevel",
help="Sets the loglevel to one of debug, info, warn,"
" error, critical", default="error")
parser.add_option("-o", "--output",
dest="output", default="bargraph.png",
help="file to create with the plotted graph")
parser.add_option("-s", "--show",
dest="show", default="False", action="store_true",
help="display the graph after it has been drawn")
parser.add_option("-t", "--title",
dest="title", default="New Foundation Members",
help="set the title of the graph")
(options, args) = parser.parse_args()
loglevel = {'debug': logging.DEBUG, 'info': logging.INFO,
'warn': logging.WARN, 'error': logging.ERROR,
'critical': logging.CRITICAL}.get(options.loglevel, "error")
logging.basicConfig(level=loglevel)
log = logging.getLogger("MembershipGraph Main")
output_fname = options.output
if len(args) > 0:
fname = args[0]
if fname == '-':
infile = sys.stdin
else:
infile = file(fname, 'r')
else:
path = sys.stdin
values = {}
date = None
first = None
lines = infile.readlines()
for line in lines:
l = line.strip().split(",")
if l and l[0] and l[1]:
x, y = normalize(l[0], l[1])
print x, y
if not first:
first = x
last = x
values[x] = int(y)
date = first
while date != last:
year, month = date.split("-")
month = int(month)
year = int(year)
month += 1
if month > 12:
month = 1
year += 1
date = "-".join([str(year), str('%02d' % month)])
if date not in values:
values[date] = 0
bar_date_graph(values, options.title, output_fname, show=options.show)