Source code for qualia_core.preprocessing.PrintHARDataModelSummary

from .Preprocessing import Preprocessing

from qualia_core.utils.logger import TextLogger

[docs] class PrintHARDataModelSummary(Preprocessing): log = TextLogger(name=__name__) def __print_subjects_summary(self, name, s, activitylabels): msg = f'Set: {name}\n' msg += ' ' for act in activitylabels: msg += f' {act.name}' msg += ' TOTAL\n' ss = sorted(s, key=lambda s: int(s.name[1:])) # Sort by subject number (without T prefix) total_a_count = [0] * len(activitylabels) for subject in ss: msg += ' ' * (5 - len(subject.name)) msg += f'{subject.name}: ' a_count = [0] * len(activitylabels) for a in subject.activities: a_count[activitylabels.index(a.kind)] += len(a.get_raw_array()) total_a_count[activitylabels.index(a.kind)] += len(a.get_raw_array()) for a, c in enumerate(a_count): msg += ' ' * (len(activitylabels[a].name) - len(str(c)) + 1) msg += f'{c} ' total = sum(a_count) msg += ' ' * (len('TOTAL') - len(str(total)) + 1) msg += f'{total}\n' # Total of activities across all subjects msg += 'Total: ' for a, c in enumerate(total_a_count): msg += ' ' * (len(activitylabels[a].name) - len(str(c)) + 1) msg += f'{c} ' total = sum(total_a_count) msg += ' ' * (len('TOTAL') - len(str(total)) + 1) msg += f'{total}\n' print(msg, end='') self.log(msg) return total_a_count def __print_set_summary(self, sets_total, activitylabels): msg = ' ' for act in activitylabels: msg += f' {act.name}' msg += ' TOTAL\n' global_a_total = [sum([s[i] for s in sets_total.values()]) for i, _ in enumerate(activitylabels)] global_total = sum(global_a_total) sets_percentage = {name: [s[i] / global_a_total[i] for i, _ in enumerate(activitylabels)] for name, s in sets_total.items()} for (name, s), stot in zip(sets_percentage.items(), sets_total.values()): msg += ' ' * (5 - len(name)) msg += f'{name}: ' for a, c in enumerate(s): c = int(c * 100) msg += ' ' * (len(activitylabels[a].name) - len(str(c))) msg += f'{c}% ' total = int(sum(stot) * 100 / global_total) msg += ' ' * (len('TOTAL') - len(str(total))) msg += f'{total}%\n' print(msg, end='') self.log(msg) def __call__(self, datamodel): # First generate the class numbers according to the activities present in the dataset # Duplicated from DatamodelConverter since they are not generated yet activitylabels = set() for sname, s in datamodel.sets: for subject in s: for activity in subject.activities: activitylabels.add(activity.kind) activitylabels = sorted(activitylabels) sets_total = {} for name, s in datamodel: sets_total[name] = self.__print_subjects_summary(name, s, activitylabels) self.__print_set_summary(sets_total, activitylabels) return datamodel