Overview of the sensitivity package ************************************** Purpose ======= It is common in financial modeling to conduct a sensitivity analysis on the model. This analysis runs the model changing the inputs values and collecting the outputs. Then the modeler can examine how the outputs change in response to the inputs changing. This library was created to ease this process, especially around visualization of the results. While it was developed for financial modeling, it can be used with any function to understand how changing the inputs of the function affect the outputs. What Does it Do? ================== The main logic of the ``SensitivityAnalyzer`` is replicating a nested loop over the input values. Let's look at the basic example of how to use ``SensitivityAnalyzer``:: from sensitivity import SensitivityAnalyzer def my_model(x_1, x_2): return x_1 ** x_2 sensitivity_dict = { 'x_1': [10, 20, 30], 'x_2': [1, 2, 3] } sa = SensitivityAnalyzer(sensitivity_dict, my_model) sa.df This is roughly equivalent to:: import pandas as pd def my_model(x_1, x_2): return x_1 ** x_2 results = [] for x_1 in [10, 20, 30]: for x_2 in [1, 2, 3]: res = my_model(x_1, x_2) results.append((x_1, x_2, res)) df = pd.DataFrame(results, columns=['x_1', 'x_2', 'Result']) The greater convenience comes with the built-in visualization:: plot = sa.plot() styled_df = sa.styled_dfs() Which handles generating hexbin plots and DataFrames with a background gradient to signify high or low values. What Happens with More Inputs? ================================ The hexbin plots and styled DataFrames can only display two inputs changing at once, but it is possible to run ``SensitivityAnalyzer`` with as many inputs as you want. To work with more than two inputs, ``SensitivityAnalyzer`` has two approaches: first, it displays as many hexbin plots or styled DataFrames as needed to have the pairwise combinations of the inputs. E.g. with inputs 1, 2, and 3, there would be three plots, one for 1 and 2, one for 2 and 3, and one for 1 and 3. But even this is not enough, because in that example, for each combination of 1 and 2, there will be multiple results, one for each value of input 3. So it is also necessary to aggregate the results to reach a single result for the combination of the two inputs. ``SensitivityAnalyzer`` by default will take the mean, but it exposes the ``agg_func`` argument which should accept a list of values and return a single value, so the user can pick any aggregation such as ``numpy``'s ``median`` or ``std`` function.