howso-engine 69.0.0__tar.gz → 69.0.1__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 (128) hide show
  1. {howso_engine-69.0.0 → howso_engine-69.0.1}/LICENSE-3RD-PARTY.txt +35 -35
  2. {howso_engine-69.0.0/howso_engine.egg-info → howso_engine-69.0.1}/PKG-INFO +2 -2
  3. howso_engine-69.0.1/howso/howso-engine/howso.caml +0 -0
  4. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/howso-engine/migrations/migrations.caml +0 -0
  5. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/howso-engine/version.json +4 -4
  6. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/feature_attributes/abstract_data.py +4 -0
  7. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/feature_attributes/base.py +58 -11
  8. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/feature_attributes/infer_feature_attributes.py +5 -2
  9. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/feature_attributes/pandas.py +33 -1
  10. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/feature_attributes/time_series.py +13 -4
  11. {howso_engine-69.0.0 → howso_engine-69.0.1/howso_engine.egg-info}/PKG-INFO +2 -2
  12. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso_engine.egg-info/requires.txt +1 -1
  13. {howso_engine-69.0.0 → howso_engine-69.0.1}/pyproject.toml +1 -1
  14. {howso_engine-69.0.0 → howso_engine-69.0.1}/requirements-3.11-dev.txt +16 -14
  15. {howso_engine-69.0.0 → howso_engine-69.0.1}/requirements-3.11.txt +4 -4
  16. {howso_engine-69.0.0 → howso_engine-69.0.1}/requirements-3.12-dev.txt +16 -14
  17. {howso_engine-69.0.0 → howso_engine-69.0.1}/requirements-3.12.txt +4 -4
  18. {howso_engine-69.0.0 → howso_engine-69.0.1}/requirements-3.13-dev.txt +16 -14
  19. {howso_engine-69.0.0 → howso_engine-69.0.1}/requirements-3.13.txt +4 -4
  20. {howso_engine-69.0.0 → howso_engine-69.0.1}/requirements-3.14-dev.txt +16 -14
  21. {howso_engine-69.0.0 → howso_engine-69.0.1}/requirements-3.14.txt +4 -4
  22. howso_engine-69.0.1/version.json +5 -0
  23. howso_engine-69.0.0/howso/howso-engine/howso.caml +0 -0
  24. howso_engine-69.0.0/version.json +0 -5
  25. {howso_engine-69.0.0 → howso_engine-69.0.1}/.coveragerc +0 -0
  26. {howso_engine-69.0.0 → howso_engine-69.0.1}/.flake8 +0 -0
  27. {howso_engine-69.0.0 → howso_engine-69.0.1}/.github/CODEOWNERS +0 -0
  28. {howso_engine-69.0.0 → howso_engine-69.0.1}/.github/templates/version_summary.md +0 -0
  29. {howso_engine-69.0.0 → howso_engine-69.0.1}/.github/workflows/build-pr.yml +0 -0
  30. {howso_engine-69.0.0 → howso_engine-69.0.1}/.github/workflows/build-release.yml +0 -0
  31. {howso_engine-69.0.0 → howso_engine-69.0.1}/.github/workflows/build.yml +0 -0
  32. {howso_engine-69.0.0 → howso_engine-69.0.1}/.github/workflows/rebuild-requirements.yml +0 -0
  33. {howso_engine-69.0.0 → howso_engine-69.0.1}/.github/workflows/version-update.yml +0 -0
  34. {howso_engine-69.0.0 → howso_engine-69.0.1}/.gitignore +0 -0
  35. {howso_engine-69.0.0 → howso_engine-69.0.1}/.gitmodules +0 -0
  36. {howso_engine-69.0.0 → howso_engine-69.0.1}/.pylintrc +0 -0
  37. {howso_engine-69.0.0 → howso_engine-69.0.1}/CONTRIBUTING.md +0 -0
  38. {howso_engine-69.0.0 → howso_engine-69.0.1}/LICENSE.txt +0 -0
  39. {howso_engine-69.0.0 → howso_engine-69.0.1}/MANIFEST.in +0 -0
  40. {howso_engine-69.0.0 → howso_engine-69.0.1}/Makefile +0 -0
  41. {howso_engine-69.0.0 → howso_engine-69.0.1}/README.md +0 -0
  42. {howso_engine-69.0.0 → howso_engine-69.0.1}/bin/build.sh +0 -0
  43. {howso_engine-69.0.0 → howso_engine-69.0.1}/config/latest-mt-debug-howso.yml +0 -0
  44. {howso_engine-69.0.0 → howso_engine-69.0.1}/config/latest-mt-howso.yml +0 -0
  45. {howso_engine-69.0.0 → howso_engine-69.0.1}/config/latest-mt-noavx-traces-howso.yml +0 -0
  46. {howso_engine-69.0.0 → howso_engine-69.0.1}/config/latest-mt-traces-howso.yml +0 -0
  47. {howso_engine-69.0.0 → howso_engine-69.0.1}/config/latest-st-debug-howso.yml +0 -0
  48. {howso_engine-69.0.0 → howso_engine-69.0.1}/config/latest-st-howso.yml +0 -0
  49. {howso_engine-69.0.0 → howso_engine-69.0.1}/config/latest-st-traces-howso.yml +0 -0
  50. {howso_engine-69.0.0 → howso_engine-69.0.1}/config/powershell/Download-Tzdata.ps1 +0 -0
  51. {howso_engine-69.0.0 → howso_engine-69.0.1}/config/powershell/Helper-Functions.ps1 +0 -0
  52. {howso_engine-69.0.0 → howso_engine-69.0.1}/hatch.toml +0 -0
  53. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/__main__.py +0 -0
  54. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/client/__init__.py +0 -0
  55. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/client/api.py +0 -0
  56. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/client/base.py +0 -0
  57. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/client/cache.py +0 -0
  58. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/client/client.py +0 -0
  59. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/client/configuration.py +0 -0
  60. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/client/exceptions.py +0 -0
  61. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/client/feature_flags.py +0 -0
  62. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/client/pandas/__init__.py +0 -0
  63. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/client/pandas/client.py +0 -0
  64. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/client/protocols.py +0 -0
  65. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/client/schemas/__init__.py +0 -0
  66. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/client/schemas/aggregate_reaction.py +0 -0
  67. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/client/schemas/base.py +0 -0
  68. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/client/schemas/group_reaction.py +0 -0
  69. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/client/schemas/project.py +0 -0
  70. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/client/schemas/reaction.py +0 -0
  71. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/client/schemas/session.py +0 -0
  72. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/client/schemas/trainee.py +0 -0
  73. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/client/schemas/version.py +0 -0
  74. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/client/typing.py +0 -0
  75. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/direct/__init__.py +0 -0
  76. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/direct/_utilities.py +0 -0
  77. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/direct/client.py +0 -0
  78. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/direct/schemas/__init__.py +0 -0
  79. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/direct/schemas/trainee.py +0 -0
  80. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/engine/__init__.py +0 -0
  81. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/engine/client.py +0 -0
  82. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/engine/project.py +0 -0
  83. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/engine/session.py +0 -0
  84. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/engine/trainee.py +0 -0
  85. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/scikit/__init__.py +0 -0
  86. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/scikit/scikit.py +0 -0
  87. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/__init__.py +0 -0
  88. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/decorators.py +0 -0
  89. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/fanout_features.py +0 -0
  90. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/feature_attributes/__init__.py +0 -0
  91. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/feature_attributes/protocols.py +0 -0
  92. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/feature_attributes/relational.py +0 -0
  93. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/feature_attributes/serializers.py +0 -0
  94. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/feature_attributes/suggestions.py +0 -0
  95. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/feature_attributes/warnings.py +0 -0
  96. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/features.py +0 -0
  97. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/installation_verification/__init__.py +0 -0
  98. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/installation_verification/__main__.py +0 -0
  99. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/installation_verification/_constants.py +0 -0
  100. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/installation_verification/_helpers.py +0 -0
  101. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/installation_verification/_output.py +0 -0
  102. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/installation_verification/_probes.py +0 -0
  103. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/installation_verification/_types.py +0 -0
  104. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/installation_verification/checks_cpu.py +0 -0
  105. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/installation_verification/checks_engine.py +0 -0
  106. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/installation_verification/checks_environment.py +0 -0
  107. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/installation_verification/checks_optional.py +0 -0
  108. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/installation_verification/main.py +0 -0
  109. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/installation_verification/registry.py +0 -0
  110. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/internals.py +0 -0
  111. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/json_wrapper.py +0 -0
  112. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/locale.py +0 -0
  113. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/monitors.py +0 -0
  114. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/posix.py +0 -0
  115. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/progress.py +0 -0
  116. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/random.py +0 -0
  117. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/reaction.py +0 -0
  118. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/testing.py +0 -0
  119. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/tokenizing.py +0 -0
  120. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso/utilities/utilities.py +0 -0
  121. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso_engine.egg-info/SOURCES.txt +0 -0
  122. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso_engine.egg-info/dependency_links.txt +0 -0
  123. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso_engine.egg-info/entry_points.txt +0 -0
  124. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso_engine.egg-info/scm_file_list.json +0 -0
  125. {howso_engine-69.0.0 → howso_engine-69.0.1}/howso_engine.egg-info/top_level.txt +0 -0
  126. {howso_engine-69.0.0 → howso_engine-69.0.1}/pyrightconfig.json +0 -0
  127. {howso_engine-69.0.0 → howso_engine-69.0.1}/ruff.toml +0 -0
  128. {howso_engine-69.0.0 → howso_engine-69.0.1}/setup.cfg +0 -0
@@ -1,10 +1,10 @@
1
1
  Faker
2
- 40.43.0
2
+ 40.44.0
3
3
  MIT License
4
4
  joke2k
5
5
  https://github.com/joke2k/faker
6
6
  Faker is a Python package that generates fake data for you.
7
- /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/faker-40.43.0.dist-info/licenses/LICENSE.txt
7
+ /home/runner/.pyenv/versions/3.14.10/lib/python3.14/site-packages/faker-40.44.0.dist-info/licenses/LICENSE.txt
8
8
  Copyright (c) 2012 Daniele Faraglia
9
9
 
10
10
  Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -32,7 +32,7 @@ MIT License
32
32
  Kirill Simonov
33
33
  https://pyyaml.org/
34
34
  YAML parser and emitter for Python
35
- /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/pyyaml-6.0.3.dist-info/licenses/LICENSE
35
+ /home/runner/.pyenv/versions/3.14.10/lib/python3.14/site-packages/pyyaml-6.0.3.dist-info/licenses/LICENSE
36
36
  Copyright (c) 2017-2021 Ingy döt Net
37
37
  Copyright (c) 2006-2016 Kirill Simonov
38
38
 
@@ -61,7 +61,7 @@ BSD-2-Clause
61
61
  Georg Brandl <georg@python.org>
62
62
  https://pygments.org
63
63
  Pygments is a syntax highlighting package written in Python.
64
- /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/pygments-2.21.0.dist-info/licenses/LICENSE
64
+ /home/runner/.pyenv/versions/3.14.10/lib/python3.14/site-packages/pygments-2.21.0.dist-info/licenses/LICENSE
65
65
  Copyright (c) 2006-2022 by the respective authors (see AUTHORS file).
66
66
  All rights reserved.
67
67
 
@@ -95,7 +95,7 @@ MIT
95
95
  Filipe Laíns <lains@riseup.net>, Bernát Gábor <gaborjbernat@gmail.com>, layday <layday@protonmail.com>, Henry Schreiner <henryschreineriii@gmail.com>
96
96
  https://build.pypa.io
97
97
  A simple, correct Python build frontend
