3 import statistics as stats
4 from typing import Iterable
7 from type.money import Money
8 from type.rate import Rate
11 import simulation_results
14 def summarize_results(
15 results: Iterable[simulation_results.SimulationResults]
21 buckets = histogram.SimpleHistogram.n_evenly_spaced_buckets(10000, 1000*1000*100, 6)
22 buckets.insert(0, (0, 9999))
23 hist = histogram.SimpleHistogram(buckets)
26 for result in results:
27 hist.add_item(float(result.final_networth.amount))
31 failure_years.append(result.end_year)
32 avg_failure_year += result.end_year
36 avg_failure_year /= num_failures
38 nw = [result.final_networth for result in results]
41 with simulation.ReportColorizer():
42 print('SIMULATION RESULTS:')
43 print(f' Number of trials: {len(nw)}')
44 print(f' Successes and Failures: {num_successes} successes, {num_failures} failures ({Rate(num_successes/num_total)})')
46 print(f' Average failure year: {avg_failure_year:4.0f}')
47 print(f' Stdev failure year: {stats.pstdev(failure_years):.1f} years')
48 print(f' Min ending networth: {nw[0]}')
49 print(f' p25 ending networth: {nw[len(nw)//4]}')
50 print(f' Mean ending networth: {Money(stats.mean([x.final_networth.amount for x in results]))}')
51 print(f' p50 ending networth: {nw[len(nw)//2]}')
52 print(f' p75 ending networth: {nw[len(nw)//4*3]}')
53 print(f' Max ending networth: {nw[-1]}')
55 print(f' Stdev ending networth: {Money(stats.pstdev([x.final_networth.amount for x in results]))}')
57 print(hist.__repr__(label_formatter='$%-9s'))