Repository navigation
Expand file tree
/
Copy pathrecommender.py
More file actions
58 lines (44 loc) · 2.04 KB
/
Copy pathrecommender.py
File metadata and controls
58 lines (44 loc) · 2.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import pandas as pd
def calcular_pontuacao(animal, filtros, pesos):
pontuacao = 0
# Idade: pontua totalmente se estiver dentro do intervalo, caso contrário reduz pela diferença
idade_animal = float(animal['idade']) if pd.notna(animal['idade']) else None
if idade_animal is not None:
max_idade = len(filtros['idade']) - 1
if filtros['idade'][0] <= idade_animal <= filtros['idade'][max_idade]: # Dentro do intervalo
pontuacao += pesos["idade"]
else:
# Penalidade: quanto mais longe do intervalo, menor a pontuação
dist_min = abs(idade_animal - filtros['idade'][0])
dist_max = abs(idade_animal - filtros['idade'][max_idade])
penalidade = min(dist_min, dist_max) / 12
pontuacao += pesos["idade"] * penalidade
# Pontuam se forem exatamente iguais
pontuacao += pesos["porte"] if animal['porte'] == filtros['porte'] else 0
pontuacao += pesos["vacinado"] if animal['vacinado'] == filtros['vacinado'] else 0
pontuacao += pesos["bem_com_outros"] if animal['bem_com_outros'] == filtros['bem_com_outros'] else 0
pontuacao += pesos["adocao_especial"] if animal['adocao_especial'] == filtros['adocao_especial'] else 0
# Energia: pontua mais se estiver próxima
if pd.notna(animal['energia']):
energia_diff = abs(animal['energia'] - filtros['energia'])
pontuacao += pesos["energia"] * max(0, 1 - energia_diff)
return pontuacao
def define_pesos():
pesos = {
"idade": 1.2,
"porte": 1.8,
"vacinado": 0.7,
"bem_com_outros": 1.5,
"adocao_especial": 2.0,
"energia": 1.6
}
return pesos
def get_nota_maxima():
pesos = define_pesos()
return sum(pesos.values())
def recommender(df, filtros_usuario):
# Pesos ajustáveis para cada critério
pesos = define_pesos()
df['pontuacao'] = df.apply(lambda x: calcular_pontuacao(x, filtros_usuario, pesos), axis=1)
df = df.sort_values(by='pontuacao', ascending=False)
return df