Last active
June 3, 2020 19:49
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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