Skip to content

Commit 11cb609

Browse files
Add files via upload
1 parent 42d9b81 commit 11cb609

File tree

3 files changed

+203
-0
lines changed

3 files changed

+203
-0
lines changed

votacao.gs

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
// Função para verificar e processar novos votos
2+
function repetirProcesso() {
3+
ScriptApp.newTrigger("verificarNovosVotos")
4+
.timeBased()
5+
.everyHours(1) // Repetir a cada 60 minutos
6+
.create();
7+
}
8+
9+
function verificarNovosVotos() {
10+
var planilha = SpreadsheetApp.getActiveSpreadsheet();
11+
12+
// Verificar se a aba "Respostas" existe
13+
var folha = planilha.getSheetByName("Respostas");
14+
15+
// Se a aba não existir, criar automaticamente
16+
if (!folha) {
17+
Logger.log("A aba 'Respostas' não foi encontrada. Criando uma nova aba...");
18+
folha = planilha.insertSheet('Respostas');
19+
20+
// Adicionar colunas de exemplo (ajuste conforme o necessário)
21+
folha.appendRow(['Timestamp', 'Email Address', '1ª escolha', '2ª escolha', '3ª escolha']);
22+
}
23+
24+
// Verificar quantas linhas existem na aba
25+
var ultimaLinha = folha.getLastRow();
26+
27+
if (ultimaLinha < 2) {
28+
Logger.log("Nenhum voto encontrado.");
29+
return; // Saímos da função, pois não há votos para processar
30+
}
31+
32+
// Verificar se há pelo menos 20 votos
33+
if (ultimaLinha >= 20) {
34+
// Pegar os últimos 20 votos
35+
var novosVotos = folha.getRange(ultimaLinha - 19, 1, 20, folha.getLastColumn()).getValues();
36+
processarVotos(novosVotos);
37+
} else {
38+
Logger.log("Ainda não há 20 votos. Última linha: " + ultimaLinha);
39+
}
40+
}
41+
42+
// Função para processar os votos
43+
function processarVotos(votos) {
44+
Logger.log("Processando os votos...");
45+
46+
// Aqui você pode adicionar a lógica de processamento dos votos
47+
Logger.log("Votos recebidos: " + JSON.stringify(votos));
48+
49+
// Executar o notebook do Google Colab com os votos processados
50+
executarNotebook(votos);
51+
}
52+
53+
// Função para executar o notebook do Google Colab
54+
function executarNotebook(votos) {
55+
var urlNotebook = "https://colab.research.google.com/drive/1GHn8ZSrAyi9d8kVgIfv2Yq-Cq_YD-NYaCDN15VPHO2g";
56+
57+
Logger.log("Executando o notebook com os dados processados.");
58+
59+
// Exibir um link para o usuário executar o notebook manualmente
60+
var htmlOutput = HtmlService.createHtmlOutput('<a href="' + urlNotebook + '" target="_blank">Executar Notebook</a>');
61+
SpreadsheetApp.getUi().showModelessDialog(htmlOutput, 'Executar Notebook');
62+
}
63+
64+
// Função para repetir o processo de verificação a cada 60 minutos
65+
function repetirProcesso() {
66+
ScriptApp.newTrigger("verificarNovosVotos")
67+
.timeBased()
68+
.everyHours(1) // Repetir a cada 60 minutos
69+
.create();
70+
}
71+
72+
// Função para configurar a validação do formulário
73+
function configurarValidacao() {
74+
var form = FormApp.getActiveForm();
75+
var item = form.getItems(FormApp.ItemType.GRID)[0]; // Supondo que a grade seja o primeiro item
76+
77+
// Configurar validação para cada coluna (1ª, 2ª e 3ª escolha)
78+
for (var i = 0; i < item.getColumns().length; i++) {
79+
var validation = FormValidationBuilder.create()
80+
.setRequired(true) // Tornar a escolha obrigatória
81+
.build();
82+
item.setColumnValidators([validation, validation, validation]); // Aplicar a mesma validação às 3 colunas
83+
}
84+
}
85+
86+
// Função para lidar com o envio do formulário
87+
function onFormSubmit(e) {
88+
var respostas = e.response.getItemResponses();
89+
var ativosSelecionados = [];
90+
91+
// Validar se as respostas são únicas
92+
for (var i = 0; i < respostas.length; i++) {
93+
var resposta = respostas[i].getResponse();
94+
if (ativosSelecionados.includes(resposta)) {
95+
e.response.setConfirmationMessage("Erro: Você deve selecionar 3 ativos *diferentes*. Por favor, revise suas escolhas.");
96+
return;
97+
}
98+
ativosSelecionados.push(resposta);
99+
}
100+
101+
if (ativosSelecionados.length !== 3) {
102+
e.response.setConfirmationMessage("Erro: Você deve selecionar exatamente 3 ativos. Por favor, revise suas escolhas.");
103+
return;
104+
}
105+
106+
// Opcional: formatar os dados para CSV, se necessário
107+
}

votacao.ipynb

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

