Added all asked distributions and respective class. Missing only matplotlib
This commit is contained in:
parent
577682f350
commit
2e9df8887e
1 changed files with 117 additions and 5 deletions
122
TPC1/main.py
122
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()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue