Added all asked distributions and respective class. Missing only matplotlib

This commit is contained in:
Afonso Franco 2023-02-20 11:30:15 +00:00
parent 577682f350
commit 2e9df8887e
Signed by: afonso
GPG key ID: C459E0BB3DCEE899

View file

@ -14,6 +14,8 @@
from dataclasses import dataclass from dataclasses import dataclass
from sys import argv from sys import argv
from typing import Dict
import matplotlib.pyplot as plt
@dataclass @dataclass
class Person: class Person:
@ -24,9 +26,63 @@ class Person:
batimento: int batimento: int
temDoenca: bool 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') file = open(path, 'r')
lines = file.readlines() lines = file.readlines()
@ -40,8 +96,64 @@ def read(path):
batimento = int(field_list[4]) batimento = int(field_list[4])
temDoenca = bool(int(field_list[5])) 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()