votacao.py

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
import pandas as pd
2+
import gspread
3+
from google.colab import auth
4+
from google.auth import default
5+
import seaborn as sns
6+
import matplotlib.pyplot as plt
7+
import numpy as np
8+
from google.colab import drive
9+
10+
# Autenticação e montagem do Drive
11+
auth.authenticate_user()
12+
creds, _ = default()
13+
gc = gspread.authorize(creds)
14+
drive.mount('/content/drive')
15+
16+
# Configurações
17+
output_dir = '/content/drive/MyDrive/rankedpool/'
18+
spreadsheet_url = 'https://docs.google.com/spreadsheets/d/1GHn8ZSrAyi9d8kVgIfv2Yq-Cq_YD-NYaCDN15VPHO2g/edit?usp=sharing'
19+
20+
# Acesso à planilha
21+
spreadsheet = gc.open_by_url(spreadsheet_url)
22+
worksheet = spreadsheet.worksheet('Respostas')
23+
data = worksheet.get_all_values()
24+
df = pd.DataFrame(data[1:], columns=data[0])
25+
26+
# Processamento STV
27+
def processar_votos(df):
28+
candidatos = df.columns[2:]
29+
resultados = {candidato: 0 for candidato in candidatos}
30+
for _, row in df.iterrows():
31+
for idx, candidato in enumerate(candidatos):
32+
if row[candidato]:
33+
resultados[candidato] += len(candidatos) - idx
34+
return resultados
35+
36+
resultados = processar_votos(df)
37+
resultados_ordenados = pd.Series(resultados).sort_values(ascending=False)
38+
top_15_resultados = resultados_ordenados.head(15)
39+
print("Top 15 Resultados STV:", top_15_resultados)
40+
41+
# Função para plotar o gráfico de barras
42+
def plot_bar_chart(resultados, title, output_path):
43+
plt.figure(figsize=(14, 10))
44+
sns.set(style="whitegrid")
45+
palette = ['#D4AF37', '#C5B358', '#B8860B', '#228B22', '#32CD32', '#FFD700']
46+
ax = sns.barplot(x=resultados.index.str.replace('[', '').str.replace(']', ''), y=resultados.values, palette=palette, dodge=False)
47+
48+
ax.set_facecolor('black')
49+
plt.gcf().set_facecolor('black')
50+
ax.set_xlabel('Ativos', fontsize=16, color='white')
51+
ax.set_ylabel('Votos Totais', fontsize=16, color='white')
52+
ax.set_title(title, fontsize=18, color='white', pad=50) # Aumenta o espaçamento do título
53+
ax.tick_params(axis='x', colors='white', labelsize=14, rotation=45)
54+
ax.tick_params(axis='y', colors='white', labelsize=14)
55+
ax.grid(True, which='major', axis='y', color='#333333', linestyle='--', linewidth=1) # Cor da grade mais escura
56+
ax.set_yticks(np.arange(0, resultados.max() + 3, 3)) # Define o intervalo do eixo y para 3
57+
ax.spines['top'].set_visible(False) # Remove a borda superior
58+
ax.spines['right'].set_visible(False) # Remove a borda direita
59+
ax.spines['bottom'].set_visible(False) # Remove a borda inferior
60+
ax.spines['left'].set_visible(False) # Remove a borda esquerda
61+
plt.tight_layout()
62+
plt.savefig(output_path)
63+
plt.show()
64+
65+
66+
# Função para plotar o gráfico de radar
67+
def plot_radar(resultados, title, output_path):
68+
labels = resultados.index.str.replace('[', '').str.replace(']', '')
69+
stats = list(resultados.values)
70+
num_vars = len(labels)
71+
angles = np.linspace(0, 2 * np.pi, num_vars, endpoint=False).tolist()
72+
stats = np.concatenate((stats, [stats[0]]))
73+
angles += angles[:1]
74+
75+
fig, ax = plt.subplots(figsize=(12, 12), subplot_kw=dict(polar=True))
76+
77+
fig.patch.set_facecolor('black')
78+
ax.set_facecolor('black')
79+
80+
ax.fill(angles, stats, color='#D4AF37', alpha=0.7)
81+
ax.plot(angles, stats, color='#32CD32', linewidth=3)
82+
83+
ax.set_xticks(angles[:-1])
84+
ax.set_xticklabels(labels, color='white', fontsize=16)
85+
ax.set_yticks(np.arange(0, max(stats) + 1, 1))
86+
ax.spines['polar'].set_visible(False) # Remove a linha da circunferência
87+
ax.grid(color='#444444', linestyle='--', linewidth=1) # Cor da grade mais escura
88+
plt.title(title, fontsize=18, color='white', pad=30) # Aumenta o espaçamento do título
89+
plt.savefig(output_path)
90+
plt.show()
91+
92+
93+
# Geração dos gráficos
94+
plot_bar_chart(top_15_resultados, "Barras dos 15 Melhores - Votação STV", f"{output_dir}barras.png")
95+
plot_radar(top_15_resultados, "Radar dos 15 Melhores - Votação STV", f"{output_dir}radar.png")

0 commit comments

Comments
 (0)