-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathAnLATAM.py
96 lines (72 loc) · 2.87 KB
/
AnLATAM.py
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
from AnaliseDados import Analisar
import json
siglas = {
"SAO": 32.28,
"BEL": 3.94,
"RBR": 0.51,
"SLZ": 1.62,
"FOR": 3.23,
"REC": 3.92,
"AJU": 1.03,
"SSA": 5.99,
"BHZ": 9.69,
"VIX": 1.86,
"RIO": 9.43,
"CWB": 8.09,
"POA": 8.61,
"GYN": 4.17,
"BSB": 4.06
}
class AnLATAM(Analisar):
def __init__(self, filename):
with open(filename) as json_file:
self.data = json.load(json_file)
def getOrigin(self, index):
frame = self.data[index]
return frame['origin']
def getDestination(self, index):
frame = self.data[index]
return frame['destination']
def getValues(self, index):
frame = self.data[index]
return frame['value']
# Retorna o menor indíce em duas listas
def minIndex(x, y):
return min(len(x), len(y))
# Como houveram dados discrepantes, optei por fazer o cálculo da variação percentual diária baseada no tamanho dos dados coletados que estejam presentes nas duas amostras. Uma possível melhoria seria assegurar que os horários também sejam iguais. No entanto, não sei como lidar com os dados que faltaram por motivos adversos(EX: viagem agora indisponível, horários diferentes, etc)
# Realiza a variação percentual diária de dois dict['value'] e retorna 0 caso não hajam pelo menos um dado em ambos.
def vpd(x, y):
var = []
total = minIndex(x, y)
if total == 0:
return 0
soma = 0
for index in range(0, total):
xp = float(x[index][1].replace(",", "."))
yp = float(y[index][1].replace(",", "."))
soma += ((xp - yp)/yp)*100
return soma/total
# Retorna a soma dos pesos para o cálculo da média ponderada
def getWeightSum():
wSum = 0
for key in siglas:
wSum += siglas[key]
return wSum
# Criei um dicionário do tipo <destino, vpd>.
def main():
# uma possível melhoria seria aceitar um número arbitrário de arquivos para agregar na qualidade da análise se a extração fosse feita em vários dias ou até mesmo em várias horas distintas de vários dias.
x = AnLATAM("LATAM22082023.json")
y = AnLATAM("LATAM21082023.json")
variacao = {}
mp = 0
# itero por todos os dados obtidos em origem-destino e calculo a variação percentual diária (vpd)
for index in range(0, len(x.data)):
key = x.getOrigin(index) + x.getDestination(index)
if variacao.get(key) == None:
variacao[key] = 0
variacao[key] += vpd(x.getValues(index), y.getValues(index))
# após armazenar as vpd's em dicionários do tipo <origemdestino, valor>, para o cálculo da média ponderada eu considero apenas os destinos, que podem ser obtidos por key[3:6]. O dicionário de siglas tem como valor de uma chave o peso da ponderação.
for key in variacao.keys():
mp += variacao[key] * siglas[key[3:6]]
print(mp/getWeightSum())
main()