98
- /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/build-1.6.1.dist-info/licenses/LICENSE
98
+ /home/runner/.pyenv/versions/3.14.10/lib/python3.14/site-packages/build-1.6.1.dist-info/licenses/LICENSE
99
99
  Copyright © 2019 Filipe Laíns <filipe.lains@gmail.com>
100
100
 
101
101
  Permission is hereby granted, free of charge, to any person obtaining a
@@ -124,7 +124,7 @@ Mozilla Public License 2.0 (MPL 2.0)
124
124
  Kenneth Reitz
125
125
  https://github.com/certifi/python-certifi
126
126
  Python package for providing Mozilla's CA Bundle.
127
- /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/certifi-2026.10.23.dist-info/licenses/LICENSE
127
+ /home/runner/.pyenv/versions/3.14.10/lib/python3.14/site-packages/certifi-2026.10.23.dist-info/licenses/LICENSE
128
128
  This package contains a modified version of ca-bundle.crt:
129
129
 
130
130
  ca-bundle.crt -- Bundle of CA Root Certificates
@@ -153,7 +153,7 @@ MIT
153
153
  "Ahmed R. TAHRI" <tahri.ahmed@proton.me>
154
154
  https://github.com/jawah/charset_normalizer/blob/master/CHANGELOG.md
155
155
  The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet.
156
- /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/charset_normalizer-3.5.2.dist-info/licenses/LICENSE
156
+ /home/runner/.pyenv/versions/3.14.10/lib/python3.14/site-packages/charset_normalizer-3.5.2.dist-info/licenses/LICENSE
157
157
  MIT License
158
158
 
159
159
  Copyright (c) 2025 TAHRI Ahmed R.
@@ -183,7 +183,7 @@ BSD-3-Clause
183
183
  UNKNOWN
184
184
  https://github.com/pallets/click/
185
185
  Composable command line interface toolkit
186
- /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/click-8.5.0.dist-info/licenses/LICENSE.txt
186
+ /home/runner/.pyenv/versions/3.14.10/lib/python3.14/site-packages/click-8.5.0.dist-info/licenses/LICENSE.txt
187
187
  Copyright 2014 Pallets
188
188
 
189
189
  Redistribution and use in source and binary forms, with or without
@@ -220,7 +220,7 @@ BSD License
220
220
  The cloudpickle developer team
221
221
  https://github.com/cloudpipe/cloudpickle
222
222
  Pickler class to extend the standard pickle.Pickler functionality
223
- /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/cloudpickle-3.1.2.dist-info/licenses/LICENSE
223
+ /home/runner/.pyenv/versions/3.14.10/lib/python3.14/site-packages/cloudpickle-3.1.2.dist-info/licenses/LICENSE
224
224
  This module was extracted from the `cloud` package, developed by
225
225
  PiCloud, Inc.
226
226
 
@@ -261,7 +261,7 @@ MIT
261
261
  Jason Moiron <jmoiron@jmoiron.net>
262
262
  https://github.com/python-humanize/humanize
263
263
  Python humanize utilities
264
- /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/humanize-4.16.0.dist-info/licenses/LICENCE
264
+ /home/runner/.pyenv/versions/3.14.10/lib/python3.14/site-packages/humanize-4.16.0.dist-info/licenses/LICENCE
265
265
  Copyright (c) 2010-2020 Jason Moiron and Contributors
266
266
 
267
267
  Permission is hereby granted, free of charge, to any person obtaining
@@ -290,7 +290,7 @@ BSD-3-Clause
290
290
  Kim Davies <kim+pypi@gumleaf.org>
291
291
  https://github.com/kjd/idna
292
292
  Internationalized Domain Names in Applications (IDNA)
293
- /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/idna-3.20.dist-info/licenses/LICENSE.md
293
+ /home/runner/.pyenv/versions/3.14.10/lib/python3.14/site-packages/idna-3.20.dist-info/licenses/LICENSE.md
294
294
  BSD 3-Clause License
295
295
 
296
296
  Copyright (c) 2013-2026, Kim Davies and contributors.
@@ -330,7 +330,7 @@ BSD-3-Clause
330
330
  Gael Varoquaux <gael.varoquaux@normalesup.org>
331
331
  https://joblib.readthedocs.io
332
332
  Lightweight pipelining with Python functions
333
- /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/joblib-1.6.0.dist-info/licenses/LICENSE.txt
333
+ /home/runner/.pyenv/versions/3.14.10/lib/python3.14/site-packages/joblib-1.6.0.dist-info/licenses/LICENSE.txt
334
334
  BSD 3-Clause License
335
335
 
336
336
  Copyright (c) 2008-2021, The joblib developers.
@@ -368,7 +368,7 @@ MIT License
368
368
  Chris Sewell <chrisj_sewell@hotmail.com>
369
369
  https://github.com/executablebooks/markdown-it-py
370
370
  Python port of markdown-it. Markdown parsing, done right!
371
- /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/markdown_it_py-4.2.0.dist-info/licenses/LICENSE
371
+ /home/runner/.pyenv/versions/3.14.10/lib/python3.14/site-packages/markdown_it_py-4.2.0.dist-info/licenses/LICENSE
372
372
  MIT License
373
373
 
374
374
  Copyright (c) 2020 ExecutableBookProject
@@ -398,7 +398,7 @@ MIT License
398
398
  Taneli Hukkinen <hukkin@users.noreply.github.com>
399
399
  https://github.com/executablebooks/mdurl
400
400
  Markdown URL utilities
401
- /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/mdurl-0.1.2.dist-info/LICENSE
401
+ /home/runner/.pyenv/versions/3.14.10/lib/python3.14/site-packages/mdurl-0.1.2.dist-info/LICENSE
402
402
  Copyright (c) 2015 Vitaly Puzrin, Alex Kocharin.
403
403
  Copyright (c) 2021 Taneli Hukkinen
404
404
 
@@ -453,7 +453,7 @@ MIT License
453
453
  Hajime Senuma <hajime.senuma@gmail.com>
