analytics-toolkit 1.3.8.2__tar.gz → 1.3.10.7__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.
Files changed (159) hide show
  1. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/PKG-INFO +22 -2
  2. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/README.md +21 -1
  3. analytics_toolkit-1.3.10.7/analytics_toolkit/__init__.py +3 -0
  4. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/ab_utils/__init__.py +6 -4
  5. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/ab_utils/api.py +1 -1
  6. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/ab_utils/metrics.py +9 -3
  7. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/ab_utils/outliers.py +19 -5
  8. analytics_toolkit-1.3.10.7/analytics_toolkit/ab_utils/planning.py +2454 -0
  9. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/ab_utils/validation.py +4 -4
  10. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/general/logging.py +7 -0
  11. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/__init__.py +6 -3
  12. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/connection/config.py +21 -0
  13. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/core/capabilities.py +9 -3
  14. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/__init__.py +2 -2
  15. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/load/load_df.py +127 -12
  16. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/load/load_sql_table.py +42 -5
  17. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/load/models.py +4 -0
  18. analytics_toolkit-1.3.10.7/analytics_toolkit/sql/dml/load/stage.py +258 -0
  19. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/table/__init__.py +2 -2
  20. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/table/api.py +1 -1
  21. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/table/create_table_from_sql.py +1 -1
  22. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/table/partitions.py +4 -4
  23. analytics_toolkit-1.3.10.7/analytics_toolkit/sql/dml/table/write_modes.py +815 -0
  24. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/transfer/flow/api.py +231 -137
  25. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/transfer/flow/attempt.py +64 -3
  26. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/transfer/flow/finalize.py +23 -12
  27. analytics_toolkit-1.3.10.7/analytics_toolkit/sql/dml/transfer/flow/options.py +265 -0
  28. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/transfer/flow/stage.py +2 -0
  29. analytics_toolkit-1.3.10.7/analytics_toolkit/sql/dml/transfer/runtime/models.py +373 -0
  30. analytics_toolkit-1.3.10.7/analytics_toolkit/sql/dml/transfer/staging.py +276 -0
  31. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/metadata/show_tables.py +21 -3
  32. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/orchestration/async_sql.py +8 -6
  33. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/orchestration/parallel_sql.py +8 -6
  34. analytics_toolkit-1.3.10.7/analytics_toolkit/sql_format/__init__.py +1533 -0
  35. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit.egg-info/PKG-INFO +22 -2
  36. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit.egg-info/SOURCES.txt +5 -0
  37. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/pyproject.toml +1 -1
  38. analytics_toolkit-1.3.10.7/tests/test_ab_utils_metrics.py +3453 -0
  39. analytics_toolkit-1.3.10.7/tests/test_agent_tools_mcp.py +1561 -0
  40. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/tests/test_general_logging.py +36 -0
  41. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/tests/test_rag_docs.py +185 -2
  42. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/tests/test_sql_architecture.py +3 -2
  43. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/tests/test_sql_async.py +67 -0
  44. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/tests/test_sql_backend_adapters.py +3 -1
  45. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/tests/test_sql_connection_config.py +153 -0
  46. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/tests/test_sql_create_table_from_sql.py +1 -1
  47. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/tests/test_sql_drop_many_partitions.py +24 -20
  48. analytics_toolkit-1.3.10.7/tests/test_sql_format.py +644 -0
  49. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/tests/test_sql_improvements.py +175 -6
  50. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/tests/test_sql_load_table.py +580 -1
  51. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/tests/test_sql_parallel.py +67 -0
  52. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/tests/test_sql_show_tables.py +60 -0
  53. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/tests/test_sql_transfer_clickhouse.py +5 -7
  54. analytics_toolkit-1.3.10.7/tests/test_sql_transfer_row_batches.py +2297 -0
  55. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/tests/test_sql_transfer_schema.py +124 -3
  56. analytics_toolkit-1.3.8.2/analytics_toolkit/__init__.py +0 -3
  57. analytics_toolkit-1.3.8.2/analytics_toolkit/ab_utils/planning.py +0 -288
  58. analytics_toolkit-1.3.8.2/analytics_toolkit/sql/dml/load/stage.py +0 -85
  59. analytics_toolkit-1.3.8.2/analytics_toolkit/sql/dml/table/write_modes.py +0 -324
  60. analytics_toolkit-1.3.8.2/analytics_toolkit/sql/dml/transfer/runtime/models.py +0 -185
  61. analytics_toolkit-1.3.8.2/tests/test_ab_utils_metrics.py +0 -1468
  62. analytics_toolkit-1.3.8.2/tests/test_sql_transfer_row_batches.py +0 -1026
  63. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/LICENSE +0 -0
  64. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/ab_utils/bootstrap.py +0 -0
  65. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/ab_utils/constants.py +0 -0
  66. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/ab_utils/cuped.py +0 -0
  67. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/ab_utils/formatter.py +0 -0
  68. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/ab_utils/parallel.py +0 -0
  69. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/ab_utils/ratio.py +0 -0
  70. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/ab_utils/rows.py +0 -0
  71. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/ab_utils/split.py +0 -0
  72. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/ab_utils/stats.py +0 -0
  73. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/cli.py +0 -0
  74. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/dates/__init__.py +0 -0
  75. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/dates/dates.py +0 -0
  76. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/dates/functions.py +0 -0
  77. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/excel/__init__.py +0 -0
  78. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/excel/long_format.py +0 -0
  79. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/general/__init__.py +0 -0
  80. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/general/read_file.py +0 -0
  81. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/_backend_adapters/__init__.py +0 -0
  82. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/_backend_adapters/base.py +0 -0
  83. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/_backend_adapters/clickhouse.py +0 -0
  84. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/_backend_adapters/dbapi.py +0 -0
  85. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/_backend_adapters/gp.py +0 -0
  86. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/_backend_adapters/registry.py +0 -0
  87. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/_backend_adapters/trino.py +0 -0
  88. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/_backend_adapters/utils.py +0 -0
  89. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/backend_adapters.py +0 -0
  90. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/clickhouse/__init__.py +0 -0
  91. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/clickhouse/lifecycle.py +0 -0
  92. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/clickhouse/options.py +0 -0
  93. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/clickhouse/wait.py +0 -0
  94. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/connection/__init__.py +0 -0
  95. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/connection/errors.py +0 -0
  96. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/connection/get_sql_connection.py +0 -0
  97. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/connection/protocols.py +0 -0
  98. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/core/__init__.py +0 -0
  99. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/core/identifiers.py +0 -0
  100. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/core/types.py +0 -0
  101. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/ddl/__init__.py +0 -0
  102. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/ddl/api.py +0 -0
  103. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/ddl/builders.py +0 -0
  104. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/ddl/clickhouse.py +0 -0
  105. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/ddl/extract_ddl.py +0 -0
  106. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/ddl/identifiers.py +0 -0
  107. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/ddl/models.py +0 -0
  108. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/ddl/schema.py +0 -0
  109. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/io/__init__.py +0 -0
  110. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/io/cancel_queries.py +0 -0
  111. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/io/execute_read.py +0 -0
  112. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/io/execute_sql.py +0 -0
  113. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/io/models.py +0 -0
  114. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/io/read_sql.py +0 -0
  115. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/load/__init__.py +0 -0
  116. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/table/_basic_ops.py +0 -0
  117. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/table/ch_create_table_as.py +0 -0
  118. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/table/drop_tables.py +0 -0
  119. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/table/maintenance.py +0 -0
  120. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/table/models.py +0 -0
  121. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/table/table_validation.py +0 -0
  122. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/transfer/__init__.py +0 -0
  123. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/transfer/flow/__init__.py +0 -0
  124. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/transfer/flow/estimate.py +0 -0
  125. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/transfer/io/__init__.py +0 -0
  126. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/transfer/io/source.py +0 -0
  127. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/transfer/runtime/__init__.py +0 -0
  128. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/transfer/runtime/retry.py +0 -0
  129. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/dml/transfer/schema.py +0 -0
  130. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/execution/__init__.py +0 -0
  131. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/execution/labels.py +0 -0
  132. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/execution/operation_runner.py +0 -0
  133. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/execution/plan_steps.py +0 -0
  134. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/execution/plans.py +0 -0
  135. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/execution/query_timing.py +0 -0
  136. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/metadata/__init__.py +0 -0
  137. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/metadata/table_info.py +0 -0
  138. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/orchestration/__init__.py +0 -0
  139. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/orchestration/pipeline.py +0 -0
  140. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit/sql/orchestration/tasks.py +0 -0
  141. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit.egg-info/dependency_links.txt +0 -0
  142. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit.egg-info/entry_points.txt +0 -0
  143. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit.egg-info/requires.txt +0 -0
  144. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/analytics_toolkit.egg-info/top_level.txt +0 -0
  145. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/setup.cfg +0 -0
  146. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/tests/test_ab_utils_format.py +0 -0
  147. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/tests/test_ab_utils_parallel.py +0 -0
  148. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/tests/test_ab_utils_split.py +0 -0
  149. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/tests/test_dates.py +0 -0
  150. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/tests/test_excel_long_format.py +0 -0
  151. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/tests/test_general_read_file.py +0 -0
  152. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/tests/test_sql_cancel_queries.py +0 -0
  153. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/tests/test_sql_ch_create_table_as.py +0 -0
  154. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/tests/test_sql_drop_tables.py +0 -0
  155. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/tests/test_sql_execute_read.py +0 -0
  156. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/tests/test_sql_extract_ddl.py +0 -0
  157. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/tests/test_sql_gp_create_partitions.py +0 -0
  158. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/tests/test_sql_retries.py +0 -0
  159. {analytics_toolkit-1.3.8.2 → analytics_toolkit-1.3.10.7}/tests/test_sql_transfer_source_batches.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: analytics-toolkit
