mergeron 2024.739123.2__tar.gz → 2024.739123.8__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 (31) hide show
  1. {mergeron-2024.739123.2 → mergeron-2024.739123.8}/PKG-INFO +1 -1
  2. {mergeron-2024.739123.2 → mergeron-2024.739123.8}/pyproject.toml +1 -1
  3. {mergeron-2024.739123.2 → mergeron-2024.739123.8}/src/mergeron/__init__.py +1 -1
  4. {mergeron-2024.739123.2 → mergeron-2024.739123.8}/src/mergeron/core/ftc_merger_investigations_data.py +36 -26
  5. {mergeron-2024.739123.2 → mergeron-2024.739123.8}/src/mergeron/data/jinja2_LaTeX_templates/ftcinvdata_summarypaired_table_template.tex.jinja2 +35 -23
  6. {mergeron-2024.739123.2 → mergeron-2024.739123.8}/src/mergeron/data/jinja2_LaTeX_templates/setup_tikz_tables.tex +5 -4
  7. {mergeron-2024.739123.2 → mergeron-2024.739123.8}/src/mergeron/gen/enforcement_stats.py +64 -63
  8. {mergeron-2024.739123.2 → mergeron-2024.739123.8}/README.rst +0 -0
  9. {mergeron-2024.739123.2 → mergeron-2024.739123.8}/src/mergeron/License.txt +0 -0
  10. {mergeron-2024.739123.2 → mergeron-2024.739123.8}/src/mergeron/core/__init__.py +0 -0
  11. {mergeron-2024.739123.2 → mergeron-2024.739123.8}/src/mergeron/core/damodaran_margin_data.py +0 -0
  12. {mergeron-2024.739123.2 → mergeron-2024.739123.8}/src/mergeron/core/guidelines_boundaries.py +0 -0
  13. {mergeron-2024.739123.2 → mergeron-2024.739123.8}/src/mergeron/core/guidelines_boundary_functions.py +0 -0
  14. {mergeron-2024.739123.2 → mergeron-2024.739123.8}/src/mergeron/core/guidelines_boundary_functions_extra.py +0 -0
  15. {mergeron-2024.739123.2 → mergeron-2024.739123.8}/src/mergeron/core/pseudorandom_numbers.py +0 -0
  16. {mergeron-2024.739123.2 → mergeron-2024.739123.8}/src/mergeron/data/__init__.py +0 -0
  17. {mergeron-2024.739123.2 → mergeron-2024.739123.8}/src/mergeron/data/damodaran_margin_data.xls +0 -0
  18. {mergeron-2024.739123.2 → mergeron-2024.739123.8}/src/mergeron/data/damodaran_margin_data_dict.msgpack +0 -0
  19. {mergeron-2024.739123.2 → mergeron-2024.739123.8}/src/mergeron/data/ftc_invdata.msgpack +0 -0
  20. {mergeron-2024.739123.2 → mergeron-2024.739123.8}/src/mergeron/data/jinja2_LaTeX_templates/clrrate_cis_summary_table_template.tex.jinja2 +0 -0
  21. {mergeron-2024.739123.2 → mergeron-2024.739123.8}/src/mergeron/data/jinja2_LaTeX_templates/ftcinvdata_byhhianddelta_table_template.tex.jinja2 +0 -0
  22. {mergeron-2024.739123.2 → mergeron-2024.739123.8}/src/mergeron/data/jinja2_LaTeX_templates/ftcinvdata_summary_table_template.tex.jinja2 +0 -0
  23. {mergeron-2024.739123.2 → mergeron-2024.739123.8}/src/mergeron/data/jinja2_LaTeX_templates/mergeron.cls +0 -0
  24. {mergeron-2024.739123.2 → mergeron-2024.739123.8}/src/mergeron/data/jinja2_LaTeX_templates/mergeron_table_collection_template.tex.jinja2 +0 -0
  25. {mergeron-2024.739123.2 → mergeron-2024.739123.8}/src/mergeron/demo/__init__.py +0 -0
  26. {mergeron-2024.739123.2 → mergeron-2024.739123.8}/src/mergeron/demo/visualize_empirical_margin_distribution.py +0 -0
  27. {mergeron-2024.739123.2 → mergeron-2024.739123.8}/src/mergeron/gen/__init__.py +0 -0
  28. {mergeron-2024.739123.2 → mergeron-2024.739123.8}/src/mergeron/gen/data_generation.py +0 -0
  29. {mergeron-2024.739123.2 → mergeron-2024.739123.8}/src/mergeron/gen/data_generation_functions.py +0 -0
  30. {mergeron-2024.739123.2 → mergeron-2024.739123.8}/src/mergeron/gen/upp_tests.py +0 -0
  31. {mergeron-2024.739123.2 → mergeron-2024.739123.8}/src/mergeron/py.typed +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mergeron
