Skip to content

Instantly share code, notes, and snippets.

@danilomac
Last active June 3, 2020 19:49
Show Gist options
  • Save danilomac/a0860cfc112c227a9377f88a23e13a82 to your computer and use it in GitHub Desktop.
Save danilomac/a0860cfc112c227a9377f88a23e13a82 to your computer and use it in GitHub Desktop.
script para gerar gráfico de número de usuários por mês separados por mês de primeira edição, precisa dos dados em csv para funcionar
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
import numpy as np
import re
data = {}
mn, mx = 999999, 0
ip = re.compile(r'\d+\.\d+\.\d+\.|[0-9a-fA-F]::?[0-9a-fA-F]')
with open('ptwiki-monthly-user-edits.csv') as f:
head = True
c = 0
for l in f:
if head or not l:
head = False
continue
l = l.strip('\n').split(',')
name = l[1]
c += 1
# descarta IPs
if ip.search(name):
continue
month = int(l[0][0:4] + l[0][5:7])
data.setdefault(name, []).append(month)
mn = min(mn, month)
mx = max(mx, month)
print('%d linhas não são IPs, %.1f%%' % (len(data), float(len(data)) * 100 / c))
print('%d usuários, mês mínimo = %d, mês máximo = %d' % (len(data), mn, mx))
# cria um índice de meses
index = []
m = mn
while m <= mx:
index.append(m)
m += m % 100 == 12 and 89 or 1
# cria a tabela e faz a soma dos usuários em cada mês
values = np.zeros((len(index), len(index)))
for months in data.values():
values[index.index(min(months)), :] += [m in months for m in index]
# cria os ticks dos eixos dos gráficos espaçados de 5 em 5 anos
t, tl = zip(*[(i, m // 100) for i, m in enumerate(index) if m % 500 == 1])
cm = plt.cm.rainbow
cm.set_under(alpha=0.0)
plt.pcolormesh(values, cmap=cm, vmin=1, vmax=50)
plt.xticks(t, tl)
plt.yticks(t, tl)
plt.xlabel('mês em que houve edição')
plt.ylabel('mês da primeira edição')
plt.title('Número de usuários que editaram por mês\nseparados por mês da primeira edição')
cb = plt.colorbar()
cb.set_ticks([10, 20, 30, 40, 50])
cb.set_ticklabels([10, 20, 30, 40, '50+'])
plt.show()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment