#!/usr/bin/env python3 import calendar import collections from datetime import datetime from fetch import wikipedia_pageviews, mediawiki_api import logging import matplotlib from matplotlib import pyplot import sys # Objet pour afficher le journal d’exécution logger = logging.getLogger('plot_pageviews') logging.basicConfig(level=logging.INFO) if len(sys.argv) < 4: print("""Utilisation : {} [project] [output] [article]... Représente sur un graphe les statistiques moyennes de vues de pages wiki. Paramètres : project Projet Wikipédia ciblé (par exemple fr.wikipedia.org). output Nom du fichier de sortie où sera sauvé le graphe, ou '-' pour afficher le résultat à l’écran. article Nom(s) d’article(s) Wikipédia ciblé(s). Au moins un article doit être donné. Le nombre de visites est lissé avec un noyau gaussien d’écart-type 10 jours. Les redirections d’article sont suivies et toute visite sur une page de redirection pointant vers l’article est dénombrée comme une visite sur la page canonique. """.format(sys.argv[0]), end='', file=sys.stderr) sys.exit(1) project = sys.argv[1] output = sys.argv[2] articles = sys.argv[3:] site = mediawiki_api.instanciate(project) output_to_file = output != '-' if output_to_file: matplotlib.use('pgf') matplotlib.rcParams.update({ 'pgf.texsystem': 'xelatex', 'font.family': 'serif', 'text.usetex': True, 'pgf.rcfonts': False, }) fig = pyplot.figure(figsize=(4.7, 3.3)) ax = fig.add_subplot(111) ax.set_xlabel('Jours de l’année') ax.set_xticks([ datetime(1, month, 1).toordinal() for month in range(1, 13) ]) ax.set_xticklabels(calendar.month_abbr[1:13]) for article in articles: canonical = mediawiki_api.article_canonical(site, article) if article != canonical: logger.info( 'Suivi de la redirection de « {} » en « {} »' .format(article, canonical) ) del article redirects = mediawiki_api.article_redirects(site, canonical) mean_views = wikipedia_pageviews.mean(sum( (wikipedia_pageviews.get(project, page) for page in redirects + [canonical]), start=collections.Counter() )) ax.plot( wikipedia_pageviews.smooth(mean_views, 10), label=canonical ) ax.set_ylabel('Vues par jour') fig.legend(framealpha=1) fig.autofmt_xdate() fig.tight_layout() if output_to_file: pyplot.savefig(output) else: pyplot.show()