source: osmose-frontend/errors_graph.py

Last change on this file was e0f43d6, checked in by Jocelyn Jaubert <jocelyn.jaubert@…>, 5 years ago

Fix arguments to _build_param() on heatmap and graph

  • Property mode set to 100644
File size: 5.8 KB
Line 
1#! /usr/bin/env python
2#-*- coding: utf-8 -*-
3
4###########################################################################
5##                                                                       ##
6## Copyrights Etienne Chové <chove@crans.org> 2009                       ##
7##                                                                       ##
8## This program is free software: you can redistribute it and/or modify  ##
9## it under the terms of the GNU General Public License as published by  ##
10## the Free Software Foundation, either version 3 of the License, or     ##
11## (at your option) any later version.                                   ##
12##                                                                       ##
13## This program is distributed in the hope that it will be useful,       ##
14## but WITHOUT ANY WARRANTY; without even the implied warranty of        ##
15## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         ##
16## GNU General Public License for more details.                          ##
17##                                                                       ##
18## You should have received a copy of the GNU General Public License     ##
19## along with this program.  If not, see <http://www.gnu.org/licenses/>. ##
20##                                                                       ##
21###########################################################################
22
23import time, sys, datetime, StringIO, os, tempfile
24from datetime import timedelta
25os.environ['MPLCONFIGDIR'] = tempfile.mkdtemp()
26import matplotlib
27# Force matplotlib to not use any Xwindows backend.
28matplotlib.use('Agg')
29import matplotlib.pyplot
30import matplotlib.dates
31from tools import query
32
33
34def get_data(db, options):
35    sqlbase = """
36SELECT
37    date,
38    SUM(count)
39FROM (
40    SELECT
41        date_trunc('day', marker.timestamp) AS date,
42        AVG(marker.count) AS count
43    FROM
44        %s
45    WHERE
46        %s
47    GROUP BY
48        marker.source,
49        marker.class,
50        date
51    ) AS t
52GROUP BY
53    date
54ORDER BY
55    date
56"""
57
58    params = query._params()
59    join, where = query._build_param(None, None, None, params.source, params.item, params.level, None, params.classs, params.country, params.useDevItem, None, params.tags, None, stats=True, start_date=params.start_date, end_date=params.end_date)
60    sql = sqlbase % (join, where)
61
62    if len(sys.argv)>1:
63      print sql
64
65    result = []
66    db.execute(sql)
67    for r in db.fetchall():
68        result.append((r[0],r[1]))
69    return result
70
71
72def get_text(db, options):
73    if len(options.sources)==1 and len(options.classes)==1:
74        db.execute("SELECT title->'en' FROM dynpoi_class WHERE source=%s AND class=%s;", (options.sources[0], options.classes[0]))
75    elif len(options.items)==1 and len(options.classes)==1:
76        db.execute("SELECT title->'en' FROM dynpoi_class WHERE class=%s AND item=%s LIMIT 1;", (options.classes[0], options.items[0]))
77    elif len(options.items)==1:
78        db.execute("SELECT menu->'en' FROM dynpoi_item WHERE item=%s LIMIT 1;", (options.items[0],))
79    else:
80        return ""
81
82    res = db.fetchone()
83    if res and res[0]:
84        return res[0]
85    else:
86        return ""
87
88
89def get_src(db, options):
90    if len(options.sources) == 1:
91        db.execute("SELECT country, analyser FROM source WHERE id=%s;", (options.sources[0], ))
92        r = db.fetchone()
93        return r[0] + " - " + r[1]
94
95    elif options.country:
96        return str(options.country)
97
98    else:
99        return "All"
100
101
102def convIntsToStr(values):
103    """
104    Convertie une liste d'entier en chaine
105    """
106    return ", ".join([str(elt) for elt in values])
107
108
109def make_plt(db, options, format):
110    data = get_data(db, options)
111    text = get_text(db, options)
112    src = get_src(db, options)
113    return plot(data, text+' '+src, format)
114
115
116class AutoDateLocatorDay(matplotlib.dates.AutoDateLocator):
117    def get_locator(self, dmin, dmax):
118        if dmax-dmin <= timedelta(days=5):
119            return matplotlib.dates.AutoDateLocator.get_locator(self, dmax-timedelta(days=5), dmax)
120        else:
121            return matplotlib.dates.AutoDateLocator.get_locator(self, dmin, dmax)
122
123
124def plot(data, title, format):
125    dates = [q[0] for q in data]
126    opens = [q[1] for q in data]
127
128    fig = matplotlib.pyplot.figure()
129    ax = fig.add_subplot(111)
130    ax.plot_date(dates, opens, '-', color='r')
131    ax.set_title(title)
132    # format the ticks
133    ax.relim()
134    if len(opens) > 1:
135       ytop = float(max(opens)) * 1.05 + 1
136    else:
137       ytop = None
138    ax.set_ylim(bottom=0, top=ytop)
139    ax.autoscale_view()
140    # format the coords message box
141    ax.fmt_ydata = lambda x: '$%1.2f'%x
142    ax.grid(True)
143
144    locator = AutoDateLocatorDay()
145    locator.set_axis(ax.xaxis)
146    locator.refresh()
147    formatter = matplotlib.dates.AutoDateFormatter(locator)
148    formatter.scaled[30.] = '%Y-%m'
149    formatter.scaled[1.0] = '%Y-%m-%d'
150    ax.xaxis.set_major_formatter(formatter)
151
152    fig.autofmt_xdate()
153
154    buf = StringIO.StringIO()
155    fig.savefig(buf, format = format)
156    matplotlib.pyplot.close(fig)
157    return buf.getvalue()
158
159
160if __name__ == "__main__":
161    from optparse import OptionParser, SUPPRESS_HELP
162    start = time.clock()
163
164    parser = OptionParser()
165    parser.add_option("--source", dest="sources", type="int", action="append", default=[])
166    parser.add_option("--class", dest="classes", type="int", action="append", default=[])
167    parser.add_option("--item", dest="items", type="int", action="append", default=[])
168    parser.add_option("--level", dest="levels", type="int", action="append", default=[])
169    parser.add_option("--country", dest="country", type="string", default=None)
170    (options, args) = parser.parse_args()
171
172    data = make_plt(None, options, "png")
173    f = open("graph.png", "w")
174    f.write(data)
175    f.close()
176    end = time.clock()
177    print "graph.png generated in %ims"%((end-start)*1000)
178    sys.exit(0)
Note: See TracBrowser for help on using the repository browser.