3
- Version: 1.3.8.2
3
+ Version: 1.3.10.7
4
4
  Summary: Shared Python utilities for SQL, Excel, and date helpers.
5
5
  Author: analytics_toolkit contributors
6
6
  License: MIT License
@@ -75,7 +75,7 @@ Python toolkit for AB-test analysis, SQL workflows, Excel reports, and date help
75
75
 
76
76
  [Documentation Overview](https://github.com/Karapsin/analytics_toolkit/blob/main/docs/README.md)
77
77
 
78
- **Version:** `1.3.8.2`<br>
78
+ **Version:** `1.3.10.7`<br>
79
79
  **Depends:** Python (`>=3.8,<3.15`)<br>
80
80
  **Imports:** [clickhouse-connect](https://pypi.org/project/clickhouse-connect/) (`>=0.5.14,<1`), [lz4](https://pypi.org/project/lz4/) (`>=4.3.2,<5`), [numpy](https://pypi.org/project/numpy/) (`>=1.24.2,<2`), [openpyxl](https://pypi.org/project/openpyxl/) (`>=3.1.1,<4`), [orjson](https://pypi.org/project/orjson/) (`>=3.8.7,<4`), [pandas](https://pypi.org/project/pandas/) (`>=1.4.4,<3`), [psycopg2-binary](https://pypi.org/project/psycopg2-binary/) (`>=2.9.5,<3`), [python-dateutil](https://pypi.org/project/python-dateutil/) (`>=2.8.2,<3`), [pytz](https://pypi.org/project/pytz/) (`>=2022.7`), [requests](https://pypi.org/project/requests/) (`>=2.28.2,<3`), [scipy](https://pypi.org/project/scipy/) (`>=1.10.1,<2`), [sqlglot](https://pypi.org/project/sqlglot/) (`>=20,<31`), [sqlparse](https://pypi.org/project/sqlparse/) (`>=0.4.3,<1`), [tqdm](https://pypi.org/project/tqdm/) (`>=4.65.0,<5`), [trino](https://pypi.org/project/trino/) (`>=0.320,<1`), [zstandard](https://pypi.org/project/zstandard/) (`>=0.20.0,<1`)<br>
81
81
  **Suggests:** [apache-airflow](https://pypi.org/project/apache-airflow/) (`>=2.4,<3`; optional extra `airflow`)<br>
@@ -103,6 +103,7 @@ pip install git+https://github.com/Karapsin/analytics_toolkit.git
103
103
 
104
104
  - `analytics_toolkit.ab_utils`: AB-test metric comparison helpers.
105
105
  - `analytics_toolkit.sql`: SQL read, execute, load, and transfer helpers.
106
+ - `analytics_toolkit.sql_format`: SQL formatting, CTE rewrite, and Greenplum temp-table rewrite helpers.
106
107
  - `analytics_toolkit.excel`: Excel report helpers for long-format dataframes.
107
108
  - `analytics_toolkit.dates`: date and period helpers.
108
109
  - `analytics_toolkit.general`: shared logging and file path helpers.
@@ -150,6 +151,25 @@ rows = sql.transfer(
150
151
  - `sql.load_df`: load a pandas dataframe into a configured backend table.
151
152
  - `sql.transfer`: move rows from a source query to a target table across backends.
152
153
 
154
+ ## SQL Formatting
155
+
156
+ [SQL formatting guide](https://github.com/Karapsin/analytics_toolkit/blob/main/docs/modules/sql_format/index.md)
157
+
158
+ `sql_format.format_sql`, `sql_format.rewrite_with_ctes`, and
159
+ `sql_format.gp_rewrite_to_temp_tables` transform SQL text locally without
160
+ opening database connections. `GROUP BY` and `ORDER BY` clauses use SELECT-list
161
+ ordinals by default, with expression-based formatting available through
162
+ `group_by_format="expressions"` and `order_by_format="expressions"`.
163
+
164
+ ```python
165
+ from analytics_toolkit import sql_format
166
+
167
+ formatted = sql_format.format_sql(
168
+ "select user_id, amount from orders where amount > 100",
169
+ dialect="postgres",
170
+ )
171
+ ```
172
+
153
173
  ## AB Metrics
154
174
 
155
175
  [All AB functions](https://github.com/Karapsin/analytics_toolkit/blob/main/docs/modules/ab_utils/functions/index.md)
@@ -6,7 +6,7 @@ Python toolkit for AB-test analysis, SQL workflows, Excel reports, and date help
6
6
 
7
7
  [Documentation Overview](https://github.com/Karapsin/analytics_toolkit/blob/main/docs/README.md)
8
8
 
9
- **Version:** `1.3.8.2`<br>
9
+ **Version:** `1.3.10.7`<br>
10
10
  **Depends:** Python (`>=3.8,<3.15`)<br>
11
11
  **Imports:** [clickhouse-connect](https://pypi.org/project/clickhouse-connect/) (`>=0.5.14,<1`), [lz4](https://pypi.org/project/lz4/) (`>=4.3.2,<5`), [numpy](https://pypi.org/project/numpy/) (`>=1.24.2,<2`), [openpyxl](https://pypi.org/project/openpyxl/) (`>=3.1.1,<4`), [orjson](https://pypi.org/project/orjson/) (`>=3.8.7,<4`), [pandas](https://pypi.org/project/pandas/) (`>=1.4.4,<3`), [psycopg2-binary](https://pypi.org/project/psycopg2-binary/) (`>=2.9.5,<3`), [python-dateutil](https://pypi.org/project/python-dateutil/) (`>=2.8.2,<3`), [pytz](https://pypi.org/project/pytz/) (`>=2022.7`), [requests](https://pypi.org/project/requests/) (`>=2.28.2,<3`), [scipy](https://pypi.org/project/scipy/) (`>=1.10.1,<2`), [sqlglot](https://pypi.org/project/sqlglot/) (`>=20,<31`), [sqlparse](https://pypi.org/project/sqlparse/) (`>=0.4.3,<1`), [tqdm](https://pypi.org/project/tqdm/) (`>=4.65.0,<5`), [trino](https://pypi.org/project/trino/) (`>=0.320,<1`), [zstandard](https://pypi.org/project/zstandard/) (`>=0.20.0,<1`)<br>
12
12
  **Suggests:** [apache-airflow](https://pypi.org/project/apache-airflow/) (`>=2.4,<3`; optional extra `airflow`)<br>
@@ -34,6 +34,7 @@ pip install git+https://github.com/Karapsin/analytics_toolkit.git
34
34
 
35
35
  - `analytics_toolkit.ab_utils`: AB-test metric comparison helpers.
36
36
  - `analytics_toolkit.sql`: SQL read, execute, load, and transfer helpers.
37
+ - `analytics_toolkit.sql_format`: SQL formatting, CTE rewrite, and Greenplum temp-table rewrite helpers.
37
38
  - `analytics_toolkit.excel`: Excel report helpers for long-format dataframes.
38
39
  - `analytics_toolkit.dates`: date and period helpers.
39
40
  - `analytics_toolkit.general`: shared logging and file path helpers.
@@ -81,6 +82,25 @@ rows = sql.transfer(
81
82
  - `sql.load_df`: load a pandas dataframe into a configured backend table.
82
83
  - `sql.transfer`: move rows from a source query to a target table across backends.
83
84
 
85
+ ## SQL Formatting
86
+
87
+ [SQL formatting guide](https://github.com/Karapsin/analytics_toolkit/blob/main/docs/modules/sql_format/index.md)
88
+
89
+ `sql_format.format_sql`, `sql_format.rewrite_with_ctes`, and
90
+ `sql_format.gp_rewrite_to_temp_tables` transform SQL text locally without
91
+ opening database connections. `GROUP BY` and `ORDER BY` clauses use SELECT-list
92
+ ordinals by default, with expression-based formatting available through
93
+ `group_by_format="expressions"` and `order_by_format="expressions"`.
94
+
95
+ ```python
96
+ from analytics_toolkit import sql_format
97
+
98
+ formatted = sql_format.format_sql(
99
+ "select user_id, amount from orders where amount > 100",
100
+ dialect="postgres",
101
+ )
102
+ ```
103
+
84
104
  ## AB Metrics
85
105
 
86
106
  [All AB functions](https://github.com/Karapsin/analytics_toolkit/blob/main/docs/modules/ab_utils/functions/index.md)
@@ -0,0 +1,3 @@
1
+ """analytics_toolkit package."""
2
+
3
+ __all__ = ["ab_utils", "dates", "excel", "general", "sql", "sql_format"]
@@ -1,9 +1,10 @@
1
1
  """Utilities for AB-test related workflows."""
2
2
 
3
3
  from .metrics import (
4
- MdePlanningOptions,
5
4
  RatioMetricSpec,
6
- compute_mde_only,
5
+ compute_mde,
6
+ compute_mde_from_sql,
7
+ compute_mde_sql_native,
7
8
  compute_test_metrics,
8
9
  format_ab_metrics,
9
10
  parallel_compute_metrics,
@@ -12,9 +13,10 @@ from .metrics import (
12
13
  from .split import do_split
13
14
 
14
15
  __all__ = [
15
- "MdePlanningOptions",
16
16
  "RatioMetricSpec",
17
- "compute_mde_only",
17
+ "compute_mde",
18
+ "compute_mde_from_sql",
19
+ "compute_mde_sql_native",
18
20
  "compute_test_metrics",
19
21
  "do_split",
20
22
  "format_ab_metrics",
@@ -41,7 +41,7 @@ def compute_test_metrics(
41
41
  bootstrap_progress: bool = False,
42
42
  pre_exp_metrics_df: pd.DataFrame | None = None,
43
43
  outliers_quantile: float = 0.999,
44
- outliers_policy: str = "truncate",
44
+ outliers_policy: str = "non_zero_truncate",
45
45
  ) -> pd.DataFrame:
46
46
  """Compute per-metric experiment comparison statistics.
47
47
 
@@ -3,7 +3,12 @@ from __future__ import annotations
3
3
  from .api import compute_test_metrics
4
4
  from .formatter import format_ab_metrics
5
5
  from .parallel import parallel_compute_metrics, parallel_compute_metrics_from_sql
6
- from .planning import MdePlanningOptions, RatioMetricSpec, compute_mde_only
6
+ from .planning import (
7
+ RatioMetricSpec,
8
+ compute_mde,
9
+ compute_mde_from_sql,
10
+ compute_mde_sql_native,
11
+ )
7
12
  from .bootstrap import (
8
13
  _apply_multiple_comparisons_adjustment,
9
14
  _compute_bootstrap_family_max_statistics,
@@ -87,9 +92,10 @@ from .validation import (
87
92
  __all__ = [
88
93
  "DEFAULT_ALPHA",
89
94
  "DEFAULT_POWER",
90
- "MdePlanningOptions",
91
95
  "RatioMetricSpec",
92
- "compute_mde_only",
96
+ "compute_mde",
97
+ "compute_mde_from_sql",
98
+ "compute_mde_sql_native",
93
99
  "compute_test_metrics",
94
100
  "format_ab_metrics",
95
101
  "parallel_compute_metrics",
@@ -50,7 +50,11 @@ def _build_outlier_context(
50
50
  return {
51
51
  "kind": "mean",
52
52
  "metric_key": metric_key,
53
- "cutoff": _compute_outlier_cutoff(values, outliers_quantile),
53
+ "cutoff": _compute_outlier_cutoff(
54
+ values,
55
+ outliers_quantile,
56
+ outliers_policy,
57
+ ),
54
58
  "policy": outliers_policy,
55
59
  }
56
60
 
@@ -84,13 +88,23 @@ def _build_outlier_context(
84
88
  "kind": "ratio",
85
89
  "level": ratio_spec["level"],
86
90
  "metric_key": metric_key,
87
- "cutoff": _compute_outlier_cutoff(values, outliers_quantile),
91
+ "cutoff": _compute_outlier_cutoff(
92
+ values,
93
+ outliers_quantile,
94
+ outliers_policy,
95
+ ),
88
96
  "policy": outliers_policy,
89
97
  }
90
98
 
91
99
 
92
- def _compute_outlier_cutoff(values: pd.Series, outliers_quantile: float) -> float:
100
+ def _compute_outlier_cutoff(
101
+ values: pd.Series,
102
+ outliers_quantile: float,
103
+ outliers_policy: str,
104
+ ) -> float:
93
105
  nonmissing_values = values.dropna()
106
+ if outliers_policy == "non_zero_truncate":
107
+ nonmissing_values = nonmissing_values[nonmissing_values != 0]
94
108
  if nonmissing_values.empty:
95
109
  return math.nan
96
110
  return float(nonmissing_values.quantile(outliers_quantile))
@@ -105,7 +119,7 @@ def _apply_outliers_to_values(
105
119
  if outlier_mask.any() and outlier_context is not None:
106
120
  cutoff = float(outlier_context["cutoff"])
107
121
  policy = str(outlier_context["policy"])
108
- if policy == "truncate":
122
+ if policy in {"truncate", "non_zero_truncate"}:
109
123
  transformed.loc[outlier_mask] = cutoff
110
124
  else:
111
125
  transformed.loc[outlier_mask] = np.nan
@@ -127,7 +141,7 @@ def _apply_outliers_to_agg_ratio_components(
127
141
  if outlier_mask.any() and outlier_context is not None:
128
142
  cutoff = float(outlier_context["cutoff"])
129
143
  policy = str(outlier_context["policy"])
130
- if policy == "truncate":
144
+ if policy in {"truncate", "non_zero_truncate"}:
131
145
  transformed_numerator.loc[outlier_mask] = cutoff * denominator.loc[outlier_mask]
132
146
  else:
133
147
  transformed_numerator.loc[outlier_mask] = np.nan