454
454
  https://pypi.org/project/mmh3/
455
455
  Python extension for MurmurHash (MurmurHash3), a set of fast and robust hash functions.
456
- /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/mmh3-5.3.1.dist-info/licenses/LICENSE
456
+ /home/runner/.pyenv/versions/3.14.10/lib/python3.14/site-packages/mmh3-5.3.1.dist-info/licenses/LICENSE
457
457
  MIT License
458
458
 
459
459
  Copyright (c) 2011-2026 Hajime Senuma
@@ -482,7 +482,7 @@ BSD-3-Clause AND 0BSD AND MIT AND Zlib AND CC0-1.0
482
482
  Travis E. Oliphant et al.
483
483
  https://numpy.org
484
484
  Fundamental package for array computing in Python
485
- /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/numpy-2.4.6.dist-info/licenses/LICENSE.txt
485
+ /home/runner/.pyenv/versions/3.14.10/lib/python3.14/site-packages/numpy-2.4.6.dist-info/licenses/LICENSE.txt
486
486
  Copyright (c) 2005-2025, NumPy Developers.
487
487
  All rights reserved.
488
488
 
@@ -1426,7 +1426,7 @@ Apache-2.0 OR BSD-2-Clause
1426
1426
  Donald Stufft <donald@stufft.io>
1427
1427
  https://github.com/pypa/packaging
1428
1428
  Core utilities for Python packages
1429
- /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/packaging-26.3.dist-info/licenses/LICENSE
1429
+ /home/runner/.pyenv/versions/3.14.10/lib/python3.14/site-packages/packaging-26.3.dist-info/licenses/LICENSE
1430
1430
  This software is made available under the terms of *either* of the licenses
1431
1431
  found in LICENSE.APACHE or LICENSE.BSD. Contributions to this software is made
1432
1432
  under the terms of *both* these licenses.
@@ -1438,7 +1438,7 @@ BSD License
1438
1438
  The Pandas Development Team <pandas-dev@python.org>
1439
1439
  https://pandas.pydata.org
1440
1440
  Powerful data structures for data analysis, time series, and statistics
1441
- /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/pandas-2.3.3.dist-info/LICENSE
1441
+ /home/runner/.pyenv/versions/3.14.10/lib/python3.14/site-packages/pandas-2.3.3.dist-info/LICENSE
1442
1442
  BSD 3-Clause License
1443
1443
 
1444
1444
  Copyright (c) 2008-2011, AQR Capital Management, LLC, Lambda Foundry, Inc. and PyData Development Team
@@ -2696,7 +2696,7 @@ BSD License
2696
2696
  Vincent Driessen <me@nvie.com>
2697
2697
  https://github.com/jazzband/pip-tools/
2698
2698
  pip-tools keeps your pinned dependencies fresh.
2699
- /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/pip_tools-7.4.1.dist-info/LICENSE
2699
+ /home/runner/.pyenv/versions/3.14.10/lib/python3.14/site-packages/pip_tools-7.4.1.dist-info/LICENSE
2700
2700
  BSD 3-Clause License
2701
2701
 
2702
2702
  Copyright (c). All rights reserved.
@@ -2733,7 +2733,7 @@ BSD-3-Clause
2733
2733
  Giampaolo Rodola
2734
2734
  https://github.com/giampaolo/psutil
2735
2735
  Cross-platform lib for process and system monitoring.
2736
- /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/psutil-7.2.2.dist-info/LICENSE
2736
+ /home/runner/.pyenv/versions/3.14.10/lib/python3.14/site-packages/psutil-7.2.2.dist-info/LICENSE
2737
2737
  BSD 3-Clause License
2738
2738
 
2739
2739
  Copyright (c) 2009, Jay Loden, Dave Daeschler, Giampaolo Rodola
@@ -2771,7 +2771,7 @@ MIT
2771
2771
  Thomas Kluyver <thomas@kluyver.me.uk>
2772
2772
  https://github.com/pypa/pyproject-hooks
2773
2773
  Wrappers to call pyproject.toml-based build backend hooks.
2774
- /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/pyproject_hooks-1.3.3.dist-info/licenses/LICENSE
2774
+ /home/runner/.pyenv/versions/3.14.10/lib/python3.14/site-packages/pyproject_hooks-1.3.3.dist-info/licenses/LICENSE
2775
2775
  The MIT License (MIT)
2776
2776
 
2777
2777
  Copyright (c) 2017 Thomas Kluyver
@@ -2801,7 +2801,7 @@ Apache Software License; BSD License
2801
2801
  Gustavo Niemeyer
2802
2802
  https://github.com/dateutil/dateutil
2803
2803
  Extensions to the standard Python datetime module
2804
- /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/python_dateutil-3.0.0.dist-info/licenses/LICENSE
2804
+ /home/runner/.pyenv/versions/3.14.10/lib/python3.14/site-packages/python_dateutil-3.0.0.dist-info/licenses/LICENSE
2805
2805
  Copyright 2017- Paul Ganssle <paul@ganssle.io>
2806
2806
  Copyright 2017- dateutil contributors (see AUTHORS file)
2807
2807
 
@@ -2858,12 +2858,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2858
2858
  The above BSD License Applies to all code, even that also covered by Apache 2.0.
2859
2859
 
2860
2860
  pytz
2861
- 2026.5
2861
+ 2026.6
2862
2862
  MIT License
2863
2863
  Stuart Bishop
2864
2864
  http://pythonhosted.org/pytz
2865
2865
  World timezone definitions, modern and historical
2866
- /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/pytz-2026.5.dist-info/LICENSE.txt
2866
+ /home/runner/.pyenv/versions/3.14.10/lib/python3.14/site-packages/pytz-2026.6.dist-info/LICENSE.txt
2867
2867
  Copyright (c) 2003-2019 Stuart Bishop <stuart@stuartbishop.net>
2868
2868
 
