google-meridian 1.3.2__py3-none-any.whl → 1.4.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. {google_meridian-1.3.2.dist-info → google_meridian-1.4.0.dist-info}/METADATA +8 -4
  2. {google_meridian-1.3.2.dist-info → google_meridian-1.4.0.dist-info}/RECORD +49 -17
  3. {google_meridian-1.3.2.dist-info → google_meridian-1.4.0.dist-info}/top_level.txt +1 -0
  4. meridian/analysis/summarizer.py +7 -2
  5. meridian/analysis/test_utils.py +934 -485
  6. meridian/analysis/visualizer.py +10 -6
  7. meridian/constants.py +1 -0
  8. meridian/data/test_utils.py +82 -10
  9. meridian/model/__init__.py +2 -0
  10. meridian/model/context.py +925 -0
  11. meridian/model/eda/constants.py +1 -0
  12. meridian/model/equations.py +418 -0
  13. meridian/model/knots.py +58 -47
  14. meridian/model/model.py +93 -792
  15. meridian/version.py +1 -1
  16. scenarioplanner/__init__.py +42 -0
  17. scenarioplanner/converters/__init__.py +25 -0
  18. scenarioplanner/converters/dataframe/__init__.py +28 -0
  19. scenarioplanner/converters/dataframe/budget_opt_converters.py +383 -0
  20. scenarioplanner/converters/dataframe/common.py +71 -0
  21. scenarioplanner/converters/dataframe/constants.py +137 -0
  22. scenarioplanner/converters/dataframe/converter.py +42 -0
  23. scenarioplanner/converters/dataframe/dataframe_model_converter.py +70 -0
  24. scenarioplanner/converters/dataframe/marketing_analyses_converters.py +543 -0
  25. scenarioplanner/converters/dataframe/rf_opt_converters.py +314 -0
  26. scenarioplanner/converters/mmm.py +743 -0
  27. scenarioplanner/converters/mmm_converter.py +58 -0
  28. scenarioplanner/converters/sheets.py +156 -0
  29. scenarioplanner/converters/test_data.py +714 -0
  30. scenarioplanner/linkingapi/__init__.py +47 -0
  31. scenarioplanner/linkingapi/constants.py +27 -0
  32. scenarioplanner/linkingapi/url_generator.py +131 -0
  33. scenarioplanner/mmm_ui_proto_generator.py +354 -0
  34. schema/__init__.py +5 -2
  35. schema/mmm_proto_generator.py +71 -0
  36. schema/model_consumer.py +133 -0
  37. schema/processors/__init__.py +77 -0
  38. schema/processors/budget_optimization_processor.py +832 -0
  39. schema/processors/common.py +64 -0
  40. schema/processors/marketing_processor.py +1136 -0
  41. schema/processors/model_fit_processor.py +367 -0
  42. schema/processors/model_kernel_processor.py +117 -0
  43. schema/processors/model_processor.py +412 -0
  44. schema/processors/reach_frequency_optimization_processor.py +584 -0
  45. schema/test_data.py +380 -0
  46. schema/utils/__init__.py +1 -0
  47. schema/utils/date_range_bucketing.py +117 -0
  48. {google_meridian-1.3.2.dist-info → google_meridian-1.4.0.dist-info}/WHEEL +0 -0
  49. {google_meridian-1.3.2.dist-info → google_meridian-1.4.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: google-meridian
3
- Version: 1.3.2
3
+ Version: 1.4.0
4
4
  Summary: Google's open source mixed marketing model library, helps you understand your return on investment and direct your ad spend with confidence.
5
5
  Author-email: The Meridian Authors <no-reply@google.com>
6
6
  Project-URL: homepage, https://github.com/google/meridian
@@ -22,7 +22,6 @@ Requires-Dist: joblib
22
22
  Requires-Dist: natsort<8,>=7.1.1
23
23
  Requires-Dist: numpy<3,>=2.0.2
24
24
  Requires-Dist: pandas<3,>=2.2.2
25
- Requires-Dist: patsy<1,>=0.5.3
26
25
  Requires-Dist: scipy<2,>=1.13.1
27
26
  Requires-Dist: statsmodels>=0.14.5
28
27
  Requires-Dist: tensorflow<2.21,>=2.18
@@ -46,8 +45,13 @@ Requires-Dist: jax==0.5.3; extra == "jax"
46
45
  Requires-Dist: jaxlib==0.5.3; extra == "jax"
47
46
  Requires-Dist: tensorflow-probability[substrates-jax]==0.25.0; extra == "jax"
48
47
  Provides-Extra: schema
49
- Requires-Dist: mmm-proto-schema; extra == "schema"
48
+ Requires-Dist: mmm-proto-schema>=1.1.0; extra == "schema"
50
49
  Requires-Dist: semver; extra == "schema"
50
+ Provides-Extra: scenarioplanner
51
+ Requires-Dist: google-api-python-client; extra == "scenarioplanner"
52
+ Requires-Dist: google-auth; extra == "scenarioplanner"
53
+ Requires-Dist: mmm-proto-schema>=1.1.0; extra == "scenarioplanner"
54
+ Requires-Dist: semver; extra == "scenarioplanner"
51
55
  Dynamic: license-file
52
56
 
53
57
  # About Meridian
@@ -203,7 +207,7 @@ To cite this repository:
203
207
  author = {Google Meridian Marketing Mix Modeling Team},
204
208
  title = {Meridian: Marketing Mix Modeling},
205
209
  url = {https://github.com/google/meridian},
206
- version = {1.3.2},
210
+ version = {1.4.0},
207
211
  year = {2025},
208
212
  }
209
213
  ```
@@ -1,14 +1,14 @@
1
- google_meridian-1.3.2.dist-info/licenses/LICENSE,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
1
+ google_meridian-1.4.0.dist-info/licenses/LICENSE,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
2
2
  meridian/__init__.py,sha256=0fOT5oNZF7-pbiWWGUefV-ysafttieG079m1ijMFQO8,861
3
- meridian/constants.py,sha256=idvYuDmoULgHvVG5kGJb2j2VAdBF6BeOwDfKLP14-Fo,20322
4
- meridian/version.py,sha256=eMNUh0AywCHr0ZyrDyJchcddVsAyWWKKHuXI0VxLScE,644
3
+ meridian/constants.py,sha256=JEVut9ZvnHVtdCSU7KGeR1TpR_vFXAOlE9d7leVXeHk,20348
4
+ meridian/version.py,sha256=5Udd9dsBQAuAbv6cGREFYqdM8M7pK4WJU3PPEHNUgqo,644
5
5
  meridian/analysis/__init__.py,sha256=AM7xpqoeC-mmY4tPIyHisjQ2MICI7v3jSri--DhDqXA,874
6
6
  meridian/analysis/analyzer.py,sha256=qGKYoEpWC6pDf2sDrwLhpa2putDnpUzbBpuNqL1lGi4,219910
7
7
  meridian/analysis/optimizer.py,sha256=6OqJg8T09g4GqJc6_DnYDJsBAlY4ToUb3MRtS0EH4Nc,126316
8
- meridian/analysis/summarizer.py,sha256=pah0osYYJFQTf2Fn7-nnvxlBupf9cfaKW87bcqRO1A4,19036
8
+ meridian/analysis/summarizer.py,sha256=-yemGGctDs23FnhaLWAwfsQw2DqoyB3eljqt0Q8DyEw,19263
9
9
  meridian/analysis/summary_text.py,sha256=I_smDkZJYp2j77ea-9AIbgeraDa7-qUYyb-IthP2qO4,12438
10
- meridian/analysis/test_utils.py,sha256=aZq88pxtpMHwhcpfYz8nHhR0Alhi_OvgS9qBR4LBgO0,78346
11
- meridian/analysis/visualizer.py,sha256=_z5vSnXyv3Zx4tmKLyevnMolzLzUzNFcNInOipEmMok,94092
10
+ meridian/analysis/test_utils.py,sha256=wSdFHzLbNLdv_InRreyKD_lC7Cvdv-upQOWf8dqCAPg,88045
11
+ meridian/analysis/visualizer.py,sha256=ljgN5ZCG_3aXq4Js0sE9sQd11TS1gi9KvPKMJ7_kW_A,94345
12
12
  meridian/analysis/review/__init__.py,sha256=cF24EbhiVSs-tvtRf59uVin39tu6aCTTCaeEdv6ISZ8,804
13
13
  meridian/analysis/review/checks.py,sha256=QEUVwC8L9Pif3y0B_OVAUpZeN6EnFGKH2oXA_dsdgbc,26893
14
14
  meridian/analysis/review/configs.py,sha256=5JJ8v6n22GNBmE78xNX6jwdjkZz2qar4Q9YTcVqzcoI,3653
@@ -25,15 +25,17 @@ meridian/data/input_data.py,sha256=Qlxm4El6h1SRPsWDqZoKkOcMtrjiRWr3z8sU2mtghRA,4
25
25
  meridian/data/input_data_builder.py,sha256=tbZjVXPDfmtndVyJA0fmzGzZwZb0RCEjXOTXb-ga8Nc,25648
26
26
  meridian/data/load.py,sha256=ETX8Z62Gk6JcxFxvyB4XQhpNcRSqBRIO4_sTAN58mCY,40172
27
27
  meridian/data/nd_array_input_data_builder.py,sha256=lfpmnENGuSGKyUd7bDGAwoLqHqteOKmHdKl0VI2wCQA,16341
28
- meridian/data/test_utils.py,sha256=mw-QPTP15oXf32I7cxMe8iSFBLB3seqEiITZMTz_Eg8,59838
28
+ meridian/data/test_utils.py,sha256=4BEHM0V78AkbrUIYWJLzalUgC-zkc0VeNiXrqzr2iXw,62435
29
29
  meridian/data/time_coordinates.py,sha256=C5A5fscSLjPH6G9YT8OspgIlCrkMY7y8dMFEt3tNSnE,9874
30
30
  meridian/mlflow/__init__.py,sha256=elwXUqPQYi7VF9PYjelU1tydfcUrmtuoq6eJCOnV9bk,693
31
31
  meridian/mlflow/autolog.py,sha256=SZsrynLjozcyrAFCNWiqchSa2yOszVnwFBGz23BmWUU,6379
32
- meridian/model/__init__.py,sha256=mhF5VkRxvwamRa_0AihgbFuXLMueRCK-Je_ZZvU5IFw,1013
32
+ meridian/model/__init__.py,sha256=NCmuqkzIsGTy0xKgr9XFmjq5JV1Uzalj7PlcvWL9Bvw,1085
33
33
  meridian/model/adstock_hill.py,sha256=HoRKjyL03pCTBz6Utof9wEvlQCFM43BvrEW_oupj7NU,17688
34
- meridian/model/knots.py,sha256=B78oTQ97Zd0aON4CnhMPqJZ4eamy6d-esKMWqoDf9uQ,27273
34
+ meridian/model/context.py,sha256=W_j3LnmpAx7Cs80MeqZGe8XKpoqwy6PfGIe8U7OUuTY,34622
35
+ meridian/model/equations.py,sha256=bQnFU5YdskwxBVJlLO4AX3zV8VXerb7lNhMedK0Cwcc,17174
36
+ meridian/model/knots.py,sha256=XTii81yrX1abu0llLvrJquRadEqFaUDIlYpvR5OBP1o,27661
35
37
  meridian/model/media.py,sha256=skjy4Vd8LfDQWlqR_2lJ1qbG9UcS1dow5W45BAu4qk8,14599
36
- meridian/model/model.py,sha256=jMtfl7woWtJ8M8AX42QeZ5hUS8hlhPdZ-9OU8KahjKA,68984
38
+ meridian/model/model.py,sha256=9-cHk9kno3G79t9z0rstcAk_QalKWr6QA75OtJqjpSY,41216
37
39
  meridian/model/model_test_data.py,sha256=XGBz8RGdCsjAUOmgxX3CfWSj-_hdq2Lc8saFCqmImwM,23901
38
40
  meridian/model/posterior_sampler.py,sha256=f3MayglIgBeBjWeXJU_RgT9cCugcjJ3aEjHqaWPsTbg,26806
39
41
  meridian/model/prior_distribution.py,sha256=ZArW4uXIPPQL6hRWiGZUzcHktbkjE_vOklvlbp9LR64,57662
@@ -41,7 +43,7 @@ meridian/model/prior_sampler.py,sha256=iLvCefhA4WY0ENcnLK9471WUZPPyzQ1je58MRjxKv
41
43
  meridian/model/spec.py,sha256=VlK6WJiPo2lzOF0O2judtJ6O3uEw7wYL5AT8bioq4gE,19188
42
44
  meridian/model/transformers.py,sha256=HxlVJitxP-wu-NOHU0tArFUZ4NAO3c7adAYj4Zvqnvo,8363
43
45
  meridian/model/eda/__init__.py,sha256=bMj9kd2LWU_LQZAjQv54FFggzdv4CKRYblvc-0cHXc4,768
44
- meridian/model/eda/constants.py,sha256=Kt8x8hvC2WkeEtW0Wmid8GkqZbh_p6NdiZ_A5V3qzwM,1031
46
+ meridian/model/eda/constants.py,sha256=AMq2G-8y7OPLfMismDDIDKazyuG8Bd3W31NpwQ9oIXM,1047
45
47
  meridian/model/eda/eda_engine.py,sha256=AxvKxdH8Q_TWlGZ58bWcfGMSgxkHZ2wrHloPuzS5C4Y,73324
46
48
  meridian/model/eda/eda_outcome.py,sha256=cR9M49e6bDrBNxHOThW3aQlX5gZCOENC7GBljKQx7OY,6475
47
49
  meridian/model/eda/eda_spec.py,sha256=diieYyZH0ee3ZLy0rGFMcWrrgiUrz2HctMwOrmtJR6w,2871
@@ -56,7 +58,36 @@ meridian/templates/style.css,sha256=O7YCKVqXgK4Ms3nnGmCVW4hILn4GCBRe4e15XJaP4ww,
56
58
  meridian/templates/style.scss,sha256=he5jXpGatNfI6vtNbqdENapLiwIlXjqIBkKwxNVEvyw,5076
57
59
  meridian/templates/summary.html.jinja,sha256=kR4nQc-oGBwXN6buKcf_wPaoWASomR4fT4gJ1iD9hYw,1775
58
60
  meridian/templates/table.html.jinja,sha256=ibgnjdKCjS2qbq61lxqwtlb7JigDrc2m42RDdQvQnKQ,1176
59
- schema/__init__.py,sha256=grEfsjrcPRzhd89ZXLggnBnrryl97bsayKWP1ue1ffE,1206
61
+ scenarioplanner/__init__.py,sha256=n9eeQGQ0Et7YZ-UZbzBjN1AX5tcOiCHBQnU2qIj0FBk,1782
62
+ scenarioplanner/mmm_ui_proto_generator.py,sha256=4ajGl5bGJiPLid7obnoqP8PI38zJ3vaZo87xeHz7B0A,12657
63
+ scenarioplanner/converters/__init__.py,sha256=I3NNLxDcp137RmZsBp_A1jRrwpH9epzBdXzETgsnUrw,1046
64
+ scenarioplanner/converters/mmm.py,sha256=jEwLwaCzIK7XqpNsGFKeAOZ39wbK5AxQ-iI9SqDwenU,25079
65
+ scenarioplanner/converters/mmm_converter.py,sha256=3r2ARDnxEjd56raF6OkrpQhfvCGbSWcNSt19mH3Y7oc,1732
66
+ scenarioplanner/converters/sheets.py,sha256=KoJim_CKu9sEOwrVg4JlJupykbX3CwTNbblKUJwJxmo,4389
67
+ scenarioplanner/converters/test_data.py,sha256=FuNyXbsOkv10AVJ6fEfmoZ-MUQNhn7hdSKV1SjCSNA0,22607
68
+ scenarioplanner/converters/dataframe/__init__.py,sha256=nmcboP8Sgx9aFoG1sGmhJSh3QiuQjmfzoPNCebLbwQA,1313
69
+ scenarioplanner/converters/dataframe/budget_opt_converters.py,sha256=k0BK4aYQbdUTOh0sHZPP65wCR1vqXT4BosjjS5CP7pI,13183
70
+ scenarioplanner/converters/dataframe/common.py,sha256=UsN_HJY0HYdf5iXmzXVT-rm9Vqlk6t2u2Eb7VjQmF9M,2241
71
+ scenarioplanner/converters/dataframe/constants.py,sha256=6vOOJHntje9gdU7dUZUsEDo-ILXPitCOZqOVpEHH3K8,5509
72
+ scenarioplanner/converters/dataframe/converter.py,sha256=MY5Ihlvg5EUOxhf0zzsVubvATZc8I0ImJ6BP3gjW2Ic,1143
73
+ scenarioplanner/converters/dataframe/dataframe_model_converter.py,sha256=GZLEzKAOol93R_3YntDUCvMmB4ETutYIA6CwEbfk7fA,2472
74
+ scenarioplanner/converters/dataframe/marketing_analyses_converters.py,sha256=yoPvfEalBJUPhWaK7Gbo6OD3q8Z6SI_dUUsEDYFtVEQ,18307
75
+ scenarioplanner/converters/dataframe/rf_opt_converters.py,sha256=WFygfS4aezXRZFKCJajveWih9N1KWargjSDtMqS9vlo,10993
76
+ scenarioplanner/linkingapi/__init__.py,sha256=_GTAn4cJ-jpjEYoCozj240u8M3_ke-T0fAcCacMswVU,1540
77
+ scenarioplanner/linkingapi/constants.py,sha256=e6cNB8OFg74axIcx68r0YsS-alLTDC4pjIGv4CH1N0A,1038
78
+ scenarioplanner/linkingapi/url_generator.py,sha256=kSYHYl1iouLkijoOo1_yRmOldA5GySvg3_9qVd1sBSk,4515
79
+ schema/__init__.py,sha256=cw6HwitjOt8-uAaHHuymCozWSPL18HYlXOHnzjG9iLo,1224
80
+ schema/mmm_proto_generator.py,sha256=3GwsjDwGRmtgyskDXHlzaZ02TIqEtOvttE6Vurf_Fxo,2373
81
+ schema/model_consumer.py,sha256=jYcnnDlhycfBcLKmtjjDVURaZDZXc-TfdD8fMAIm9Kc,4444
82
+ schema/test_data.py,sha256=e1dNCGkbcKg4e0RfiFKxX6bYahhcB7rgB0vmzOYB470,11035
83
+ schema/processors/__init__.py,sha256=Xcw9kTTw5JFtegu3NgKo9CM5nup2PP8vgtIH031ITkI,3704
84
+ schema/processors/budget_optimization_processor.py,sha256=9dAir67Kg6rG3CqCfjWU7VU2HA0DLgjw6PfaPG1HCeg,30600
85
+ schema/processors/common.py,sha256=QpNxYThOvJOiMvt-ilKM5rAiJe7UQCaX6wD6K3e7tJk,1952
86
+ schema/processors/marketing_processor.py,sha256=5UvgTku8vfoePWXb2bRowc34SgqRZnQcxwfEehgVx_8,43332
87
+ schema/processors/model_fit_processor.py,sha256=GkTJWOw9mHoB5vH3ZDkI2K7_9c_-51Lpjwavrer_G08,12597
88
+ schema/processors/model_kernel_processor.py,sha256=gl7BsR7EYnJl88Yxg4qxJvVq1vmAKkjD8NezSbWYLEc,3686
89
+ schema/processors/model_processor.py,sha256=PH4MNFjnjJY4P1ncJbWvFiuItHB0Zp7J2UgwqnnI5h8,14199
90
+ schema/processors/reach_frequency_optimization_processor.py,sha256=uiftX23EXRtMJeZCPu98D8NFFrWT_cLz5eE3dqRLnuw,20551
60
91
  schema/serde/__init__.py,sha256=xyydIcWB5IUpcn3wu1m9HL1fK4gMWURbwTyRsQtolF0,975
61
92
  schema/serde/constants.py,sha256=aYtD_RuA0GCkpC4TIQq3VjMqEc837Wn-TlJNm-yn_4Y,1842
62
93
  schema/serde/distribution.py,sha256=jy3h6JD1TSs4gwociMis814sz_Fm2kFQ2UbkgjYJW9k,19347
@@ -68,9 +99,10 @@ schema/serde/marketing_data.py,sha256=yb-fRTe84Sjg7-v3wsvYRRXvrxLSFWSenO0_ikMvUp
68
99
  schema/serde/meridian_serde.py,sha256=ZG05JaBG4LW8mhl-Cunje9Q6xyR4tyNTtLYedzMBYjA,15985
69
100
  schema/serde/serde.py,sha256=8vUqhJxvZgX9UY3rXTyWJznRgapwDzzaHXDHwV_kKTA,1612
70
101
  schema/serde/test_data.py,sha256=7hfEWyvZ9WcAkVAOXt6elX8stJlsfhfd-ASlHo9SRb8,107342
71
- schema/utils/__init__.py,sha256=AkC4NMbmXC3PFBY9dFYxlf3qFsxt5OOBVdc9zmFXsC8,675
102
+ schema/utils/__init__.py,sha256=zrMCsxWQIWhsrdgcPSa6UxItIZPAPJK1bhnXhoK1keg,721
103
+ schema/utils/date_range_bucketing.py,sha256=14vcRGf3odWT9mBdCykRNmVCEiuUI_1SvVygNzvqBuM,3809
72
104
  schema/utils/time_record.py,sha256=-KzHFjvSBUUXsfESPAfcJP_VFxaFLqj90Ac0kgKWfpI,4624
73
- google_meridian-1.3.2.dist-info/METADATA,sha256=BHbc_4zpZ5EBv1urcvQR_brE9WEJaia4F1ZLYaA8sG0,9545
74
- google_meridian-1.3.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
75
- google_meridian-1.3.2.dist-info/top_level.txt,sha256=yWkWDLV_UUanhKmk_xNPiKNdPDl1oyU1sBYwEnhaSf4,16
76
- google_meridian-1.3.2.dist-info/RECORD,,
105
+ google_meridian-1.4.0.dist-info/METADATA,sha256=_PuASfumu3dyvOlvpXGu8MvVWlDpqyZ8ubaMtzLCcBU,9793
106
+ google_meridian-1.4.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
107
+ google_meridian-1.4.0.dist-info/top_level.txt,sha256=oAi0z-fUuo6p8SnJ0WrojGR2mKOWDz43yr6EjzaXqy8,32
108
+ google_meridian-1.4.0.dist-info/RECORD,,
@@ -1,2 +1,3 @@
1
1
  meridian
2
+ scenarioplanner
2
3
  schema
@@ -318,7 +318,7 @@ class Summarizer:
318
318
  chart_json=media_summary.plot_contribution_waterfall_chart().to_json(),
319
319
  )
320
320
  lead_channels = self._get_sorted_posterior_mean_metrics_df(
321
- media_summary, [c.INCREMENTAL_OUTCOME]
321
+ media_summary, [c.INCREMENTAL_OUTCOME], include_non_paid_channels=True
322
322
  )[c.CHANNEL][:2]
323
323
  formatted_channels = [channel.title() for channel in lead_channels]
324
324
 
@@ -358,9 +358,14 @@ class Summarizer:
358
358
  media_summary: visualizer.MediaSummary,
359
359
  metrics: Sequence[str],
360
360
  ascending: bool = False,
361
+ include_non_paid_channels: bool = False,
361
362
  ) -> pd.DataFrame:
363
+ if include_non_paid_channels:
364
+ summary_metrics = media_summary.get_all_summary_metrics()
365
+ else:
366
+ summary_metrics = media_summary.get_paid_summary_metrics()
362
367
  return (
363
- media_summary.get_paid_summary_metrics()[metrics]
368
+ summary_metrics[metrics]
364
369
  .sel(distribution=c.POSTERIOR, metric=c.MEAN)
365
370
  .drop_sel(channel=c.ALL_CHANNELS)
366
371
  .to_dataframe()