mergeron 2024.738946.0__tar.gz → 2024.738949.0__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.

Files changed (42) hide show
  1. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/PKG-INFO +1 -2
  2. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/pyproject.toml +1 -2
  3. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/core/excel_helper.py +38 -25
  4. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/core/proportions_tests.py +12 -10
  5. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/examples/guidelines_enforcement_patterns.py +2 -2
  6. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/examples/investigations_stats_sim_tables.py +1 -1
  7. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/examples/visualize_guidelines_tests.py +1 -1
  8. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/README.rst +0 -0
  9. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/License.txt +0 -0
  10. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/__init__.py +0 -0
  11. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/core/InCommon RSA Server CA cert chain.pem +0 -0
  12. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/core/__init__.py +0 -0
  13. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/core/damodaran_margin_data.py +0 -0
  14. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/core/ftc_merger_investigations_data.py +0 -0
  15. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/core/guidelines_boundaries.py +0 -0
  16. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/core/pseudorandom_numbers.py +0 -0
  17. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/examples/__init__.py +0 -0
  18. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/examples/concentration_as_diversion.py +0 -0
  19. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/examples/enforcement_boundaries_for_mergers_with_asymmetric_shares.py +0 -0
  20. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/examples/enforcement_boundaries_for_symmetric_firm_mergers.py +0 -0
  21. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/examples/example_parameterizations.py +0 -0
  22. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/examples/investigations_stats_obs_tables.py +0 -0
  23. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/examples/plotSafeHarbs_symbolically.py +0 -0
  24. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/examples/sound_guppi_safeharbor.py +0 -0
  25. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/examples/summarize_ftc_investigations_data.py +0 -0
  26. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/examples/testIntrinsicClearanceRates.py +0 -0
  27. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/examples/visualize_empirical_margin_distribution.py +0 -0
  28. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/ext/__init__.py +0 -0
  29. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/ext/tol_colors.py +0 -0
  30. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/gen/__init__.py +0 -0
  31. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/gen/_data_generation_functions_nonpublic.py +0 -0
  32. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/gen/data_generation.py +0 -0
  33. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/gen/investigations_stats.py +0 -0
  34. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/gen/upp_tests.py +0 -0
  35. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/jinja_LaTex_templates/clrrate_cis_summary_table_template.tex.jinja2 +0 -0
  36. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/jinja_LaTex_templates/ftcinvdata_byhhianddelta_table_template.tex.jinja2 +0 -0
  37. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/jinja_LaTex_templates/ftcinvdata_summary_table_template.tex.jinja2 +0 -0
  38. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/jinja_LaTex_templates/ftcinvdata_summarypaired_table_template.tex.jinja2 +0 -0
  39. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/jinja_LaTex_templates/mergeron.cls +0 -0
  40. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/jinja_LaTex_templates/mergeron_table_collection_template.tex.jinja2 +0 -0
  41. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/jinja_LaTex_templates/setup_tikz_tables.tex.jinja2 +0 -0
  42. {mergeron-2024.738946.0 → mergeron-2024.738949.0}/src/mergeron/py.typed +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mergeron
3
- Version: 2024.738946.0
3
+ Version: 2024.738949.0
4
4
  Summary: Analysis of standards defined in Horizontal Merger Guidelines
5
5
  License: MIT
6
6
  Keywords: merger policy analysis,merger guidelines,merger screening,policy presumptions,concentration standards,upward pricing pressure,GUPPI
@@ -18,7 +18,6 @@ Classifier: Programming Language :: Python :: 3
18
18
  Classifier: Programming Language :: Python :: 3.12
19
19
  Classifier: Programming Language :: Python :: 3 :: Only
20
20
  Classifier: Programming Language :: Python :: Implementation :: CPython
21
- Requires-Dist: aenum (>=3.1)
22
21
  Requires-Dist: attrs (>=23.2)
23
22
  Requires-Dist: bs4 (>=0.0.1)
24
23
  Requires-Dist: certifi (>=2023.11.17)
