2019-11-26 15:36:07 +00:00
|
|
|
|
#!/usr/bin/env python3
|
2019-11-26 05:43:40 +00:00
|
|
|
|
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
|
2019-11-26 15:36:07 +00:00
|
|
|
|
logger = logging.getLogger('plot_pageviews')
|
2019-11-26 05:43:40 +00:00
|
|
|
|
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)
|
2019-11-26 18:41:46 +00:00
|
|
|
|
project_views = wikipedia_pageviews.get_aggregate(project)
|
|
|
|
|
|
2019-11-26 05:43:40 +00:00
|
|
|
|
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)
|
|
|
|
|
|
2019-11-26 18:41:46 +00:00
|
|
|
|
# Configuration de l’abscisse pour afficher les jours de l’année
|
2019-11-26 05:43:40 +00:00
|
|
|
|
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])
|
|
|
|
|
|
2019-11-26 18:41:46 +00:00
|
|
|
|
# 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('.', ',')
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
|
2019-11-26 05:43:40 +00:00
|
|
|
|
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)
|
|
|
|
|
)
|
|
|
|
|
|
2019-11-26 18:41:46 +00:00
|
|
|
|
article = canonical
|
|
|
|
|
del canonical
|
2019-11-26 05:43:40 +00:00
|
|
|
|
|
2019-11-26 18:41:46 +00:00
|
|
|
|
redirects = mediawiki_api.article_redirects(site, article)
|
|
|
|
|
total_views = sum(
|
|
|
|
|
(wikipedia_pageviews.get_article(project, page)
|
|
|
|
|
for page in redirects + [article]),
|
2019-11-26 05:43:40 +00:00
|
|
|
|
start=collections.Counter()
|
|
|
|
|
)
|
|
|
|
|
|
2019-11-26 18:41:46 +00:00
|
|
|
|
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)
|
2019-11-26 05:43:40 +00:00
|
|
|
|
|
|
|
|
|
fig.legend(framealpha=1)
|
|
|
|
|
fig.autofmt_xdate()
|
|
|
|
|
fig.tight_layout()
|
|
|
|
|
|
|
|
|
|
if output_to_file:
|
|
|
|
|
pyplot.savefig(output)
|
|
|
|
|
else:
|
|
|
|
|
pyplot.show()
|