#!/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) project_views = wikipedia_pageviews.get_aggregate(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) # Configuration de l’abscisse pour afficher les jours de l’année 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]) # Configuration de l’ordonnée pour être affichée en pourcentage ax.set_ylabel('Proportion de vues par jour') ax.yaxis.set_major_formatter( matplotlib.ticker.FuncFormatter( lambda y, _: '{:.5} ‰'.format(y * 1000).replace('.', ',') ) ) 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) ) article = canonical del canonical redirects = mediawiki_api.article_redirects(site, article) total_views = sum( (wikipedia_pageviews.get_article(project, page) for page in redirects + [article]), start=collections.Counter() ) relative_views = dict(( (date, total_view / project_views[date]) for date, total_view in total_views.items() )) mean_views = wikipedia_pageviews.mean(relative_views) smoothed_views = wikipedia_pageviews.smooth(mean_views, 10) ax.plot(smoothed_views, label=article) fig.legend(framealpha=1) fig.autofmt_xdate() fig.tight_layout() if output_to_file: pyplot.savefig(output) else: pyplot.show()