dycw-utilities 0.109.21__py3-none-any.whl → 0.109.22__py3-none-any.whl
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.
- {dycw_utilities-0.109.21.dist-info → dycw_utilities-0.109.22.dist-info}/METADATA +3 -3
- {dycw_utilities-0.109.21.dist-info → dycw_utilities-0.109.22.dist-info}/RECORD +7 -7
- utilities/__init__.py +1 -1
- utilities/polars.py +31 -0
- utilities/statsmodels.py +34 -1
- {dycw_utilities-0.109.21.dist-info → dycw_utilities-0.109.22.dist-info}/WHEEL +0 -0
- {dycw_utilities-0.109.21.dist-info → dycw_utilities-0.109.22.dist-info}/licenses/LICENSE +0 -0
@@ -1,12 +1,12 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: dycw-utilities
|
3
|
-
Version: 0.109.
|
3
|
+
Version: 0.109.22
|
4
4
|
Author-email: Derek Wan <d.wan@icloud.com>
|
5
5
|
License-File: LICENSE
|
6
6
|
Requires-Python: >=3.12
|
7
7
|
Requires-Dist: typing-extensions<4.14,>=4.13.1
|
8
8
|
Provides-Extra: test
|
9
|
-
Requires-Dist: hypothesis<6.132,>=6.131.
|
9
|
+
Requires-Dist: hypothesis<6.132,>=6.131.9; extra == 'test'
|
10
10
|
Requires-Dist: pytest-asyncio<0.27,>=0.26.0; extra == 'test'
|
11
11
|
Requires-Dist: pytest-cov<6.2,>=6.1.1; extra == 'test'
|
12
12
|
Requires-Dist: pytest-instafail<0.6,>=0.5.0; extra == 'test'
|
@@ -80,7 +80,7 @@ Provides-Extra: zzz-test-hypothesis
|
|
80
80
|
Requires-Dist: aiosqlite<0.22,>=0.21.0; extra == 'zzz-test-hypothesis'
|
81
81
|
Requires-Dist: asyncpg<0.31,>=0.30.0; extra == 'zzz-test-hypothesis'
|
82
82
|
Requires-Dist: greenlet<3.3,>=3.2.0; extra == 'zzz-test-hypothesis'
|
83
|
-
Requires-Dist: hypothesis<6.132,>=6.131.
|
83
|
+
Requires-Dist: hypothesis<6.132,>=6.131.9; extra == 'zzz-test-hypothesis'
|
84
84
|
Requires-Dist: luigi<3.7,>=3.6.0; extra == 'zzz-test-hypothesis'
|
85
85
|
Requires-Dist: numpy<2.3,>=2.2.5; extra == 'zzz-test-hypothesis'
|
86
86
|
Requires-Dist: pathvalidate<3.3,>=3.2.3; extra == 'zzz-test-hypothesis'
|
@@ -1,4 +1,4 @@
|
|
1
|
-
utilities/__init__.py,sha256=
|
1
|
+
utilities/__init__.py,sha256=8f1PKZxzDeABQ7A4zZsmHKuHRkJKy1jboB_m42AXKxw,61
|
2
2
|
utilities/altair.py,sha256=Gpja-flOo-Db0PIPJLJsgzAlXWoKUjPU1qY-DQ829ek,9156
|
3
3
|
utilities/astor.py,sha256=xuDUkjq0-b6fhtwjhbnebzbqQZAjMSHR1IIS5uOodVg,777
|
4
4
|
utilities/asyncio.py,sha256=41oQUurWMvadFK5gFnaG21hMM0Vmfn2WS6OpC0R9mas,14757
|
@@ -46,7 +46,7 @@ utilities/pathlib.py,sha256=31WPMXdLIyXgYOMMl_HOI2wlo66MGSE-cgeelk-Lias,1410
|
|
46
46
|
utilities/period.py,sha256=ikHXsWtDLr553cfH6p9mMaiCnIAP69B7q84ckWV3HaA,10884
|
47
47
|
utilities/pickle.py,sha256=Bhvd7cZl-zQKQDFjUerqGuSKlHvnW1K2QXeU5UZibtg,657
|
48
48
|
utilities/platform.py,sha256=NU7ycTvAXAG-fdYmDXaM1m4EOml2cGiaYwaUzfzSqyU,1767
|
49
|
-
utilities/polars.py,sha256=
|
49
|
+
utilities/polars.py,sha256=pFUEkCzHh01M84fm4upFc4UKrUFMKz6WeWYvAlFLAPw,58009
|
50
50
|
utilities/polars_ols.py,sha256=efhXf0gjrHUpQrvS6a7g8yJQJWf_ATKtJnqqF2inCOU,5680
|
51
51
|
utilities/pqdm.py,sha256=foRytQybmOQ05pjt5LF7ANyzrIa--4ScDE3T2wd31a4,3118
|
52
52
|
utilities/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -68,7 +68,7 @@ utilities/slack_sdk.py,sha256=SeDNMh24IPiEBWoGMdgvrflUaFa9TGlTS03H9-NKaQw,4132
|
|
68
68
|
utilities/socket.py,sha256=K77vfREvzoVTrpYKo6MZakol0EYu2q1sWJnnZqL0So0,118
|
69
69
|
utilities/sqlalchemy.py,sha256=GWzp54TP3F2mGhxPTn0c56KxxDeN9VKLMagcRSELhf4,35453
|
70
70
|
utilities/sqlalchemy_polars.py,sha256=oGyMX5gSxuLI3N8mtz_-ml3UdWKcZuj6aFRW6ifI0Kc,15617
|
71
|
-
utilities/statsmodels.py,sha256=
|
71
|
+
utilities/statsmodels.py,sha256=koyiBHvpMcSiBfh99wFUfSggLNx7cuAw3rwyfAhoKpQ,3410
|
72
72
|
utilities/streamlit.py,sha256=U9PJBaKP1IdSykKhPZhIzSPTZsmLsnwbEPZWzNhJPKk,2955
|
73
73
|
utilities/sys.py,sha256=h0Xr7Vj86wNalvwJVP1wj5Y0kD_VWm1vzuXZ_jw94mE,2743
|
74
74
|
utilities/tempfile.py,sha256=VqmZJAhTJ1OaVywFzk5eqROV8iJbW9XQ_QYAV0bpdRo,1384
|
@@ -87,7 +87,7 @@ utilities/warnings.py,sha256=yUgjnmkCRf6QhdyAXzl7u0qQFejhQG3PrjoSwxpbHrs,1819
|
|
87
87
|
utilities/whenever.py,sha256=TjoTAJ1R27-rKXiXzdE4GzPidmYqm0W58XydDXp-QZM,17786
|
88
88
|
utilities/zipfile.py,sha256=24lQc9ATcJxHXBPc_tBDiJk48pWyRrlxO2fIsFxU0A8,699
|
89
89
|
utilities/zoneinfo.py,sha256=-DQz5a0Ikw9jfSZtL0BEQkXOMC9yGn_xiJYNCLMiqEc,1989
|
90
|
-
dycw_utilities-0.109.
|
91
|
-
dycw_utilities-0.109.
|
92
|
-
dycw_utilities-0.109.
|
93
|
-
dycw_utilities-0.109.
|
90
|
+
dycw_utilities-0.109.22.dist-info/METADATA,sha256=Q17jtIGlAaCIIt5pD-cHWOB9Uvq8i9yRQtNP0q8NmLI,13005
|
91
|
+
dycw_utilities-0.109.22.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
92
|
+
dycw_utilities-0.109.22.dist-info/licenses/LICENSE,sha256=gppZp16M6nSVpBbUBrNL6JuYfvKwZiKgV7XoKKsHzqo,1066
|
93
|
+
dycw_utilities-0.109.22.dist-info/RECORD,,
|
utilities/__init__.py
CHANGED
utilities/polars.py
CHANGED
@@ -140,6 +140,32 @@ DatetimeUSEastern = Datetime(time_zone="US/Eastern")
|
|
140
140
|
DatetimeUTC = Datetime(time_zone="UTC")
|
141
141
|
_FINITE_EWM_MIN_WEIGHT = 0.9999
|
142
142
|
|
143
|
+
##
|
144
|
+
|
145
|
+
|
146
|
+
def ac_halflife(
|
147
|
+
series: Series,
|
148
|
+
/,
|
149
|
+
*,
|
150
|
+
adjusted: bool = False,
|
151
|
+
fft: bool = True,
|
152
|
+
bartlett_confint: bool = True,
|
153
|
+
missing: ACFMissing = "none",
|
154
|
+
step: float = 0.01,
|
155
|
+
) -> float:
|
156
|
+
"""Compute the autocorrelation halflife."""
|
157
|
+
import utilities.statsmodels
|
158
|
+
|
159
|
+
array = series.to_numpy()
|
160
|
+
return utilities.statsmodels.ac_halflife(
|
161
|
+
array,
|
162
|
+
adjusted=adjusted,
|
163
|
+
fft=fft,
|
164
|
+
bartlett_confint=bartlett_confint,
|
165
|
+
missing=missing,
|
166
|
+
step=step,
|
167
|
+
)
|
168
|
+
|
143
169
|
|
144
170
|
##
|
145
171
|
|
@@ -223,6 +249,11 @@ def _acf_process_qstats_pvalues(qstats: NDArrayF, pvalues: NDArrayF, /) -> DataF
|
|
223
249
|
##
|
224
250
|
|
225
251
|
|
252
|
+
# def acf_halflife(series: Series,/)
|
253
|
+
|
254
|
+
##
|
255
|
+
|
256
|
+
|
226
257
|
def adjust_frequencies(
|
227
258
|
series: Series,
|
228
259
|
/,
|
utilities/statsmodels.py
CHANGED
@@ -2,12 +2,45 @@ from __future__ import annotations
|
|
2
2
|
|
3
3
|
from typing import TYPE_CHECKING, Any, Literal, cast, overload
|
4
4
|
|
5
|
+
import numpy as np
|
5
6
|
import statsmodels.tsa.stattools
|
7
|
+
from numpy import arange, argmax, interp, nan
|
8
|
+
|
9
|
+
from utilities.numpy import shift
|
6
10
|
|
7
11
|
if TYPE_CHECKING:
|
8
12
|
from utilities.numpy import NDArrayF
|
9
13
|
|
10
14
|
|
15
|
+
def ac_halflife(
|
16
|
+
array: NDArrayF,
|
17
|
+
/,
|
18
|
+
*,
|
19
|
+
adjusted: bool = False,
|
20
|
+
fft: bool = True,
|
21
|
+
bartlett_confint: bool = True,
|
22
|
+
missing: ACFMissing = "none",
|
23
|
+
step: float = 0.01,
|
24
|
+
) -> float:
|
25
|
+
"""Compute the autocorrelation halflife."""
|
26
|
+
(n,) = array.shape
|
27
|
+
acfs = acf(
|
28
|
+
array,
|
29
|
+
adjusted=adjusted,
|
30
|
+
nlags=n,
|
31
|
+
fft=fft,
|
32
|
+
bartlett_confint=bartlett_confint,
|
33
|
+
missing=missing,
|
34
|
+
)
|
35
|
+
lags = arange(0, n, step=step)
|
36
|
+
interp_acfs = interp(lags, arange(n), acfs)
|
37
|
+
is_half = (shift(interp_acfs) > 0.5) & (interp_acfs <= 0.5)
|
38
|
+
return lags[argmax(is_half)].item() if np.any(is_half) else nan
|
39
|
+
|
40
|
+
|
41
|
+
##
|
42
|
+
|
43
|
+
|
11
44
|
type ACFMissing = Literal["none", "raise", "conservative", "drop"]
|
12
45
|
|
13
46
|
|
@@ -114,4 +147,4 @@ def acf(
|
|
114
147
|
)
|
115
148
|
|
116
149
|
|
117
|
-
__all__ = ["ACFMissing", "acf"]
|
150
|
+
__all__ = ["ACFMissing", "ac_halflife", "acf"]
|
File without changes
|
File without changes
|