#!/usr/bin/env python3 import statistics as stats from typing import Iterable import histogram from type.money import Money from type.rate import Rate import simulation import simulation_results def summarize_results( results: Iterable[simulation_results.SimulationResults] ) -> None: num_successes = 0 num_failures = 0 num_total = 0 avg_failure_year = 0 buckets = histogram.SimpleHistogram.n_evenly_spaced_buckets(10000, 1000*1000*100, 6) buckets.insert(0, (0, 9999)) hist = histogram.SimpleHistogram(buckets) failure_years = [] for result in results: hist.add_item(float(result.final_networth.amount)) if result.success: num_successes += 1 else: failure_years.append(result.end_year) avg_failure_year += result.end_year num_failures += 1 num_total += 1 if num_failures > 0: avg_failure_year /= num_failures nw = [result.final_networth for result in results] nw.sort() with simulation.ReportColorizer(): print('SIMULATION RESULTS:') print(f' Number of trials: {len(nw)}') print(f' Successes and Failures: {num_successes} successes, {num_failures} failures ({Rate(num_successes/num_total)})') if num_failures > 0: print(f' Average failure year: {avg_failure_year:4.0f}') print(f' Stdev failure year: {stats.pstdev(failure_years):.1f} years') print(f' Min ending networth: {nw[0]}') print(f' p25 ending networth: {nw[len(nw)//4]}') print(f' Mean ending networth: {Money(stats.mean([x.final_networth.amount for x in results]))}') print(f' p50 ending networth: {nw[len(nw)//2]}') print(f' p75 ending networth: {nw[len(nw)//4*3]}') print(f' Max ending networth: {nw[-1]}') print print(f' Stdev ending networth: {Money(stats.pstdev([x.final_networth.amount for x in results]))}') print('') print(hist.__repr__(label_formatter='$%-9s'))