Skip to content

Instantly share code, notes, and snippets.

@15Galan
Last active February 2, 2023 09:55
Show Gist options
  • Save 15Galan/8d88ebb364f7b6a60c4f012f4e9dabc2 to your computer and use it in GitHub Desktop.
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.
# 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