2869
2869
  Permission is hereby granted, free of charge, to any person obtaining a
@@ -2891,7 +2891,7 @@ Apache-2.0 AND CNRI-Python
2891
2891
  Matthew Barnett <regex@mrabarnett.plus.com>
2892
2892
  https://github.com/mrabarnett/mrab-regex
2893
2893
  Alternative regular expression module, to replace re.
2894
- /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/regex-2026.9.29.dist-info/licenses/LICENSE.txt
2894
+ /home/runner/.pyenv/versions/3.14.10/lib/python3.14/site-packages/regex-2026.9.29.dist-info/licenses/LICENSE.txt
2895
2895
  This work was derived from the 're' module of CPython 2.6 and CPython 3.1,
2896
2896
  copyright (c) 1998-2001 by Secret Labs AB and licensed under CNRI's Python 1.6
2897
2897
  license.
@@ -3108,7 +3108,7 @@ Apache Software License
3108
3108
  Kenneth Reitz <me@kennethreitz.org>
3109
3109
  https://github.com/psf/requests
3110
3110
  Python HTTP for Humans.
3111
- /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/requests-2.34.2.dist-info/licenses/LICENSE
3111
+ /home/runner/.pyenv/versions/3.14.10/lib/python3.14/site-packages/requests-2.34.2.dist-info/licenses/LICENSE
3112
3112
 
3113
3113
  Apache License
3114
3114
  Version 2.0, January 2004
@@ -3292,7 +3292,7 @@ MIT License
3292
3292
  Will McGugan
3293
3293
  https://github.com/Textualize/rich
3294
3294
  Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal
3295
- /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/rich-15.0.0.dist-info/licenses/LICENSE
3295
+ /home/runner/.pyenv/versions/3.14.10/lib/python3.14/site-packages/rich-15.0.0.dist-info/licenses/LICENSE
3296
3296
  Copyright (c) 2020 Will McGugan
3297
3297
 
3298
3298
  Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -3320,7 +3320,7 @@ MIT License
3320
3320
  UNKNOWN
3321
3321
  https://github.com/hplt-project/sacremoses
3322
3322
  SacreMoses
3323
- /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/sacremoses-0.2.0.dist-info/licenses/LICENSE
3323
+ /home/runner/.pyenv/versions/3.14.10/lib/python3.14/site-packages/sacremoses-0.2.0.dist-info/licenses/LICENSE
3324
3324
  MIT License
3325
3325
 
3326
3326
  Copyright (c) 2020 alvations
@@ -3350,7 +3350,7 @@ BSD License
3350
3350
  Raphaël Barrois
3351
3351
  https://github.com/rbarrois/python-semanticversion
3352
3352
  A library implementing the 'SemVer' scheme.
3353
- /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/semantic_version-2.10.0.dist-info/LICENSE
3353
+ /home/runner/.pyenv/versions/3.14.10/lib/python3.14/site-packages/semantic_version-2.10.0.dist-info/LICENSE
3354
3354
  Copyright (c) The python-semanticversion project
3355
3355
  All rights reserved.
3356
3356
 
@@ -3381,7 +3381,7 @@ MIT License
3381
3381
  Benjamin Peterson
3382
3382
  https://github.com/benjaminp/six
3383
3383
  Python 2 and 3 compatibility utilities
3384
- /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/six-1.17.0.dist-info/LICENSE
3384
+ /home/runner/.pyenv/versions/3.14.10/lib/python3.14/site-packages/six-1.17.0.dist-info/LICENSE
3385
3385
  Copyright (c) 2010-2024 Benjamin Peterson
3386
3386
 
3387
3387
  Permission is hereby granted, free of charge, to any person obtaining a copy of
@@ -3408,7 +3408,7 @@ MPL-2.0 AND MIT
3408
3408
  UNKNOWN
3409
3409
  https://tqdm.github.io
3410
3410
  Fast, Extensible Progress Meter
3411
- /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/tqdm-4.70.1.dist-info/licenses/LICENCE
3411
+ /home/runner/.pyenv/versions/3.14.10/lib/python3.14/site-packages/tqdm-4.70.1.dist-info/licenses/LICENCE
3412
3412
  `tqdm` is a product of collaborative work.
3413
3413
  Unless otherwise stated, all authors (see commit logs) retain copyright
3414
3414
  for their respective work, and release the work under the MIT licence
@@ -3466,7 +3466,7 @@ PSF-2.0
3466
3466
  "Guido van Rossum, Jukka Lehtosalo, Łukasz Langa, Michael Lee" <levkivskyi@gmail.com>
3467
3467
  https://github.com/python/typing_extensions
3468
3468
  Backported and Experimental Type Hints for Python 3.9+
3469
- /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/typing_extensions-4.16.0.dist-info/licenses/LICENSE
3469
+ /home/runner/.pyenv/versions/3.14.10/lib/python3.14/site-packages/typing_extensions-4.16.0.dist-info/licenses/LICENSE
3470
3470
  A. HISTORY OF THE SOFTWARE
3471
3471
  ==========================
3472
3472
 
@@ -3749,12 +3749,12 @@ PERFORMANCE OF THIS SOFTWARE.
3749
3749
 
3750
3750
 
3751
3751
  tzdata
3752
- 2026.5
3752
+ 2026.6
3753
3753
  Apache-2.0
3754
3754
  Python Software Foundation
3755
3755
  https://github.com/python/tzdata
3756
3756
  Provider of IANA time zone data
3757
- /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/tzdata-2026.5.dist-info/licenses/LICENSE
3757
+ /home/runner/.pyenv/versions/3.14.10/lib/python3.14/site-packages/tzdata-2026.6.dist-info/licenses/LICENSE
3758
3758
  Apache Software License 2.0
3759
3759
 
3760
3760
  Copyright (c) 2020, Paul Ganssle (Google)
@@ -3779,7 +3779,7 @@ MIT
3779
3779
  Andrey Petrov <andrey.petrov@shazow.net>