3
- Version: 2024.739123.2
3
+ Version: 2024.739123.8
4
4
  Summary: Merger Policy Analysis using Python
5
5
  License: MIT
6
6
  Keywords: merger policy analysis,merger guidelines,merger screening,policy presumptions,concentration standards,upward pricing pressure,GUPPI
@@ -13,7 +13,7 @@ keywords = [
13
13
  "upward pricing pressure",
14
14
  "GUPPI",
15
15
  ]
16
- version = "2024.739123.2"
16
+ version = "2024.739123.8"
17
17
 
18
18
  # Classifiers list: https://pypi.org/classifiers/
19
19
  classifiers = [
@@ -9,7 +9,7 @@ from numpy.typing import NDArray
9
9
 
10
10
  _PKG_NAME: str = Path(__file__).parent.stem
11
11
 
12
- VERSION = "2024.739123.2"
12
+ VERSION = "2024.739123.8"
13
13
 
14
14
  __version__ = VERSION
15
15
 
@@ -165,7 +165,7 @@ def construct_data(
165
165
 
166
166
  # Create data for industries with no evidence on entry
167
167
  for _data_period in _invdata:
168
- _construct_no_entry_evidence_data(_invdata, _data_period)
168
+ _construct_no_evidence_data(_invdata, _data_period)
169
169
 
170
170
  # Create a list of exclusions to named industries in the base period,
171
171
  # for construction of aggregate enforcement statistics where feasible
@@ -202,37 +202,47 @@ def construct_data(
202
202
  return MappingProxyType(_invdata)
203
203
 
204
204
 
205
- def _construct_no_entry_evidence_data(_invdata: INVData, _data_period: str, /) -> None:
205
+ def _construct_no_evidence_data(_invdata: INVData, _data_period: str, /) -> None:
206
206
  _invdata_ind_grp = "All Markets"
207
- _invdata_evid_cond = "No Entry Evidence"
208
-
209
- _invdata_sub_evid_cond_conc = _invdata[_data_period]["ByHHIandDelta"]
210
- _invdata_sub_evid_cond_conc["Table 9.X"] = INVTableData(
211
- _invdata_ind_grp,
212
- _invdata_evid_cond,
213
- np.column_stack((
214
- _invdata_sub_evid_cond_conc["Table 3.1"].data_array[:, :2],
207
+ _table_nos_map = dict(
208
+ zip(
215
209
  (
216
- _invdata_sub_evid_cond_conc["Table 3.1"].data_array[:, 2:]
217
- - _invdata_sub_evid_cond_conc["Table 9.1"].data_array[:, 2:]
218
- - _invdata_sub_evid_cond_conc["Table 9.2"].data_array[:, 2:]
210
+ "No Entry Evidence",
211
+ "No Evidence on Customer Complaints",
212
+ "No Evidence on Hot Documents",
219
213
  ),
220
- )),
221
- )
222
-
223
- _invdata_sub_evid_cond_fcount = _invdata[_data_period]["ByFirmCount"]
224
- _invdata_sub_evid_cond_fcount["Table 10.X"] = INVTableData(
225
- _invdata_ind_grp,
226
- _invdata_evid_cond,
227
- np.column_stack((
228
- _invdata_sub_evid_cond_fcount["Table 4.1"].data_array[:, :1],
229
214
  (
230
- _invdata_sub_evid_cond_fcount["Table 4.1"].data_array[:, 1:]
231
- - _invdata_sub_evid_cond_fcount["Table 10.1"].data_array[:, 1:]
232
- - _invdata_sub_evid_cond_fcount["Table 10.2"].data_array[:, 1:]
215
+ {"ByHHIandDelta": "Table 9.X", "ByFirmCount": "Table 10.X"},
216
+ {"ByHHIandDelta": "Table 7.X", "ByFirmCount": "Table 8.X"},
217
+ {"ByHHIandDelta": "Table 5.X", "ByFirmCount": "Table 6.X"},
233
218
  ),
234
- )),
219
+ strict=True,
220
+ )
235
221
  )
222
+ for _invdata_evid_cond in (
223
+ "No Entry Evidence",
224
+ "No Evidence on Customer Complaints",
225
+ "No Evidence on Hot Documents",
226
+ ):
227
+ for _stats_grp in ("ByHHIandDelta", "ByFirmCount"):
228
+ _invdata_sub_evid_cond_conc = _invdata[_data_period][_stats_grp]
229
+
230
+ _dtn = _table_nos_map[_invdata_evid_cond]["ByHHIandDelta"]
231
+ _stn0 = "Table 3.1" if _stats_grp == "ByHHIandDelta" else "Table 4.1"
232
+ _stn1, _stn2 = (_dtn.replace(".X", f".{_i}") for _i in ("1", "2"))
233
+
234
+ _invdata_sub_evid_cond_conc[_dtn] = INVTableData(
235
+ _invdata_ind_grp,
236
+ _invdata_evid_cond,
237
+ np.column_stack((
238
+ _invdata_sub_evid_cond_conc[_stn0].data_array[:, :2],
239
+ (
240
+ _invdata_sub_evid_cond_conc[_stn0].data_array[:, 2:]
241
+ - _invdata_sub_evid_cond_conc[_stn1].data_array[:, 2:]
242
+ - _invdata_sub_evid_cond_conc[_stn2].data_array[:, 2:]
243
+ ),
244
+ )),
245
+ )
236
246
 
237
247
 
238
248
  def _construct_new_period_data(
@@ -14,32 +14,44 @@
14
14
  ((* set obs_merger_class_0 = "Markets with, ``" + tmpl_data.obs_merger_class_0 + "''" *))
15
15
  ((* endif *))
16
16
 
17
+ ((* if tmpl_data.obs_summary_type == 'ByConcZone' *))
18
+ ((* set hdrcol_align = "left" *))
19
+ ((* else *))
20
+ ((* set hdrcol_align = "center" *))
21
+ ((* endif *))
22
+
17
23
  ((* set obs_merger_class_1 = "Markets with, ``" + tmpl_data.obs_merger_class_1 + "''" *))
18
24
 
25
+
26
+
19
27
  \centering
20
- \caption{FTC Merger Investigations Data}\label{tbl:FTCInvData_\JINVAR{- obs_summary_type }}
21
- {\footnotesize \JINVAR{ obs_summary_type_title } \\
22
- Grouped by Entry Conditions and Reporting Period \\[0.5\baselineskip]}
28
+ \caption{FTC Merger Investigations Data}\label{tbl:FTCInvData_\JINVAR{- tmpl_data.obs_summary_type }}
29
+ {\footnotesize
30
+ \JINVAR{ tmpl_data.obs_summary_type_title } \\
31
+ Grouped by Entry Conditions and Reporting Period \\[0.5\baselineskip]
32
+ }
23
33
  \begin{tikzpicture}[auto, font = \sffamily]
24
- \begin{pgfonlayer}{background}
25
- \matrix[
26
- datatable,
27
- nodes = {text width = 27pt,},
28
- column 1/.style = {nodes = {
29
- hdrtext,
30
- text width=\JINVAR{ hdrcol_width -}, fill=OBSHDRFill,
31
- },},
32
- record matrix dimensions,
33
- ] (invres_rate_raw) {
34
- \JINVAR{ tmpl_data.invdata_datstr -}
34
+ \matrix[
35
+ datatable,
36
+ nodes = {text width = 27pt,},
37
+ column 1/.style = {nodes = {
38
+ hdrtext,
39
+ text width=\JINVAR{ tmpl_data.hdrcol_width -}, fill=OBSHDRFill,
40
+ align=\JINVAR{ hdrcol_align -},
41
+ },},
42
+ record matrix dimensions,
43
+ ] (invres_rate_raw) {
44
+ \JINVAR{ tmpl_data.invdata_datstr -}
35
45
  };
36
- % Horizontal scoring for totals
37
- \draw[color = OBSHDRFill, line width = 1pt] (invres_rate_raw-\the\tnr-1.north west) -- (invres_rate_raw-\the\tnr-\the\tnc.north east);
38
- % Vertical scoring for column groups
39
- \draw[color = OBSHDRFill, line width = 1pt] (invres_rate_raw-1-3.north east) -- (invres_rate_raw-\the\tnr-3.south east);
40
- \draw[color = OBSHDRFill, line width = 1pt] (invres_rate_raw-1-5.north east) -- (invres_rate_raw-\the\tnr-5.south east);
41
- \draw[color = OBSHDRFill, line width = 1pt] (invres_rate_raw-1-7.north east) -- (invres_rate_raw-\the\tnr-7.south east);
42
- \end{pgfonlayer}
46
+ % Horizontal scoring for totals
47
+ \draw[color = OBSHDRFill, line width = 1pt]
48
+ ($(invres_rate_raw-\the\tnr-2.north west) + (- \JINVAR{ tmpl_data.hdrcol_width } - 6pt + 0.25\pgflinewidth, 0pt)$)
49
+ -- (invres_rate_raw-\the\tnr-\the\tnc.north east)
50
+ ;
51
+ % Vertical scoring for column groups
52
+ \draw[color = OBSHDRFill, line width = 1pt] (invres_rate_raw-1-3.north east) -- (invres_rate_raw-\the\tnr-3.south east);
53
+ \draw[color = OBSHDRFill, line width = 1pt] (invres_rate_raw-1-5.north east) -- (invres_rate_raw-\the\tnr-5.south east);
54
+ \draw[color = OBSHDRFill, line width = 1pt] (invres_rate_raw-1-7.north east) -- (invres_rate_raw-\the\tnr-7.south east);
43
55
 
44
56
 
45
57
  %% Header column - row heads - description
@@ -120,9 +132,9 @@
120
132
  % \item Fed. Trade Comm'n (2003), at note~\cref{fn:FTCInvData1996to2003}
121
133
  % \item Fed. Trade Comm'n (2011), at note~\cref{fn:FTCInvData1996to2011}
122
134
  % \end{itemize}
123
- \JINVAR{- tmpl_data.invdata_notestr -}
135
+ \JINVAR{ tmpl_data.invdata_notestr }
124
136
  \vspace{\baselineskip}
125
- \JINVAR{ tmpl_data.invdata_sourcestr -}
137
+ \JINVAR{ tmpl_data.invdata_sourcestr }
126
138
  }
127
139
  \vspace{\baselineskip}
128
140
  \end{table}
@@ -24,13 +24,17 @@
24
24
  ifthenelse(iseven(\pgfmatrixcurrentrow),1,3))}
25
25
  %\typeout{\the\pgfmatrixcurrentcolumn,\pgfmatrixcurrentrow->\itest}
26
26
  \ifcase\itest
27
- \tikzset{fill=OBSHDRFill}%
27
+ \tikzset{fill=none}%
28
28
  \or
29
29
  \tikzset{fill=DataFill}%
30
30
  \else
31
31
  \tikzset{fill=white}%
32
32
  \fi
33
33
  },
34
+ get matrix dims/.code={
35
+ \global\tnc=\pgf@matrix@numberofcolumns
36
+ \global\tnr=\pgfmatrixcurrentrow
37
+ },
34
38
  % If you only have numbers, text depth = 0ex; if text, text depth = 0.25ex, (may need tweaking for alignment across cells)
35
39
  anytext/.style = {
36
40
  font = \sffamily\scriptsize\addfontfeatures{Numbers={Monospaced,Lining}},
@@ -66,9 +70,6 @@
66
70
  fill = none,
67
71
  green_bar_filler,
68
72
  },
69
- % every even row/.style = {
70
- % nodes = {fill = DataFill}
71
- % },
72
73
  },
73
74
  hdrtable/.style = {
74
75
  anytable,
@@ -48,12 +48,16 @@ class IndustryGroup(enum.StrEnum):
48
48
 
49
49
  @enum.unique
50
50
  class OtherEvidence(enum.StrEnum):
51
+ UR = "Unrestricted on additional evidence"
51
52
  HD = "Hot Documents Identified"
52
- CC = "Strong Customer Complaints"
53
- NE = "No Entry Evidence"
53
+ HN = "No Hot Documents Identified"
54
+ HU = "No Evidence on Hot Documents"
55
+ CN = "No Strong Customer Complaints"
56
+ CS = "Strong Customer Complaints"
57
+ CU = "No Evidence on Customer Complaints"
54
58
  ED = "Entry Difficult"
55
59
  EE = "Entry Easy"
56
- UR = "Unrestricted on additional evidence"
60
+ NE = "No Entry Evidence"
57
61
 
58
62
 
59
63
  @enum.unique
@@ -90,13 +94,13 @@ moe_tmpl = Template(R"""
90
94
  """)
91
95
 
92
96
  # Define the LaTeX jinja environment
93
- # http://eosrei.net/articles/2015/11/LaTeX-templates-python-and-jinja2-generate-pdfs
94
- # The context manager does not point to a templates folder, so it doesn't work here
95
- # So, we brute-force a solution
96
-
97
- _tmpl_folder = re.search(
98
- r"'(.*)'", str(resources.files(f"{_PKG_NAME}.data.jinja2_LaTeX_templates"))
99
- )[0].strip("'")
97
+ _tmpl_resource = resources.files(f"{_PKG_NAME}.data.jinja2_LaTeX_templates")
98
+ _tmpl_folder = DATA_DIR.joinpath(_tmpl_resource.name)
99
+ with resources.as_file(
100
+ resources.files(f"{_PKG_NAME}.data.jinja2_LaTeX_templates")
101
+ ) as _tmpl_src:
102
+ if not _tmpl_folder.is_dir():
103
+ shutil.copytree(_tmpl_src, _tmpl_folder)
100
104
 
101
105
  LaTeX_jinja_env = Environment(
102
106
  block_start_string=R"((*",
@@ -115,22 +119,11 @@ LaTeX_jinja_env = Environment(
115
119
 
116
120
  # Place files related to rendering LaTeX in output data directory
117
121
  if not (_out_path := DATA_DIR.joinpath(f"{_PKG_NAME}.cls")).is_file():
118
- with resources.as_file(
119
- resources.files(f"{_PKG_NAME}.data.jinja2_LaTeX_templates").joinpath(
120
- "{_PKG_NAME}.cls"
121
- )
122
- ) as _in_path:
123
- shutil.copy2(_in_path, _out_path)
124
-
122
+ shutil.move(_tmpl_folder / _out_path.name, _out_path)
125
123
 
124
+ # Write to LaTeX table settings file
126
125
  if not (_DOTTEX := DATA_DIR / Rf"{_PKG_NAME}_TikZTableSettings.tex").is_file():
127
- # Write to LaTeX table settings file
128
- with resources.as_file(
129
- resources.files(f"{_PKG_NAME}.data.jinja2_LaTeX_templates").joinpath(
130
- "setup_tikz_tables.tex"
131
- )
132
- ) as _tex_path:
133
- shutil.copy2(_tex_path, _DOTTEX)
126
+ shutil.move(_tmpl_folder.joinpath("setup_tikz_tables.tex"), _DOTTEX)
134
127
 
135
128
 
136
129
  LTX_ARRAY_LINEEND = "\\\\\n"
@@ -168,6 +161,32 @@ hhi_delta_ranger, hhi_zone_post_ranger = (
168
161
  for _f in (HHI_DELTA_KNOTS, HHI_POST_ZONE_KNOTS)
169
162
  )
170
163
 
164
+
165
+ HMG_PRESUMPTION_ZONE_MAP = {
166
+ HHI_POST_ZONE_KNOTS[0]: {
167
+ HHI_DELTA_KNOTS[0]: (0, 0, 0),
168
+ HHI_DELTA_KNOTS[1]: (0, 0, 0),
169
+ HHI_DELTA_KNOTS[2]: (0, 0, 0),
170
+ },
171
+ HHI_POST_ZONE_KNOTS[1]: {
172
+ HHI_DELTA_KNOTS[0]: (0, 1, 1),
173
+ HHI_DELTA_KNOTS[1]: (1, 1, 2),
174
+ HHI_DELTA_KNOTS[2]: (1, 1, 2),
175
+ },
176
+ HHI_POST_ZONE_KNOTS[2]: {
177
+ HHI_DELTA_KNOTS[0]: (0, 2, 1),
178
+ HHI_DELTA_KNOTS[1]: (1, 2, 3),
179
+ HHI_DELTA_KNOTS[2]: (2, 2, 4),
180
+ },
181
+ }
182
+
183
+ ZONE_VALS = np.unique(
184
+ np.vstack([
185
+ tuple(HMG_PRESUMPTION_ZONE_MAP[_k].values()) for _k in HMG_PRESUMPTION_ZONE_MAP
186
+ ]),
187
+ axis=0,
188
+ )
189
+
171
190
  ZONE_STRINGS = {
172
191
  0: R"Green Zone (Safeharbor)",
173
192
  1: R"Yellow Zone",
@@ -182,10 +201,10 @@ ZONE_DETAIL_STRINGS_HHI = {
182
201
 
183
202
  ZONE_DETAIL_STRINGS_DELTA = {
184
203
  0: "",
185
- 1: Rf"ΔHHI < \text{{{HHI_DELTA_KNOTS[1]} pts.}}",
186
- 2: Rf"ΔHHI ⩾ \text{{{HHI_DELTA_KNOTS[1]} pts.}}",
187
- 3: R"ΔHHI ∈ \text{{[{}, {}) pts.}}".format(*HHI_DELTA_KNOTS[1:3]),
188
- 4: Rf"ΔHHI ⩾ \text{{{HHI_DELTA_KNOTS[2]} pts.}}",
204
+ 1: Rf"ΔHHI < {HHI_DELTA_KNOTS[1]} pts.",
205
+ 2: Rf"ΔHHI ⩾ {HHI_DELTA_KNOTS[1]} pts.}}",
206
+ 3: R"ΔHHI ∈ [{}, {}) pts.".format(*HHI_DELTA_KNOTS[1:3]),
207
+ 4: Rf"ΔHHI ⩾ {HHI_DELTA_KNOTS[2]} pts.",
189
208
  }
190
209
 
191
210
  ZONE_STRINGS_LATEX = {
@@ -211,31 +230,6 @@ ZONE_DETAIL_STRINGS_DELTA_LATEX = {
211
230
  4: Rf"\Delta HHI \geqslant \text{{{HHI_DELTA_KNOTS[2]} pts.}}",
212
231
  }
213
232
 
214
- HMG_PRESUMPTION_ZONE_MAP = {
215
- HHI_POST_ZONE_KNOTS[0]: {
216
- HHI_DELTA_KNOTS[0]: (0, 0, 0),
217
- HHI_DELTA_KNOTS[1]: (0, 0, 0),
218
- HHI_DELTA_KNOTS[2]: (0, 0, 0),
219
- },
220
- HHI_POST_ZONE_KNOTS[1]: {
221
- HHI_DELTA_KNOTS[0]: (0, 1, 1),
222
- HHI_DELTA_KNOTS[1]: (1, 1, 2),
223
- HHI_DELTA_KNOTS[2]: (1, 1, 2),
224
- },
225
- HHI_POST_ZONE_KNOTS[2]: {
226
- HHI_DELTA_KNOTS[0]: (0, 2, 1),
227
- HHI_DELTA_KNOTS[1]: (1, 2, 3),
228
- HHI_DELTA_KNOTS[2]: (2, 2, 4),
229
- },
230
- }
231
-
232
- ZONE_VALS = np.unique(
233
- np.vstack([
234
- tuple(HMG_PRESUMPTION_ZONE_MAP[_k].values()) for _k in HMG_PRESUMPTION_ZONE_MAP
235
- ]),
236
- axis=0,
237
- )
238
-
239
233
 
240
234
  def enf_stats_output(
241
235
  _data_array_dict: fid.INVData,
@@ -277,8 +271,13 @@ def enf_stats_output(
277
271
  _enf_spec,
278
272
  )
279
273
 
274
+ _print_format: Literal["text", "LaTeX"] = "text" if print_to_screen else "LaTeX"
280
275
  _enf_stats_hdr_list, _enf_stats_dat_list = _enf_stats_table_func(
281
- _enf_stats_cnts, None, return_type_sel=return_type_sel, sort_order=sort_order
276
+ _enf_stats_cnts,
277
+ None,
278
+ return_type_sel=return_type_sel,
279
+ sort_order=sort_order,
280
+ print_format=_print_format,
282
281
  )
283
282
 
284
283
  if print_to_screen:
@@ -289,7 +288,9 @@ def enf_stats_output(
289
288
  f"{_table_ind_group};",
290
289
  _table_evid_cond,
291
290
  )
292
- stats_print_rows(_enf_stats_hdr_list, _enf_stats_dat_list)
291
+ stats_print_rows(
292
+ _enf_stats_hdr_list, _enf_stats_dat_list, print_format=_print_format
293
+ )
293
294
 
294
295
  return _enf_stats_hdr_list, _enf_stats_dat_list
295
296
 
@@ -472,7 +473,7 @@ def enf_cnts_byconczone(_cnts_array: ArrayBIGINT, /) -> ArrayBIGINT:
472
473
 
473
474
  for _hhi_zone_delta_lim in HHI_DELTA_KNOTS[:3]:
474
475
  _delta_test = (
475
- (_hhi_delta_ranged > HHI_DELTA_KNOTS[1])
476
+ (_hhi_delta_ranged >= _hhi_zone_delta_lim)
476
477
  if _hhi_zone_delta_lim == HHI_DELTA_KNOTS[2]
477
478
  else (_hhi_delta_ranged == _hhi_zone_delta_lim)
478
479
  )
@@ -528,12 +529,10 @@ def enf_stats_table_onedim(
528
529
  *,
529
530
  return_type_sel: StatsReturnSelector = StatsReturnSelector.CNT,
530
531
  sort_order: SortSelector = SortSelector.UCH,
531
- print_format: Literal["text", "LaTeX"] = "text",
532
+ print_format: Literal["text", "LaTeX"] = "LaTeX",
532
533
  ) -> tuple[list[str], list[list[str]]]:
533
534
  _ndim_in: int = 1
534
- _dim_hdr_dict = {
535
- _v: (_k if _k == "TOTAL" else f"{_k}") for _k, _v in fid.CNT_FCOUNT_DICT.items()
536
- } | {
535
+ _dim_hdr_dict = {_v: _k for _k, _v in fid.CNT_FCOUNT_DICT.items()} | {
537
536
  _v: (
538
537
  "[2500, 5000]"
539
538
  if _k == "2,500 +"
@@ -583,7 +582,7 @@ def enf_stats_table_byzone(
583
582
  *,
584
583
  return_type_sel: StatsReturnSelector = StatsReturnSelector.CNT,
585
584
  sort_order: SortSelector = SortSelector.UCH,
586
- print_format: Literal["text", "LaTeX"] = "text",
585
+ print_format: Literal["text", "LaTeX"] = "LaTeX",
587
586
  ) -> tuple[list[str], list[list[str]]]:
588
587
  _ndim_in: int = ZONE_VALS.shape[1]
589
588
 
@@ -624,7 +623,7 @@ def enf_stats_table_byzone(
624
623
  if print_format == "LaTeX":
625
624
  _stats_text_color = "HiCoYellow" if _conc_zone == 1 else "BrightGreen"
626
625
  _stats_hdr_list += [
627
- R"{} {{ \({}{}\) }};".format(
626
+ R"{} {{\null\hfill \({}{}\) }};".format(
628
627
  rf"\node[text = {_stats_text_color}, fill = white, align = right]",
629
628
  ZONE_DETAIL_STRINGS_HHI_LATEX[_stats_byzone_detail[1]],
630
629
  (
@@ -702,6 +701,8 @@ def _stats_formatted_row(
702
701
  def stats_print_rows(
703
702
  _enf_stats_hdr_list: list[str],
704
703
  _enf_stats_dat_list: list[list[str]],
704
+ /,
705
+ *,
705
706
  print_format: Literal["text", "LaTeX"] = "text",
706
707
  ) -> None:
707
708
  for _idx, _hdr in enumerate(_enf_stats_hdr_list):
@@ -851,7 +852,7 @@ def render_table_pdf(
851
852
  cwd=DATA_DIR,
852
853
  )
853
854
  if _run_rc:
854
- subprocess.run("LaTeXmk -quiet -c".split(), check=True, cwd=DATA_DIR) # noqa: S603
855
+ subprocess.run("latexmk -quiet -c".split(), check=True, cwd=DATA_DIR) # noqa: S603
855
856
  del _run_rc
856
857
 
857
858
  print(