mergeron 2025.739425.0__tar.gz → 2025.739439.3__tar.gz
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.
Potentially problematic release.
This version of mergeron might be problematic. Click here for more details.
- {mergeron-2025.739425.0 → mergeron-2025.739439.3}/PKG-INFO +4 -4
- {mergeron-2025.739425.0 → mergeron-2025.739439.3}/pyproject.toml +9 -9
- {mergeron-2025.739425.0 → mergeron-2025.739439.3}/src/mergeron/__init__.py +1 -1
- {mergeron-2025.739425.0 → mergeron-2025.739439.3}/src/mergeron/core/guidelines_boundaries.py +5 -5
- {mergeron-2025.739425.0 → mergeron-2025.739439.3}/src/mergeron/core/guidelines_boundary_functions.py +4 -4
- {mergeron-2025.739425.0 → mergeron-2025.739439.3}/src/mergeron/core/guidelines_boundary_functions_extra.py +2 -2
- {mergeron-2025.739425.0 → mergeron-2025.739439.3}/src/mergeron/gen/__init__.py +9 -11
- {mergeron-2025.739425.0 → mergeron-2025.739439.3}/README.rst +0 -0
- {mergeron-2025.739425.0 → mergeron-2025.739439.3}/src/mergeron/core/__init__.py +0 -0
- {mergeron-2025.739425.0 → mergeron-2025.739439.3}/src/mergeron/core/empirical_margin_distribution.py +0 -0
- {mergeron-2025.739425.0 → mergeron-2025.739439.3}/src/mergeron/core/ftc_merger_investigations_data.py +0 -0
- {mergeron-2025.739425.0 → mergeron-2025.739439.3}/src/mergeron/core/pseudorandom_numbers.py +0 -0
- {mergeron-2025.739425.0 → mergeron-2025.739439.3}/src/mergeron/data/__init__.py +0 -0
- {mergeron-2025.739425.0 → mergeron-2025.739439.3}/src/mergeron/data/damodaran_margin_data_serialized.zip +0 -0
- {mergeron-2025.739425.0 → mergeron-2025.739439.3}/src/mergeron/data/ftc_merger_investigations_data.zip +0 -0
- {mergeron-2025.739425.0 → mergeron-2025.739439.3}/src/mergeron/gen/data_generation.py +0 -0
- {mergeron-2025.739425.0 → mergeron-2025.739439.3}/src/mergeron/gen/data_generation_functions.py +0 -0
- {mergeron-2025.739425.0 → mergeron-2025.739439.3}/src/mergeron/gen/enforcement_stats.py +0 -0
- {mergeron-2025.739425.0 → mergeron-2025.739439.3}/src/mergeron/gen/upp_tests.py +0 -0
- {mergeron-2025.739425.0 → mergeron-2025.739439.3}/src/mergeron/py.typed +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: mergeron
|
|
3
|
-
Version: 2025.
|
|
3
|
+
Version: 2025.739439.3
|
|
4
4
|
Summary: Python for analyzing merger enforcement policy
|
|
5
5
|
License: MIT
|
|
6
6
|
Keywords: merger enforcement policy,merger guidelines,merger screening,enforcement presumptions,concentration standards,diversion ratio,upward pricing pressure,GUPPI
|
|
@@ -24,13 +24,13 @@ Requires-Dist: certifi (>=2025.6.15)
|
|
|
24
24
|
Requires-Dist: h5py (>=3.14.0)
|
|
25
25
|
Requires-Dist: jinja2 (>=3.1.6)
|
|
26
26
|
Requires-Dist: joblib (>=1.5.1)
|
|
27
|
-
Requires-Dist: lxml (>=
|
|
27
|
+
Requires-Dist: lxml (>=6.0.0)
|
|
28
28
|
Requires-Dist: matplotlib (>=3.10.3)
|
|
29
29
|
Requires-Dist: mpmath (>=1.3.0)
|
|
30
30
|
Requires-Dist: numexpr (>=2.11.0,<3.0.0)
|
|
31
|
-
Requires-Dist: python-calamine (>=0.
|
|
31
|
+
Requires-Dist: python-calamine (>=0.4.0)
|
|
32
32
|
Requires-Dist: ruamel-yaml (>=0.18.14)
|
|
33
|
-
Requires-Dist: scipy (>=1.
|
|
33
|
+
Requires-Dist: scipy (>=1.16.0)
|
|
34
34
|
Requires-Dist: sympy (>=1.14.0)
|
|
35
35
|
Requires-Dist: types-beautifulsoup4 (>=4.12.0.20250516)
|
|
36
36
|
Requires-Dist: urllib3 (>=2.5.0)
|
|
@@ -15,7 +15,7 @@ keywords = [
|
|
|
15
15
|
"upward pricing pressure",
|
|
16
16
|
"GUPPI",
|
|
17
17
|
]
|
|
18
|
-
version = "2025.
|
|
18
|
+
version = "2025.739439.3"
|
|
19
19
|
requires-python = ">=3.12,<4.0"
|
|
20
20
|
|
|
21
21
|
# Classifiers list: https://pypi.org/classifiers/
|
|
@@ -40,13 +40,13 @@ dependencies = [
|
|
|
40
40
|
"h5py>=3.14.0",
|
|
41
41
|
"jinja2>=3.1.6",
|
|
42
42
|
"joblib>=1.5.1",
|
|
43
|
-
"lxml>=
|
|
43
|
+
"lxml>=6.0.0",
|
|
44
44
|
"matplotlib>=3.10.3",
|
|
45
45
|
"mpmath>=1.3.0",
|
|
46
46
|
"numexpr (>=2.11.0,<3.0.0)",
|
|
47
|
-
"python-calamine>=0.
|
|
47
|
+
"python-calamine>=0.4.0",
|
|
48
48
|
"ruamel-yaml>=0.18.14",
|
|
49
|
-
"scipy>=1.
|
|
49
|
+
"scipy>=1.16.0",
|
|
50
50
|
"sympy>=1.14.0",
|
|
51
51
|
"types-beautifulsoup4>=4.12.0.20250516",
|
|
52
52
|
"urllib3>=2.5.0",
|
|
@@ -67,18 +67,18 @@ sphinx-autoapi = ">=3.6.0"
|
|
|
67
67
|
sphinx-autodoc-typehints = ">=3.2.0"
|
|
68
68
|
sphinx-immaterial = ">=0.13.5"
|
|
69
69
|
linuxdoc = ">=20240924"
|
|
70
|
-
ipython = ">=9.
|
|
70
|
+
ipython = ">=9.4.0"
|
|
71
71
|
ipython-pygments-lexers = ">=1.1.1"
|
|
72
72
|
|
|
73
73
|
[tool.poetry.group.lint.dependencies]
|
|
74
|
-
ruff = ">=0.12.
|
|
74
|
+
ruff = ">=0.12.2"
|
|
75
75
|
mypy = ">=1.16.1"
|
|
76
76
|
|
|
77
77
|
[tool.poetry.group.test.dependencies]
|
|
78
78
|
pytest = ">=8.4.1"
|
|
79
79
|
pytest-cov = ">=6.2.1"
|
|
80
|
-
pytest-xdist = ">=3.
|
|
81
|
-
coverage = ">=7.9.
|
|
80
|
+
pytest-xdist = ">=3.8.0"
|
|
81
|
+
coverage = ">=7.9.2"
|
|
82
82
|
|
|
83
83
|
[tool.poetry.group.other.dependencies]
|
|
84
84
|
semver = ">=3.0.4"
|
|
@@ -207,7 +207,7 @@ minversion = "8.0"
|
|
|
207
207
|
addopts = [
|
|
208
208
|
"--import-mode=importlib",
|
|
209
209
|
"--cov=mergeron",
|
|
210
|
-
"--cov-report=html
|
|
210
|
+
"--cov-report=html:tests/cov_html",
|
|
211
211
|
]
|
|
212
212
|
filterwarnings = [
|
|
213
213
|
"all",
|
{mergeron-2025.739425.0 → mergeron-2025.739439.3}/src/mergeron/core/guidelines_boundaries.py
RENAMED
|
@@ -233,7 +233,7 @@ class DiversionRatioBoundary:
|
|
|
233
233
|
) -> None:
|
|
234
234
|
if not (isinstance(_value, decimal.Decimal | float) and 0 <= _value <= 1):
|
|
235
235
|
raise ValueError(
|
|
236
|
-
"Margin-adjusted benchmark share
|
|
236
|
+
"Margin-adjusted benchmark diversion share must lie between 0 and 1."
|
|
237
237
|
)
|
|
238
238
|
|
|
239
239
|
recapture_ratio: float = field(
|
|
@@ -324,7 +324,7 @@ class DiversionRatioBoundary:
|
|
|
324
324
|
|
|
325
325
|
def __attrs_post_init__(self, /) -> None:
|
|
326
326
|
"""Initialize boundary and area based on other attributes."""
|
|
327
|
-
share_ratio =
|
|
327
|
+
share_ratio = critical_diversion_share(
|
|
328
328
|
self.diversion_ratio, r_bar=self.recapture_ratio
|
|
329
329
|
)
|
|
330
330
|
|
|
@@ -403,7 +403,7 @@ def guppi_from_delta(
|
|
|
403
403
|
)
|
|
404
404
|
|
|
405
405
|
|
|
406
|
-
def
|
|
406
|
+
def critical_diversion_share(
|
|
407
407
|
_guppi_bound: float = 0.075,
|
|
408
408
|
/,
|
|
409
409
|
*,
|
|
@@ -425,7 +425,7 @@ def critical_share_ratio(
|
|
|
425
425
|
|
|
426
426
|
Returns
|
|
427
427
|
-------
|
|
428
|
-
Critical share
|
|
428
|
+
Critical diversion share (diversion share bound) corresponding to the GUPPI bound
|
|
429
429
|
for given margin and recapture ratio.
|
|
430
430
|
|
|
431
431
|
"""
|
|
@@ -459,7 +459,7 @@ def share_from_guppi(
|
|
|
459
459
|
|
|
460
460
|
"""
|
|
461
461
|
return gbfn.round_cust(
|
|
462
|
-
(_d0 :=
|
|
462
|
+
(_d0 := critical_diversion_share(_guppi_bound, m_star=m_star, r_bar=r_bar))
|
|
463
463
|
/ (1 + _d0)
|
|
464
464
|
)
|
|
465
465
|
|
{mergeron-2025.739425.0 → mergeron-2025.739439.3}/src/mergeron/core/guidelines_boundary_functions.py
RENAMED
|
@@ -228,7 +228,7 @@ def diversion_share_boundary_wtd_avg(
|
|
|
228
228
|
Parameters
|
|
229
229
|
----------
|
|
230
230
|
_delta_star
|
|
231
|
-
|
|
231
|
+
Diversion share (:math:`\overline{d} / \overline{r}`)
|
|
232
232
|
_r_val
|
|
233
233
|
recapture ratio
|
|
234
234
|
agg_method
|
|
@@ -461,7 +461,7 @@ def diversion_share_boundary_xact_avg(
|
|
|
461
461
|
Parameters
|
|
462
462
|
----------
|
|
463
463
|
_delta_star
|
|
464
|
-
|
|
464
|
+
Diversion share (:math:`\overline{d} / \overline{r}`).
|
|
465
465
|
_r_val
|
|
466
466
|
Recapture ratio
|
|
467
467
|
recapture_form
|
|
@@ -590,7 +590,7 @@ def diversion_share_boundary_min(
|
|
|
590
590
|
Parameters
|
|
591
591
|
----------
|
|
592
592
|
_delta_star
|
|
593
|
-
|
|
593
|
+
Diversion share (:math:`\overline{d} / \overline{r}`).
|
|
594
594
|
_r_val
|
|
595
595
|
Recapture ratio.
|
|
596
596
|
recapture_form
|
|
@@ -634,7 +634,7 @@ def diversion_share_boundary_max(
|
|
|
634
634
|
Parameters
|
|
635
635
|
----------
|
|
636
636
|
_delta_star
|
|
637
|
-
|
|
637
|
+
Diversion share (:math:`\overline{d} / \overline{r}`).
|
|
638
638
|
_
|
|
639
639
|
Placeholder for recapture ratio included for consistency with other
|
|
640
640
|
share-ratio boundary functions.
|
|
@@ -409,7 +409,7 @@ def diversion_share_boundary_xact_avg_mp(
|
|
|
409
409
|
Parameters
|
|
410
410
|
----------
|
|
411
411
|
_delta_star
|
|
412
|
-
|
|
412
|
+
Diversion share (:math:`\overline{d} / \overline{r}`).
|
|
413
413
|
_r_val
|
|
414
414
|
Recapture ratio
|
|
415
415
|
recapture_form
|
|
@@ -534,7 +534,7 @@ def _diversion_share_boundary_wtd_avg_autoroot(
|
|
|
534
534
|
Parameters
|
|
535
535
|
----------
|
|
536
536
|
_delta_star
|
|
537
|
-
|
|
537
|
+
Diversion share (:math:`\overline{d} / \overline{r}`)
|
|
538
538
|
_r_val
|
|
539
539
|
recapture ratio
|
|
540
540
|
agg_method
|
|
@@ -89,9 +89,9 @@ class SHRDistribution(str, Enameled):
|
|
|
89
89
|
"""Share distribution for merging-firm shares has a higher peak share
|
|
90
90
|
|
|
91
91
|
By default, shape parameter for merging-firm-share is 2.5, and
|
|
92
|
-
1.0 for all others. Defining, :attr
|
|
92
|
+
1.0 for all others. Defining, :attr:`.ShareSpec.dist_parms`
|
|
93
93
|
as a vector of shape parameters with length matching
|
|
94
|
-
that of :attr
|
|
94
|
+
that of :attr:`.ShareSpec.dist_parms` allows flexible specification
|
|
95
95
|
of Dirichlet-distributed share-data generation.
|
|
96
96
|
"""
|
|
97
97
|
|
|
@@ -155,7 +155,7 @@ class ShareSpec:
|
|
|
155
155
|
A salient feature of market-share specification in this package is that
|
|
156
156
|
the draws represent markets with multiple different firm-counts.
|
|
157
157
|
Firm-counts are unspecified if the share distribution is
|
|
158
|
-
:attr
|
|
158
|
+
:attr:`.SHRDistribution.UNI`, for Dirichlet-distributed market-shares,
|
|
159
159
|
the default specification is that firm-counts vary between
|
|
160
160
|
2 and 7 firms with each value equally likely.
|
|
161
161
|
|
|
@@ -579,14 +579,12 @@ class MarginSampleData:
|
|
|
579
579
|
mnl_test_array: ArrayBoolean
|
|
580
580
|
"""Flags infeasible observations as False and rest as True
|
|
581
581
|
|
|
582
|
-
Applying restrictions from Bertrand-Nash oligopoly
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
flagged as True. Used from filtering-out draws with
|
|
589
|
-
infeasible PCM.
|
|
582
|
+
Applying restrictions from Bertrand-Nash oligopoly with MNL demand results
|
|
583
|
+
in some draws of Firm 2 PCM falling outside the feasible interval, :math:`[0, 1]`
|
|
584
|
+
for certain combinations of merging firms shares as initially drawn. Such draws
|
|
585
|
+
are flagged as infeasible (False) in :code:`mnl_test_array` while draws with
|
|
586
|
+
feaseible PCM values flagged True. This array is used to exclude infeasible draws
|
|
587
|
+
when imposing MNL demand in simulations.
|
|
590
588
|
"""
|
|
591
589
|
|
|
592
590
|
|
|
File without changes
|
|
File without changes
|
{mergeron-2025.739425.0 → mergeron-2025.739439.3}/src/mergeron/core/empirical_margin_distribution.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mergeron-2025.739425.0 → mergeron-2025.739439.3}/src/mergeron/gen/data_generation_functions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|