3780
3780
  https://github.com/urllib3/urllib3/blob/main/CHANGES.rst
3781
3781
  HTTP library with thread-safe connection pooling, file post, and more.
3782
- /home/runner/.pyenv/versions/3.14.9/lib/python3.14/site-packages/urllib3-2.8.0.dist-info/licenses/LICENSE.txt
3782
+ /home/runner/.pyenv/versions/3.14.10/lib/python3.14/site-packages/urllib3-2.8.0.dist-info/licenses/LICENSE.txt
3783
3783
  MIT License
3784
3784
 
3785
3785
  Copyright (c) 2008-2020 Andrey Petrov and contributors.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: howso-engine
3
- Version: 69.0.0
3
+ Version: 69.0.1
4
4
  Summary: The Howso Engine™ is a natively and fully explainable ML engine, serving as an alternative to black box AI neural networks.
5
5
  Author: Howso Incorporated
6
6
  Author-email: support@howso.com
@@ -705,7 +705,7 @@ Requires-Dist: sacremoses
705
705
  Requires-Dist: semantic-version~=2.0
706
706
  Requires-Dist: typing-extensions~=4.9
707
707
  Requires-Dist: urllib3>=2.6.3
708
- Requires-Dist: amalgam-lang==37.0.0
708
+ Requires-Dist: amalgam-lang==37.1.0
709
709
  Provides-Extra: dev
710
710
  Requires-Dist: dill~=0.0; extra == "dev"
711
711
  Requires-Dist: flake8-docstrings; extra == "dev"
@@ -1,10 +1,10 @@
1
1
  {
2
- "version": "122.0.0",
2
+ "version": "122.0.1",
3
3
  "dependencies": {
4
- "amalgam": "83.0.5"
4
+ "amalgam": "83.0.7"
5
5
  },
6
6
  "display_title": "",
7
7
  "build_date": "",
8
- "sha": "4d3b49bc12445d92a07fa2bbe64ab871ac6e9709",
9
- "url": "https://github.com/howsoai/howso-engine/releases/tag/122.0.0"
8
+ "sha": "28140dd81cafb88742c93b10fc66af7332b747a1",
9
+ "url": "https://github.com/howsoai/howso-engine/releases/tag/122.0.1"
10
10
  }
@@ -291,6 +291,10 @@ class InferFeatureAttributesAbstractData(InferFeatureAttributesBase):
291
291
  if isinstance(random_value, str):
292
292
  random_value = random_value.strip()
293
293
 
294
+ # Explicitly declared as not a date/time; skip date/time detection
295
+ if getattr(self, 'datetime_feature_formats', {}).get(feature_name) is False:
296
+ return FeatureType.STRING, {}
297
+
294
298
  max_samples = max(5, self._get_num_cases(feature_name))
295
299
  num_samples = 1
296
300
  while num_samples <= max_samples:
@@ -13,7 +13,6 @@ import platform
13
13
  from numbers import Real
14
14
  from typing import Any, cast, Literal, Self, TYPE_CHECKING
15
15
  import warnings
16
- from zoneinfo import ZoneInfo
17
16
 
18
17
  from dateutil.parser import isoparse, parse as dt_parse
19
18
  import numpy as np
@@ -1299,6 +1298,15 @@ class InferFeatureAttributesBase(ABC):
1299
1298
 
1300
1299
  typing_info = typing_info or dict()
1301
1300
 
1301
+ if (
1302
+ self.datetime_feature_formats.get(feature_name) is False
1303
+ and feature_type in (FeatureType.DATETIME, FeatureType.DATE, FeatureType.TIME)
1304
+ ):
1305
+ warnings.warn(
1306
+ f'The feature "{feature_name}" is declared as not a date/time in '
1307
+ '`datetime_feature_formats`, but its data is already formatted as '
1308
+ f'{feature_type.value} objects. This declaration will be ignored.')
1309
+
1302
1310
  # EXPLICITLY DECLARED ORDINALS
1303
1311
  if feature_name in ordinal_feature_values:
1304
1312
  if feature_name not in pre_processed_ordinals:
@@ -1620,8 +1628,11 @@ class InferFeatureAttributesBase(ABC):
1620
1628
  def _infer_string_attributes(self, feature_name: str) -> dict:
1621
1629
  """Get inferred attributes for the given string column."""
1622
1630
  # Column has arbitrary string values, first check if they
1623
- # are ISO8601 datetimes.
1624
- if self._is_iso8601_datetime_column(feature_name):
1631
+ # are ISO8601 datetimes, unless explicitly declared as not a date/time.
1632
+ if (
1633
+ self.datetime_feature_formats.get(feature_name) is not False
1634
+ and self._is_iso8601_datetime_column(feature_name)
1635
+ ):
1625
1636
  # if datetime, determine the iso8601 format it's using
1626
1637
  if first_non_null := self._get_first_non_null(feature_name):
1627
1638
  fmt = determine_iso_format(first_non_null, feature_name)
@@ -1880,16 +1891,52 @@ class InferFeatureAttributesBase(ABC):
1880
1891
  dt_format[-1] == "Z", # Last char of 'Z' is ISO8601 identifier for UTC
1881
1892
  self.default_time_zone is not None]):
1882
1893
  self.warnings_collector.triage(IFAWarningEmitterType.MISSING_TZ_FEATURES, feature_name)
1883
- elif "%z" in dt_format:
1884
- rand_val = self._get_random_value(feature_name)
1885
- if isinstance(rand_val, datetime.datetime):
1886
- # Some datetime objects might have a time zone attribute not visible as a string
1887
- if getattr(rand_val, "tzinfo", None) is not None and isinstance(rand_val.tzinfo, ZoneInfo):
1888
- continue
1889
- # Warn in case of UTC offset -- could lead to unexpected results due to time zone
1890
- # differences
1894
+ elif "%z" in dt_format and not self._has_dst_safe_time_zones(feature_name, dt_format):
1895
+ # Warn in case of nonzero UTC offsets -- could lead to unexpected results due to
1896
+ # daylight savings time
1891
1897
  self.warnings_collector.triage(IFAWarningEmitterType.UTC_OFFSET, feature_name)
