Last active
February 2, 2023 09:55
-
-
Save 15Galan/8d88ebb364f7b6a60c4f012f4e9dabc2 to your computer and use it in GitHub Desktop.
Script que agrupa los usuarios de 42 de una votación de 6 opciones y realiza operaciones con ellos, además de generar un gráfico de barras.
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
# LIBRERÍAS | |
import re | |
# VARIABLES | |
texto = open('votación.txt', 'r').read() | |
usuarios = [set(), set(), set(), set(), set(), set()] | |
fijos = [set(), set(), set(), set(), set(), set()] | |
ancho = 5 * 8 + 4 * 4 | |
divisor = '-' * ancho | |
# Agrupar los usuarios por opción | |
opcion = 0 | |
for linea in texto.splitlines(): # Texto en líneas | |
for palabra in linea.split(): # Línea en palabras | |
if palabra == ':uno:': | |
opcion = 1 | |
elif palabra == ':dos:': | |
opcion = 2 | |
elif palabra == ':tres:': | |
opcion = 3 | |
elif palabra == ':cuatro:': | |
opcion = 4 | |
elif palabra == ':cinco:': | |
opcion = 5 | |
elif palabra == ':seis:': | |
opcion = 6 | |
elif re.compile(r'@(\w+)').match(palabra): | |
usuarios[opcion - 1].add(palabra[1:]) # Se elimina el '@' | |
# Imprimir los usuarios agrupados | |
i = 1 | |
for grupo in usuarios: | |
j = 0 | |
# Cabecera | |
print('Opción %d:' % i) | |
print(divisor) | |
# Cuerpo | |
for usuario in sorted(grupo): # Se ordenan los usuarios alfabéticamente | |
if j % 5 != 4: | |
print('{} '.format(usuario), end='') | |
else: | |
print('{} '.format(usuario)) | |
j += 1 | |
# Pie | |
pie = 'Total: {}\n\n'.format(len(grupo)) | |
if (len(grupo) % 5) != 0: | |
print('') | |
print(divisor) | |
print(' ' * (ancho - len(pie) + 1), pie) | |
i += 1 | |
print('\n') | |
# Obtener los usuarios fijos | |
for i in range(6): | |
for j in range(6): | |
if i != j: | |
fijos[i] = fijos[i].union(usuarios[j]) | |
for i in range(6): | |
fijos[i] = usuarios[i].difference(fijos[i]) | |
# Imprimir los usuarios fijos | |
i = 1 | |
for grupo in fijos: | |
j = 0 | |
# Cabecera | |
print('Opción %d (fijos):' % i) | |
print(divisor) | |
# Cuerpo | |
for usuario in sorted(grupo): # Se ordenan los usuarios alfabéticamente | |
if j % 5 != 4: | |
print('{} '.format(usuario), end='') | |
else: | |
print('{} '.format(usuario)) | |
j += 1 | |
# Pie | |
pie = 'Total: {}\n\n'.format(len(grupo)) | |
if (len(grupo) % 5) != 0: | |
print('') | |
print(divisor) | |
print(' ' * (ancho - len(pie) + 1), pie) | |
i += 1 | |
print('\n') | |
# Imprimir los usuarios por densidad | |
i = 0 | |
for grupo in usuarios: | |
j = 0 | |
# Cabecera | |
print('Opción {} (densidad):'.format(i+1)) | |
print(divisor) | |
# Cuerpo | |
for usuario in sorted(grupo): # Se ordenan los usuarios alfabéticamente | |
if j % 5 != 4: | |
if usuario in fijos[i]: | |
print('\033[1m{}\033[0m '.format(usuario), end='') | |
else: | |
print('{} '.format(usuario), end='') | |
else: | |
if usuario in fijos[i]: | |
print('\033[1m{}\033[0m '.format(usuario)) | |
else: | |
print('{} '.format(usuario)) | |
j += 1 | |
# Pie | |
try: | |
pie = 'Densidad: {:.1f}\n\n'.format(len(fijos[i])/len(grupo)) | |
except ZeroDivisionError: | |
pie = 'Densidad: 0.0\n\n' | |
if (len(grupo) % 5) != 0: | |
print('') | |
print(divisor) | |
print(' ' * (ancho - len(pie) + 1), pie) | |
i += 1 | |
# Crear gráficas en base a los datos obtenidos | |
import matplotlib.pyplot as grafico | |
# Datos | |
opciones = ['26 y 27\ntarde', '27 y 28\ntarde', '28 y 29\nmañana', '28 y 29\ntarde', 'Piscina\n(durante)', 'Piscina\n(después)'] | |
fijos = [len(fijos[0]), len(fijos[1]), len(fijos[2]), len(fijos[3]), len(fijos[4]), len(fijos[5])] | |
usuarios = [len(usuarios[0]), len(usuarios[1]), len(usuarios[2]), len(usuarios[3]), len(usuarios[4]), len(usuarios[5])] | |
# Establecer dimensiones predefinidas | |
figura = grafico.figure() | |
figura.set_figheight(8) # Pulgadas (7.5" ~ 720 px) | |
figura.set_figwidth(12) # Pulgadas (11.5" ~ 1080 px) | |
# Gráfico de barras superpuestas (usuarios fijos sobre total) | |
grafico.bar(opciones, fijos, label='Fijos', color='blue') | |
grafico.bar(opciones, usuarios, label='Totales', color='deepskyblue', bottom=fijos) | |
grafico.legend() | |
grafico.title('¿Cuándo se hace la charla de Git y GitHub?') | |
grafico.xlabel('Opciones') | |
grafico.ylabel('Usuarios') | |
# Guardar gráfico | |
grafico.savefig('votacion.png') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment