Updated.
[retire.git] / result_summarizer.py
1 #!/usr/bin/env python3
2
3 import statistics as stats
4 from typing import Iterable
5
6 import histogram
7 from type.money import Money
8 from type.rate import Rate
9
10 import simulation
11 import simulation_results
12
13
14 def summarize_results(
15         results: Iterable[simulation_results.SimulationResults]
16 ) -> None:
17     num_successes = 0
18     num_failures = 0
19     num_total = 0
20     avg_failure_year = 0
21     buckets = histogram.SimpleHistogram.n_evenly_spaced_buckets(10000, 1000*1000*100, 6)
22     buckets.insert(0, (0, 9999))
23     hist = histogram.SimpleHistogram(buckets)
24
25     failure_years = []
26     for result in results:
27         hist.add_item(float(result.final_networth.amount))
28         if result.success:
29             num_successes += 1
30         else:
31             failure_years.append(result.end_year)
32             avg_failure_year += result.end_year
33             num_failures += 1
34         num_total += 1
35     if num_failures > 0:
36         avg_failure_year /= num_failures
37
38     nw = [result.final_networth for result in results]
39
40     nw.sort()
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)})')
45         if num_failures > 0:
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]}')
54         print
55         print(f'    Stdev ending networth: {Money(stats.pstdev([x.final_networth.amount for x in results]))}')
56         print('')
57         print(hist.__repr__(label_formatter='$%-9s'))