1892
1898
 
1899
+ def _has_dst_safe_time_zones(self, feature_name: str, dt_format: str) -> bool:
1900
+ """
1901
+ Return whether a sample of a feature's values is unaffected by daylight savings time.
1902
+
1903
+ A value is safe when it is a datetime carrying a named time zone, or
1904
+ when its UTC offset is zero, as no daylight savings transition applies
1905
+ to UTC. A string that cannot be parsed with `dt_format` is not safe.
1906
+
1907
+ Parameters
1908
+ ----------
1909
+ feature_name : str
1910
+ The name of the feature to sample.
1911
+ dt_format : str
1912
+ The date time format of the feature's string values.
1913
+
1914
+ Returns
1915
+ -------
1916
+ bool
1917
+ True if every sampled value is safe.
1918
+ """
1919
+ # Filtering nulls out of a large column is costly, so a plain sample is
1920
+ # tried first and the filtered one only for a sparse column.
1921
+ sample = [v for v in self._get_random_value(feature_name, count=30) or [] if not pd.isna(v)]
1922
+ if not sample:
1923
+ sample = self._get_random_value(feature_name, no_nulls=True, count=30) or []
1924
+ for raw_value in sample:
1925
+ value = raw_value
1926
+ if isinstance(raw_value, str):
1927
+ try:
1928
+ value = datetime.datetime.strptime(raw_value, dt_format) # noqa: DTZ007 -- dt_format has %z
1929
+ except ValueError:
1930
+ return False
1931
+ if not isinstance(value, datetime.datetime) or value.tzinfo is None:
1932
+ return False
1933
+ # `zoneinfo` zones expose `key` and `pytz` zones expose `zone`
1934
+ if getattr(value.tzinfo, "key", None) or getattr(value.tzinfo, "zone", None):
1935
+ continue
1936
+ if value.utcoffset() != datetime.timedelta(0):
1937
+ return False
1938
+ return True
1939
+
1893
1940
  @staticmethod
1894
1941
  def _is_datetime(string: str) -> bool:
