diff --git a/TPC1/main.py b/TPC1/main.py index a5eb297..0267ccc 100644 --- a/TPC1/main.py +++ b/TPC1/main.py @@ -14,6 +14,8 @@ from dataclasses import dataclass from sys import argv +from typing import Dict +import matplotlib.pyplot as plt @dataclass class Person: @@ -24,9 +26,63 @@ class Person: batimento: int temDoenca: bool -people = [] +@dataclass +class People: + value: list[Person] -def read(path): +@dataclass +class Distribution: + count: int + total: int + + def add_count(self,value:int): + self.count += value + self.total += 1 + + def get_percentage(self) -> float: + return self.count/self.total + +@dataclass +class DistributionTracker: + distributions: Dict + + def add_value(self, key, value: int): + if key not in self.distributions: + self.distributions[key] = Distribution(count=value, total=1) + else: + self.distributions[key].add_count(value) + + def get_percentages(self) -> Dict[str,float]: + percentages = {} + for key,val in self.distributions.items(): + percentages[key] = val.get_percentage() + + return percentages + + def print_distribution_tracker(self): + # Print table header + header = f"{'Key':<20} {'Count':<10} {'Total':<10} {'Percentage':<10}" + print(header) + print("-" * len(header)) + + # Print table rows + for key, distribution in self.distributions.items(): + if isinstance(key, tuple): + key_str = f"{key[0]}-{key[1]}" + else: + key_str = str(key) + count = distribution.count + total = distribution.total + percentage = distribution.get_percentage() * 100 + + print(f"{key_str:<20} {count:<10} {total:<10} {percentage:.2f} %") + + + def plot_distribution(self): + #TODO + return 0 + +def read(path:str,people:People): file = open(path, 'r') lines = file.readlines() @@ -40,8 +96,64 @@ def read(path): batimento = int(field_list[4]) temDoenca = bool(int(field_list[5])) - people.append(Person(idade,sexo,tensao,colesterol,batimento,temDoenca)) + people.value.append(Person(idade,sexo,tensao,colesterol,batimento,temDoenca)) + +def distribution_doenca_sexo(people,doenca_sexo:DistributionTracker): + for person in people.value: + if person.temDoenca: + doenca_sexo.add_value(person.sexo,1) + else: + doenca_sexo.add_value(person.sexo,0) + +def distribution_doenca_escaloes_etarios(people,doenca_idade:DistributionTracker): + #Considere os seguintes escalões: [30-34], [35-39], [40-44], ... + interval_size = 5 + for person in people.value: + index = person.idade // interval_size + start = index * interval_size + end = start + interval_size - 1 + + key = (start,end) + if person.temDoenca: + doenca_idade.add_value(key,1) + else: + doenca_idade.add_value(key,0) + +def distribution_doenca_colesterol(people,doenca_colesterol:DistributionTracker): + + interval_size = 10 + for person in people.value: + index = person.colesterol // interval_size + start = index * interval_size + end = start + interval_size - 1 + + key = f"{start}-{end}" + if person.temDoenca: + doenca_colesterol.add_value(key,1) + else: + doenca_colesterol.add_value(key,0) -read(argv[1]) -print(people) + +def main(): + people = People([]) + + read(argv[1],people) + + doenca_sexo = DistributionTracker({}) + doenca_idade = DistributionTracker({}) + doenca_colesterol = DistributionTracker({}) + + distribution_doenca_sexo(people,doenca_sexo) + distribution_doenca_escaloes_etarios(people,doenca_idade) + distribution_doenca_colesterol(people,doenca_colesterol) + + doenca_sexo.print_distribution_tracker() + print("\n") + doenca_idade.print_distribution_tracker() + print("\n") + doenca_colesterol.print_distribution_tracker() + print("\n") + +if __name__ == "__main__": + main()