import%20marimo%0A%0A__generated_with%20%3D%20%220.18.4%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20import%20pandas%20as%20pd%0A%20%20%20%20import%20seaborn%20as%20sns%0A%0A%20%20%20%20sns.set_style(%22whitegrid%22)%0A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20Utilities%20Interactive%20Demo%0A%0A%20%20%20%20Explore%20how%20%60sum_diagonals%60%20converts%20a%20bivariate%20PMF%20into%20goal%20difference%20probabilities.%0A%20%20%20%20Adjust%20the%20Poisson%20parameters%20to%20see%20how%20the%20distribution%20changes.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%20mo%2C%20pd%2C%20plt%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20lambda_home%20%3D%20mo.ui.number(start%3D0.5%2C%20stop%3D3.0%2C%20step%3D0.1%2C%20value%3D1.5%2C%20label%3D%22%CE%BB_home%22)%0A%20%20%20%20lambda_away%20%3D%20mo.ui.number(start%3D0.5%2C%20stop%3D3.0%2C%20step%3D0.1%2C%20value%3D1.2%2C%20label%3D%22%CE%BB_away%22)%0A%20%20%20%20grid_size%20%3D%20mo.ui.number(start%3D4%2C%20stop%3D10%2C%20step%3D1%2C%20value%3D6%2C%20label%3D%22Grid%20Size%22)%0A%0A%20%20%20%20mo.hstack(%5Blambda_home%2C%20lambda_away%2C%20grid_size%5D%2C%20justify%3D%22start%22)%0A%20%20%20%20return%20grid_size%2C%20lambda_away%2C%20lambda_home%0A%0A%0A%40app.cell%0Adef%20_(grid_size%2C%20lambda_away%2C%20lambda_home)%3A%0A%20%20%20%20import%20pyrf%20as%20rf%0A%0A%20%20%20%20grid%20%3D%20rf.GoalGrid(n%3Dgrid_size.value)%0A%20%20%20%20dist%20%3D%20rf.BivariatePoisson(lambda_home%3Dlambda_home.value%2C%20lambda_away%3Dlambda_away.value)%0A%20%20%20%20pmf%20%3D%20dist.pmf(grid)%0A%20%20%20%20return%20pmf%2C%20rf%0A%0A%0A%40app.cell%0Adef%20_(pmf%2C%20rf)%3A%0A%20%20%20%20goal_diff_probs%20%3D%20rf.sum_diagonals(pmf.to_numpy())%0A%20%20%20%20return%20(goal_diff_probs%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(goal_diff_probs%2C%20lambda_away%2C%20lambda_home%2C%20mo)%3A%0A%20%20%20%20home_win%20%3D%20goal_diff_probs%5Bgoal_diff_probs.index%20%3E%200%5D.sum()%0A%20%20%20%20draw%20%3D%20goal_diff_probs%5B0%5D%0A%20%20%20%20away_win%20%3D%20goal_diff_probs%5Bgoal_diff_probs.index%20%3C%200%5D.sum()%0A%0A%20%20%20%20mo.md(f%22%22%22%0A%20%20%20%20%23%23%20Results%0A%0A%20%20%20%20**Parameters**%3A%20%CE%BB_home%20%3D%20%7Blambda_home.value%3A.1f%7D%2C%20%CE%BB_away%20%3D%20%7Blambda_away.value%3A.1f%7D%0A%0A%20%20%20%20%7C%20Outcome%20%7C%20Probability%20%7C%0A%20%20%20%20%7C%3A-------%3A%7C%3A-----------%3A%7C%0A%20%20%20%20%7C%20Home%20wins%20%7C%20%7Bhome_win%3A.1%25%7D%20%7C%0A%20%20%20%20%7C%20Draw%20%7C%20%7Bdraw%3A.1%25%7D%20%7C%0A%20%20%20%20%7C%20Away%20wins%20%7C%20%7Baway_win%3A.1%25%7D%20%7C%0A%20%20%20%20%7C%20**Total**%20%7C%20%7Bhome_win%20%2B%20draw%20%2B%20away_win%3A.1%25%7D%20%7C%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(goal_diff_probs%2C%20lambda_away%2C%20lambda_home%2C%20pd%2C%20plt)%3A%0A%20%20%20%20fig%2C%20ax%20%3D%20plt.subplots(figsize%3D(10%2C%204))%0A%0A%20%20%20%20df%20%3D%20pd.DataFrame(%7B%22probability%22%3A%20goal_diff_probs%7D)%0A%20%20%20%20df.plot.bar(ax%3Dax%2C%20legend%3DFalse%2C%20color%3D%22steelblue%22%2C%20alpha%3D0.7)%0A%0A%20%20%20%20ax.set_xlabel(%22Goal%20Difference%20(Home%20-%20Away)%22)%0A%20%20%20%20ax.set_ylabel(%22Probability%22)%0A%20%20%20%20ax.set_title(f%22Goal%20Difference%20Distribution%20(%CE%BB_home%3D%7Blambda_home.value%3A.1f%7D%2C%20%CE%BB_away%3D%7Blambda_away.value%3A.1f%7D)%22)%0A%20%20%20%20ax.axvline(x%3Dlen(goal_diff_probs)%20%2F%2F%202%2C%20color%3D%22red%22%2C%20linestyle%3D%22--%22%2C%20alpha%3D0.5%2C%20label%3D%22Draw%22)%0A%0A%20%20%20%20plt.tight_layout()%0A%20%20%20%20fig%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
8a787210a3178ef55b27f1ef46048836