1895
1942
  """
@@ -33,7 +33,7 @@ class InferOptions(TypedDict, total=False):
33
33
  """Infer feature attributes options."""
34
34
 
35
35
  attempt_infer_extended_nominals: bool
36
- datetime_feature_formats: dict[str, str | tuple[str, str]]
36
+ datetime_feature_formats: dict[str, str | tuple[str, str] | Literal[False]]
37
37
  default_time_zone: str | None
38
38
  dependent_features: dict[str, list[str]]
39
39
  enable_suggestions: bool
@@ -131,7 +131,9 @@ def infer_feature_attributes(
131
131
  must have locales specified. If locale is omitted, the default system locale is used.
132
132
  The keys are the feature name, and the values are a tuple of date/time format and locale
133
133
  string. Time-only feature formats are expected to adhere to the format codes used in
134
- strftime().
134
+ strftime(). A value of ``False`` declares a feature as not a date/time, so date-like
135
+ strings are kept as strings rather than inferred as date, time or datetime features.
136
+ ``False`` has no effect on features whose data are already date/time objects.
135
137
 
136
138
  Examples::
137
139
 
@@ -139,6 +141,7 @@ def infer_feature_attributes(
139
141
  "start_date": ("%Y-%m-%d %A %H.%M.%S", "es_ES"),
140
142
  "end_date": "%Y-%m-%d",
141
143
  "start_time": "%H:%M:%S %p",
144
+ "version_label": False,
142
145
  }
143
146
 
144
147
  default_time_zone : str, default None
@@ -227,10 +227,13 @@ class InferFeatureAttributesDataFrame(InferFeatureAttributesBase):
227
227
  # Timestamp objects are instances of datetime.date/time, but only return 'DATE' here if
228
228
  # it's *not* a Timestamp as there may be tzinfo we should inspect.
229
229
  return FeatureType.DATE, {}
230
- # Date-only Timestamp objects in Pandas will have a default time of midnight
230
+ # Date-only Timestamp objects in Pandas will have a default time of midnight.
231
+ # Confirm that holds across the column rather than for just this one value,
232
+ # so a timed column that happens to start at midnight is not demoted to a date.
231
233
  if (isinstance(first_non_null, pd.Timestamp)
232
234
  and first_non_null.time() == datetime.time(0, 0, 0)
233
235
  and (not hasattr(dtype, "tz") or not dtype.tz)
236
+ and self._is_datetime_date_only(feature_name)
234
237
  ):
235
238
  return FeatureType.DATE, {}
236
239
  # Datetime feature (with timezone info)
@@ -238,6 +241,11 @@ class InferFeatureAttributesDataFrame(InferFeatureAttributesBase):
238
241
  # If using a named time zone capture it, otherwise
239
242
  # rely on the offset in the iso8601 format
240
243
  tz_name = getattr(dtype.tz, 'key', None) or getattr(dtype.tz, 'zone', None)
244
+ if tz_name is None and dtype.tz is datetime.timezone.utc:
245
+ # Stdlib UTC exposes neither `key` nor `zone` the way
246
+ # `zoneinfo` and `pytz` zones do, but it is still a
247
+ # named zone, unlike fixed offsets.
248
+ tz_name = 'UTC'
241
249
  if tz_name:
242
250
  typing_info['timezone'] = tz_name
243
251
  # Datetime feature with no timezone info
@@ -263,6 +271,9 @@ class InferFeatureAttributesDataFrame(InferFeatureAttributesBase):
263
271
  # DataFrames may use 'object' dtype for strings, detect
264
272
  # string columns by checking the type of the data
265
273
  if isinstance(first_non_null, str):
274
+ # Explicitly declared as not a date/time; skip date/time detection
275
+ if getattr(self, 'datetime_feature_formats', {}).get(feature_name) is False:
276
+ return FeatureType.STRING, {}
266
277
  max_samples = max(5, self._get_num_cases(feature_name))
267
278
  num_samples = 1
268
279
  while num_samples <= max_samples:
@@ -355,6 +366,27 @@ class InferFeatureAttributesDataFrame(InferFeatureAttributesBase):
355
366
  except Exception: # noqa: Deliberately broad
356
367
  return False
357
368
 
369
+ def _is_datetime_date_only(self, feature_name: str, max_rows: int = 1000) -> bool:
370
+ """
371
+ Return whether every sampled value of a datetime feature falls at midnight.
372
+
373
+ A date-only column in a datetime dtype carries a midnight time
374
+ component on every row.
375
+ """
376
+ column = self.data[feature_name]
377
+ seen = 0
378
+ for start in range(0, len(column), max_rows):
379
+ chunk = column.iloc[start:start + max_rows].dropna()
380
+ if chunk.empty:
381
+ continue
382
+ if (chunk != chunk.dt.normalize()).any():
383
+ return False
384
+ seen += len(chunk)
385
+ if seen >= max_rows:
386
+ break
387
+ # No non-null values observed: nothing indicates a time component.
388
+ return True
389
+
358
390
  def _get_first_non_null(self, feature_name: str) -> t.Any | None:
359
391
  index = self.data[feature_name].first_valid_index()
360
392
  if index is None:
@@ -180,7 +180,8 @@ def _infer_delta_min_max_from_chunk( # noqa: C901
180
180
  if isinstance(dt_format, Collection) and not isinstance(dt_format, str) and len(dt_format) == 2:
181
181
  dt_format, _ = dt_format
182
182
 
183
- if dt_format is not None:
183
+ # `False` declares the feature as not a date/time
184
+ if dt_format is not None and dt_format is not False:
184
185
  datetime_columns[f_name] = dt_format
185
186
 
186
187
  # Batch convert datetime columns
@@ -426,13 +427,16 @@ class InferFeatureAttributesTimeSeries(ABC):
426
427
  features are assumed to be in ISO8601 format. Non-English datetimes
427
428
  must have locales specified. If locale is omitted, the default
428
429
  system locale is used. The keys are the feature name, and the values
429
- are a tuple of date time format and locale string:
430
+ are a tuple of date time format and locale string. A value of ``False``
431
+ declares a feature as not a date/time, so date-like strings are kept as
432
+ strings; the time feature cannot be declared this way:
430
433
 
431
434
  Examples::
432
435
 
433
436
  {
434
437
  "start_date" : ("%Y-%m-%d %A %H.%M.%S", "es_ES"),
435
- "end_date" : "%Y-%m-%d"
438
+ "end_date" : "%Y-%m-%d",
439
+ "version_label" : False
436
440
  }
437
441
 
438
442
  default_time_zone : str, default None
@@ -790,6 +794,10 @@ class InferFeatureAttributesTimeSeries(ABC):
790
794
  if self.time_feature_name in time_invariant_features:
791
795
  raise ValueError("time_feature_name cannot be in the time_invariant_features list.")
792
796
 
797
+ if datetime_feature_formats and datetime_feature_formats.get(self.time_feature_name) is False:
798
+ raise ValueError("time_feature_name cannot be declared as not a date/time in "
799
+ "`datetime_feature_formats`.")
800
+
793
801
  # ID features are time-invariant.
794
802
  for id_feature in id_feature_names:
795
803
  if id_feature not in time_invariant_features:
@@ -1202,7 +1210,8 @@ class IFATimeSeriesADC(InferFeatureAttributesTimeSeries):
1202
1210
  if isinstance(dt_format, Collection) and not isinstance(dt_format, str) and len(dt_format) == 2:
1203
1211
  dt_format, _ = dt_format
1204
1212
 
1205
- if dt_format is not None:
1213
+ # `False` declares the feature as not a date/time
1214
+ if dt_format is not None and dt_format is not False:
1206
1215
  spark_format = _python_to_java_datetime_format(dt_format)
1207
1216
  spark_df = spark_df.withColumn(
1208
1217
  f"{f_name}_epoch", F.unix_timestamp(F.col(f_name), spark_format).cast("double")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: howso-engine
3
- Version: 69.0.0
3
+ Version: 69.0.1
4
4
  Summary: The Howso Engine™ is a natively and fully explainable ML engine, serving as an alternative to black box AI neural networks.
5
5
  Author: Howso Incorporated
6
6
  Author-email: support@howso.com
@@ -705,7 +705,7 @@ Requires-Dist: sacremoses
705
705
  Requires-Dist: semantic-version~=2.0
706
706
  Requires-Dist: typing-extensions~=4.9
707
707
  Requires-Dist: urllib3>=2.6.3
708
- Requires-Dist: amalgam-lang==37.0.0
708
+ Requires-Dist: amalgam-lang==37.1.0
709
709
  Provides-Extra: dev
710
710
  Requires-Dist: dill~=0.0; extra == "dev"
711
711
  Requires-Dist: flake8-docstrings; extra == "dev"
@@ -14,7 +14,7 @@ sacremoses
14
14
  semantic-version~=2.0
15
15
  typing-extensions~=4.9
16
16
  urllib3>=2.6.3
17
- amalgam-lang==37.0.0
17
+ amalgam-lang==37.1.0
18
18
 
19
19
  [dev]
20
20
  dill~=0.0
@@ -48,7 +48,7 @@ dependencies = [
48
48
  "semantic-version~=2.0",
49
49
  "typing-extensions~=4.9",
50
50
  "urllib3>=2.6.3",
51
- "amalgam-lang==37.0.0", # Use exact since Engine is exact in version.json
51
+ "amalgam-lang==37.1.0", # Use exact since Engine is exact in version.json
52
52
  ]
53
53
 
54
54
  [project.optional-dependencies]