@@ -1,7 +1,7 @@
1
1
  [tool.poetry]
2
2
  name = "mergeron"
3
3
  # See ./get_version_str.py
4
- version = "2024.738946.0"
4
+ version = "2024.738949.0"
5
5
  description = "Analysis of standards defined in Horizontal Merger Guidelines"
6
6
  keywords = [
7
7
  "merger policy analysis",
@@ -34,7 +34,6 @@ classifiers = [
34
34
  [tool.poetry.dependencies]
35
35
  # You may need to apply the fixes in, https://github.com/python-poetry/poetry/issues/3365
36
36
  # if poetry dependency resolution appears to hang (read the page at link to the end)
37
- aenum = ">=3.1"
38
37
  attrs = ">=23.2"
39
38
  bs4 = ">=0.0.1"
40
39
  google-re2 = ">=1.1"
@@ -14,16 +14,29 @@ from .. import _PKG_NAME # noqa: TID252
14
14
 
15
15
  __version__ = version(_PKG_NAME)
16
16
 
17
- from collections.abc import Sequence
18
- from typing import Any, ClassVar
17
+ import enum
18
+ from collections.abc import Mapping, Sequence
19
+ from types import MappingProxyType
20
+ from typing import Any
19
21
 
20
- import aenum # type: ignore
21
22
  import numpy as np
22
23
  import numpy.typing as npt
23
24
  import xlsxwriter # type: ignore
24
25
 
25
26
 
26
- class CFmt(aenum.UniqueEnum): # type: ignore
27
+ @enum.unique
28
+ class CFmtParent(dict[str, Any], enum.ReprEnum):
29
+ def merge(self, _other) -> CFmtParent:
30
+ if isinstance(_other, CFmtParent):
31
+ return self.value | _other.value
32
+ else:
33
+ raise RuntimeWarning(
34
+ f"Object {_other!r} not valid for merge(), returned original."
35
+ )
36
+ return self.value
37
+
38
+
39
+ class CFmt(CFmtParent): # type: ignore
27
40
  """
28
41
  Initialize cell formats for xlsxwriter.
29
42
 
@@ -35,31 +48,31 @@ class CFmt(aenum.UniqueEnum): # type: ignore
35
48
  See, https://xlsxwriter.readthedocs.io/format.html
36
49
  """
37
50
 
38
- XL_DEFAULT: ClassVar = {"font_name": "Calibri", "font_size": 11}
39
- XL_DEFAULT_2003: ClassVar = {"font_name": "Arial", "font_size": 10}
51
+ XL_DEFAULT = MappingProxyType({"font_name": "Calibri", "font_size": 11})
52
+ XL_DEFAULT_2003 = MappingProxyType({"font_name": "Arial", "font_size": 10})
40
53
 
41
- A_CTR: ClassVar = {"align": "center"}
42
- A_CTR_ACROSS: ClassVar = {"align": "center_across"}
43
- A_LEFT: ClassVar = {"align": "left"}
44
- A_RIGHT: ClassVar = {"align": "right"}
54
+ A_CTR = MappingProxyType({"align": "center"})
55
+ A_CTR_ACROSS = MappingProxyType({"align": "center_across"})
56
+ A_LEFT = MappingProxyType({"align": "left"})
57
+ A_RIGHT = MappingProxyType({"align": "right"})
45
58
 
46
- BOLD: ClassVar = {"bold": True}
47
- ITALIC: ClassVar = {"italic": True}
48
- ULINE: ClassVar = {"underline": True}
59
+ BOLD = MappingProxyType({"bold": True})
60
+ ITALIC = MappingProxyType({"italic": True})
61
+ ULINE = MappingProxyType({"underline": True})
49
62
 
50
- TEXT_WRAP: ClassVar = {"text_wrap": True}
51
- IND_1: ClassVar = {"indent": 1}
63
+ TEXT_WRAP = MappingProxyType({"text_wrap": True})
64
+ IND_1 = MappingProxyType({"indent": 1})
52
65
 
53
- DOLLAR_NUM: ClassVar = {"num_format": "[$$-409]#,##0.00"}
54
- DT_NUM: ClassVar = {"num_format": "mm/dd/yyyy"}
55
- QTY_NUM: ClassVar = {"num_format": "#,##0.0"}
56
- PCT_NUM: ClassVar = {"num_format": "##0.000000%"}
57
- AREA_NUM: ClassVar = {"num_format": "0.00000000"}
66
+ DOLLAR_NUM = MappingProxyType({"num_format": "[$$-409]#,##0.00"})
67
+ DT_NUM = MappingProxyType({"num_format": "mm/dd/yyyy"})
68
+ QTY_NUM = MappingProxyType({"num_format": "#,##0.0"})
69
+ PCT_NUM = MappingProxyType({"num_format": "##0.000000%"})
70
+ AREA_NUM = MappingProxyType({"num_format": "0.00000000"})
58
71
 
59
- BAR_FILL: ClassVar = {"pattern": 1, "bg_color": "dfeadf"}
60
- BOT_BORDER: ClassVar = {"bottom": 1, "bottom_color": "000000"}
61
- TOP_BORDER: ClassVar = {"top": 1, "top_color": "000000"}
62
- HDR_BORDER: ClassVar = TOP_BORDER | BOT_BORDER
72
+ BAR_FILL = MappingProxyType({"pattern": 1, "bg_color": "dfeadf"})
73
+ BOT_BORDER = MappingProxyType({"bottom": 1, "bottom_color": "000000"})
74
+ TOP_BORDER = MappingProxyType({"top": 1, "top_color": "000000"})
75
+ HDR_BORDER = TOP_BORDER | BOT_BORDER
63
76
 
64
77
 
65
78
  def matrix_to_sheet(
@@ -216,7 +229,7 @@ def xl_fmt(
216
229
  :code:`xlsxwriter` `Format` object
217
230
 
218
231
  """
219
- _cell_fmt_dict: dict[str, Any] = {}
232
+ _cell_fmt_dict: Mapping[str, Any] = MappingProxyType({})
220
233
  if isinstance(_cell_fmt, tuple):
221
234
  ensure_cell_format_spec_tuple(_cell_fmt)
222
235
  for _cf in _cell_fmt:
@@ -7,6 +7,7 @@ Functions to estimate confidence intervals for
7
7
 
8
8
  from __future__ import annotations
9
9
 
10
+ from dataclasses import dataclass
10
11
  from importlib.metadata import version
11
12
 
12
13
  from .. import _PKG_NAME # noqa: TID252
@@ -14,7 +15,7 @@ from .. import _PKG_NAME # noqa: TID252
14
15
  __version__ = version(_PKG_NAME)
15
16
 
16
17
  from collections.abc import Sequence
17
- from typing import Literal, NamedTuple, TypeVar
18
+ from typing import Literal, TypeVar
18
19
 
19
20
  import numpy as np
20
21
  from numpy.typing import NBitBase, NDArray
@@ -101,12 +102,12 @@ def propn_ci(
101
102
  case "Agresti-Coull":
102
103
  _zsc = norm.ppf(1 - alpha / 2)
103
104
  _zscsq = _zsc * _zsc
104
- _adjmt_t = 4 if alpha == 0.05 else _zscsq
105
- _est_phat = (_npos + _adjmt_t / 2) / (_nobs + _adjmt_t)
105
+ _adjmt = 4 if alpha == 0.05 else _zscsq
106
+ _est_phat = (_npos + _adjmt / 2) / (_nobs + _adjmt)
106
107
  _est_ci_l, _est_ci_u = (
107
108
  _est_phat + _g
108
109
  for _g in [
109
- _f * _zsc * np.sqrt(_est_phat * (1 - _est_phat) / (_nobs + 4))
110
+ _f * _zsc * np.sqrt(_est_phat * (1 - _est_phat) / (_nobs + _adjmt))
110
111
  for _f in (-1, 1)
111
112
  ]
112
113
  )
@@ -441,7 +442,7 @@ def _propn_diff_chisq_mn(
441
442
  )
442
443
 
443
444
 
444
- def propn_ci_diff_multinomial(
445
+ def propn_diff_ci_multinomial(
445
446
  _counts: NDArray[np.integer[TI]], /, *, alpha: float = 0.05
446
447
  ) -> NDArray[np.float64]:
447
448
  """Estimate confidence intervals of pair-wise differences in multinomial proportions
@@ -475,16 +476,17 @@ def propn_ci_diff_multinomial(
475
476
  return np.column_stack([_d + _f * _d_cr * np.sqrt(_var) for _f in (-1, 1)])
476
477
 
477
478
 
478
- class MultinomialDiffTest(NamedTuple):
479
+ @dataclass(slots=True, frozen=True)
480
+ class MultinomialPropnsTest:
479
481
  estimate: np.float64
480
482
  dof: int
481
483
  critical_value: np.float64
482
484
  p_value: np.float64
483
485
 
484
486
 
485
- def propn_diff_multinomial_chisq(
487
+ def propn_test_multinomial(
486
488
  _counts: NDArray[np.integer[TI]], /, *, alpha: float = 0.05
487
- ) -> MultinomialDiffTest:
489
+ ) -> MultinomialPropnsTest:
488
490
  """Chi-square test for homogeneity of differences in multinomial proportions.
489
491
 
490
492
  Differences in multinomial proportions sum to zero.
@@ -510,9 +512,9 @@ def propn_diff_multinomial_chisq(
510
512
  _p_bar = _n / np.einsum("jk->j", _n_k / _prob)
511
513
 
512
514
  _y_sq = _n * ((1 / np.einsum("j->", _p_bar)) - 1)
513
- _dof = np.array([_f - 1 for _f in _counts.shape]).prod()
515
+ _dof = np.array([_s - 1 for _s in _counts.shape]).prod()
514
516
  _chi_rv = chi2(_dof)
515
517
 
516
- return MultinomialDiffTest(
518
+ return MultinomialPropnsTest(
517
519
  _y_sq, _dof, _chi_rv.ppf(1 - alpha), 1 - _chi_rv.cdf(_y_sq)
518
520
  )
@@ -58,11 +58,11 @@ if __name__ == "__main__":
58
58
 
59
59
  print()
60
60
  print("Conf. intervals for differences in proportions enforced (Goodman, 1964)")
61
- print(repr(pcl.propn_ci_diff_multinomial(enf_counts[:, [1, 3]])))
61
+ print(repr(pcl.propn_diff_ci_multinomial(enf_counts[:, [1, 3]])))
62
62
 
63
63
  print()
64
64
  print("Goodman's chi-squared test for homogeneity of enforcement patterns")
65
- print(repr(pcl.propn_diff_multinomial_chisq(enf_counts[:, [1, 3]])))
65
+ print(repr(pcl.propn_test_multinomial(enf_counts[:, [1, 3]])))
66
66
 
67
67
  print()
68
68
  print(
@@ -416,7 +416,7 @@ if __name__ == "__main__":
416
416
  merger_class,
417
417
  invres_parm_vec,
418
418
  mkt_sample_spec,
419
- invres_stats_kwargs, # type: ignore
419
+ invres_stats_kwargs, # type: ignore
420
420
  )
421
421
  table_dottex_namelist += (table_dottex_name,)
422
422
 
@@ -277,7 +277,7 @@ if __name__ == "__main__":
277
277
  ),
278
278
  )
279
279
 
280
- save_data_to_file_flag = False
280
+ save_data_to_file_flag = True
281
281
  if save_data_to_file_flag:
282
282
  h5_path = DATA_DIR / PROG_PATH.with_suffix(".h5").name
283
283
  (_, h5_file, h5_group), h5_subgroup_name = utl.initialize_hd5(