dycw-utilities 0.153.2__py3-none-any.whl → 0.153.4__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dycw-utilities
3
- Version: 0.153.2
3
+ Version: 0.153.4
4
4
  Author-email: Derek Wan <d.wan@icloud.com>
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -1,4 +1,4 @@
1
- utilities/__init__.py,sha256=BOz9C-obZ9rIhyLSCVDsOVjnOeSdkl-YhkX0PSDH0-A,60
1
+ utilities/__init__.py,sha256=BnvK6zqFzFO7qJ6fHdUA5-tJskYIpnc-PyYTQx-U3jo,60
2
2
  utilities/altair.py,sha256=92E2lCdyHY4Zb-vCw6rEJIsWdKipuu-Tu2ab1ufUfAk,9079
3
3
  utilities/asyncio.py,sha256=QXkTtugXkqtYt7Do23zgYErqzdp6jwzPpV_SP9fJ1gI,16780
4
4
  utilities/atomicwrites.py,sha256=tPo6r-Rypd9u99u66B9z86YBPpnLrlHtwox_8Z7T34Y,5790
@@ -45,7 +45,7 @@ utilities/parse.py,sha256=JcJn5yXKhIWXBCwgBdPsyu7Hvcuw6kyEdqvaebCaI9k,17951
45
45
  utilities/pathlib.py,sha256=qGuU8XPmdgGpy8tOMUgelfXx3kxI8h9IaV3TI_06QGE,8428
46
46
  utilities/pickle.py,sha256=MBT2xZCsv0pH868IXLGKnlcqNx2IRVKYNpRcqiQQqxw,653
47
47
  utilities/platform.py,sha256=pTn7gw6N4T6LdKrf0virwarof_mze9WtoQlrGMzhGVI,2798
48
- utilities/polars.py,sha256=uxV4liIQoCO92aERDO-AMfa8Es_-xCKgwZoyTO3PazQ,74410
48
+ utilities/polars.py,sha256=jNUs038dJMZ0-r3rmHFClIzHlx3naA9klgYBvRDJi9w,77738
49
49
  utilities/polars_ols.py,sha256=Uc9V5kvlWZ5cU93lKZ-cfAKdVFFw81tqwLW9PxtUvMs,5618
50
50
  utilities/postgres.py,sha256=70BPcb_Na0LqDXJfqu0JwkHkGrwyuKpIVooSm6NlRn8,12467
51
51
  utilities/pottery.py,sha256=HJ96oLRarTP37Vhg0WTyB3yAu2hETeg6HgRmpDIqyUs,6581
@@ -87,8 +87,8 @@ utilities/zoneinfo.py,sha256=FBMcUQ4662Aq8SsuCL1OAhDQiyANmVjtb-C30DRrWoE,1966
87
87
  utilities/pytest_plugins/__init__.py,sha256=U4S_2y3zgLZVfMenHRaJFBW8yqh2mUBuI291LGQVOJ8,35
88
88
  utilities/pytest_plugins/pytest_randomly.py,sha256=B1qYVlExGOxTywq2r1SMi5o7btHLk2PNdY_b1p98dkE,409
89
89
  utilities/pytest_plugins/pytest_regressions.py,sha256=9v8kAXDM2ycIXJBimoiF4EgrwbUvxTycFWJiGR_GHhM,1466
90
- dycw_utilities-0.153.2.dist-info/METADATA,sha256=ZoTBo07vfu7uVKDOazdKRsN6QUwefZDYSLO15V1AAD4,1696
91
- dycw_utilities-0.153.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
92
- dycw_utilities-0.153.2.dist-info/entry_points.txt,sha256=BOD_SoDxwsfJYOLxhrSXhHP_T7iw-HXI9f2WVkzYxvQ,135
93
- dycw_utilities-0.153.2.dist-info/licenses/LICENSE,sha256=gppZp16M6nSVpBbUBrNL6JuYfvKwZiKgV7XoKKsHzqo,1066
94
- dycw_utilities-0.153.2.dist-info/RECORD,,
90
+ dycw_utilities-0.153.4.dist-info/METADATA,sha256=WLaEHDFvWCO7WFzRO4QPALUhD0yW9XUGz5Lx9x77BBM,1696
91
+ dycw_utilities-0.153.4.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
92
+ dycw_utilities-0.153.4.dist-info/entry_points.txt,sha256=BOD_SoDxwsfJYOLxhrSXhHP_T7iw-HXI9f2WVkzYxvQ,135
93
+ dycw_utilities-0.153.4.dist-info/licenses/LICENSE,sha256=gppZp16M6nSVpBbUBrNL6JuYfvKwZiKgV7XoKKsHzqo,1066
94
+ dycw_utilities-0.153.4.dist-info/RECORD,,
utilities/__init__.py CHANGED
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.153.2"
3
+ __version__ = "0.153.4"
utilities/polars.py CHANGED
@@ -33,6 +33,7 @@ from polars import (
33
33
  any_horizontal,
34
34
  col,
35
35
  concat,
36
+ datetime_range,
36
37
  int_range,
37
38
  lit,
38
39
  struct,
@@ -49,6 +50,7 @@ from polars.exceptions import (
49
50
  )
50
51
  from polars.schema import Schema
51
52
  from polars.testing import assert_frame_equal, assert_series_equal
53
+ from whenever import ZonedDateTime
52
54
 
53
55
  from utilities.dataclasses import _YieldFieldsInstance, yield_fields
54
56
  from utilities.errors import ImpossibleCaseError
@@ -122,6 +124,7 @@ if TYPE_CHECKING:
122
124
 
123
125
 
124
126
  type ExprLike = MaybeStr[Expr]
127
+ type ExprOrSeries = Expr | Series
125
128
  DatetimeHongKong = Datetime(time_zone="Asia/Hong_Kong")
126
129
  DatetimeTokyo = Datetime(time_zone="Asia/Tokyo")
127
130
  DatetimeUSCentral = Datetime(time_zone="US/Central")
@@ -129,6 +132,7 @@ DatetimeUSEastern = Datetime(time_zone="US/Eastern")
129
132
  DatetimeUTC = Datetime(time_zone="UTC")
130
133
  _FINITE_EWM_MIN_WEIGHT = 0.9999
131
134
 
135
+
132
136
  ##
133
137
 
134
138
 
@@ -238,11 +242,6 @@ def _acf_process_qstats_pvalues(qstats: NDArrayF, pvalues: NDArrayF, /) -> DataF
238
242
  ##
239
243
 
240
244
 
241
- # def acf_halflife(series: Series,/)
242
-
243
- ##
244
-
245
-
246
245
  def adjust_frequencies(
247
246
  series: Series,
248
247
  /,
@@ -264,6 +263,37 @@ def adjust_frequencies(
264
263
  ##
265
264
 
266
265
 
266
+ def all_dataframe_columns(
267
+ df: DataFrame, expr: IntoExprColumn, /, *exprs: IntoExprColumn
268
+ ) -> Series:
269
+ """Return a DataFrame column with `AND` applied to additional exprs/series."""
270
+ name = get_expr_name(df, expr)
271
+ return df.select(all_horizontal(expr, *exprs).alias(name))[name]
272
+
273
+
274
+ def any_dataframe_columns(
275
+ df: DataFrame, expr: IntoExprColumn, /, *exprs: IntoExprColumn
276
+ ) -> Series:
277
+ """Return a DataFrame column with `OR` applied to additional exprs/series."""
278
+ name = get_expr_name(df, expr)
279
+ return df.select(any_horizontal(expr, *exprs).alias(name))[name]
280
+
281
+
282
+ def all_series(series: Series, /, *columns: ExprOrSeries) -> Series:
283
+ """Return a Series with `AND` applied to additional exprs/series."""
284
+ return all_dataframe_columns(series.to_frame(), series.name, *columns)
285
+
286
+
287
+ def any_series(series: Series, /, *columns: ExprOrSeries) -> Series:
288
+ """Return a Series with `OR` applied to additional exprs/series."""
289
+ df = series.to_frame()
290
+ name = series.name
291
+ return df.select(any_horizontal(name, *columns).alias(name))[name]
292
+
293
+
294
+ ##
295
+
296
+
267
297
  def append_dataclass(df: DataFrame, obj: Dataclass, /) -> DataFrame:
268
298
  """Append a dataclass object to a DataFrame."""
269
299
  non_null_fields = {k: v for k, v in asdict(obj).items() if v is not None}
@@ -427,8 +457,8 @@ def ceil_datetime(column: ExprLike, every: ExprLike, /) -> Expr: ...
427
457
  @overload
428
458
  def ceil_datetime(column: Series, every: ExprLike, /) -> Series: ...
429
459
  @overload
430
- def ceil_datetime(column: IntoExprColumn, every: ExprLike, /) -> Expr | Series: ...
431
- def ceil_datetime(column: IntoExprColumn, every: ExprLike, /) -> Expr | Series:
460
+ def ceil_datetime(column: IntoExprColumn, every: ExprLike, /) -> ExprOrSeries: ...
461
+ def ceil_datetime(column: IntoExprColumn, every: ExprLike, /) -> ExprOrSeries:
432
462
  """Compute the `ceil` of a datetime column."""
433
463
  column = ensure_expr_or_series(column)
434
464
  rounded = column.dt.round(every)
@@ -849,13 +879,13 @@ def cross(
849
879
  up_or_down: Literal["up", "down"],
850
880
  other: Number | IntoExprColumn,
851
881
  /,
852
- ) -> Expr | Series: ...
882
+ ) -> ExprOrSeries: ...
853
883
  def cross(
854
884
  expr: IntoExprColumn,
855
885
  up_or_down: Literal["up", "down"],
856
886
  other: Number | IntoExprColumn,
857
887
  /,
858
- ) -> Expr | Series:
888
+ ) -> ExprOrSeries:
859
889
  """Compute when a cross occurs."""
860
890
  return _cross_or_touch(expr, "cross", up_or_down, other)
861
891
 
@@ -874,13 +904,13 @@ def touch(
874
904
  up_or_down: Literal["up", "down"],
875
905
  other: Number | IntoExprColumn,
876
906
  /,
877
- ) -> Expr | Series: ...
907
+ ) -> ExprOrSeries: ...
878
908
  def touch(
879
909
  expr: IntoExprColumn,
880
910
  up_or_down: Literal["up", "down"],
881
911
  other: Number | IntoExprColumn,
882
912
  /,
883
- ) -> Expr | Series:
913
+ ) -> ExprOrSeries:
884
914
  """Compute when a touch occurs."""
885
915
  return _cross_or_touch(expr, "touch", up_or_down, other)
886
916
 
@@ -891,7 +921,7 @@ def _cross_or_touch(
891
921
  up_or_down: Literal["up", "down"],
892
922
  other: Number | IntoExprColumn,
893
923
  /,
894
- ) -> Expr | Series:
924
+ ) -> ExprOrSeries:
895
925
  """Compute when a column crosses/touches a threshold."""
896
926
  expr = ensure_expr_or_series(expr)
897
927
  match other:
@@ -963,7 +993,7 @@ def cross_rolling_quantile(
963
993
  weights: list[float] | None = None,
964
994
  min_samples: int | None = None,
965
995
  center: bool = False,
966
- ) -> Expr | Series: ...
996
+ ) -> ExprOrSeries: ...
967
997
  def cross_rolling_quantile(
968
998
  expr: IntoExprColumn,
969
999
  up_or_down: Literal["up", "down"],
@@ -975,7 +1005,7 @@ def cross_rolling_quantile(
975
1005
  weights: list[float] | None = None,
976
1006
  min_samples: int | None = None,
977
1007
  center: bool = False,
978
- ) -> Expr | Series:
1008
+ ) -> ExprOrSeries:
979
1009
  """Compute when a column crosses its rolling quantile."""
980
1010
  expr = ensure_expr_or_series(expr)
981
1011
  rolling = expr.rolling_quantile(
@@ -1180,8 +1210,8 @@ def ensure_expr_or_series(column: ExprLike, /) -> Expr: ...
1180
1210
  @overload
1181
1211
  def ensure_expr_or_series(column: Series, /) -> Series: ...
1182
1212
  @overload
1183
- def ensure_expr_or_series(column: IntoExprColumn, /) -> Expr | Series: ...
1184
- def ensure_expr_or_series(column: IntoExprColumn, /) -> Expr | Series:
1213
+ def ensure_expr_or_series(column: IntoExprColumn, /) -> ExprOrSeries: ...
1214
+ def ensure_expr_or_series(column: IntoExprColumn, /) -> ExprOrSeries:
1185
1215
  """Ensure a column expression or Series is returned."""
1186
1216
  return col(column) if isinstance(column, str) else column
1187
1217
 
@@ -1191,7 +1221,7 @@ def ensure_expr_or_series(column: IntoExprColumn, /) -> Expr | Series:
1191
1221
 
1192
1222
  def ensure_expr_or_series_many(
1193
1223
  *columns: IntoExprColumn, **named_columns: IntoExprColumn
1194
- ) -> Sequence[Expr | Series]:
1224
+ ) -> Sequence[ExprOrSeries]:
1195
1225
  """Ensure a set of column expressions and/or Series are returned."""
1196
1226
  args = map(ensure_expr_or_series, columns)
1197
1227
  kwargs = (ensure_expr_or_series(v).alias(k) for k, v in named_columns.items())
@@ -1233,7 +1263,7 @@ def finite_ewm_mean(
1233
1263
  half_life: float | None = None,
1234
1264
  alpha: float | None = None,
1235
1265
  min_weight: float = _FINITE_EWM_MIN_WEIGHT,
1236
- ) -> Expr | Series: ...
1266
+ ) -> ExprOrSeries: ...
1237
1267
  def finite_ewm_mean(
1238
1268
  column: IntoExprColumn,
1239
1269
  /,
@@ -1243,7 +1273,7 @@ def finite_ewm_mean(
1243
1273
  half_life: float | None = None,
1244
1274
  alpha: float | None = None,
1245
1275
  min_weight: float = _FINITE_EWM_MIN_WEIGHT,
1246
- ) -> Expr | Series:
1276
+ ) -> ExprOrSeries:
1247
1277
  """Compute a finite EWMA."""
1248
1278
  try:
1249
1279
  weights = _finite_ewm_weights(
@@ -1309,8 +1339,8 @@ def floor_datetime(column: ExprLike, every: ExprLike, /) -> Expr: ...
1309
1339
  @overload
1310
1340
  def floor_datetime(column: Series, every: ExprLike, /) -> Series: ...
1311
1341
  @overload
1312
- def floor_datetime(column: IntoExprColumn, every: ExprLike, /) -> Expr | Series: ...
1313
- def floor_datetime(column: IntoExprColumn, every: ExprLike, /) -> Expr | Series:
1342
+ def floor_datetime(column: IntoExprColumn, every: ExprLike, /) -> ExprOrSeries: ...
1343
+ def floor_datetime(column: IntoExprColumn, every: ExprLike, /) -> ExprOrSeries:
1314
1344
  """Compute the `floor` of a datetime column."""
1315
1345
  column = ensure_expr_or_series(column)
1316
1346
  rounded = column.dt.round(every)
@@ -1476,8 +1506,8 @@ def increasing_horizontal(*columns: ExprLike) -> Expr: ...
1476
1506
  @overload
1477
1507
  def increasing_horizontal(*columns: Series) -> Series: ...
1478
1508
  @overload
1479
- def increasing_horizontal(*columns: IntoExprColumn) -> Expr | Series: ...
1480
- def increasing_horizontal(*columns: IntoExprColumn) -> Expr | Series:
1509
+ def increasing_horizontal(*columns: IntoExprColumn) -> ExprOrSeries: ...
1510
+ def increasing_horizontal(*columns: IntoExprColumn) -> ExprOrSeries:
1481
1511
  """Check if a set of columns are increasing."""
1482
1512
  columns2 = ensure_expr_or_series_many(*columns)
1483
1513
  if len(columns2) == 0:
@@ -1490,8 +1520,8 @@ def decreasing_horizontal(*columns: ExprLike) -> Expr: ...
1490
1520
  @overload
1491
1521
  def decreasing_horizontal(*columns: Series) -> Series: ...
1492
1522
  @overload
1493
- def decreasing_horizontal(*columns: IntoExprColumn) -> Expr | Series: ...
1494
- def decreasing_horizontal(*columns: IntoExprColumn) -> Expr | Series:
1523
+ def decreasing_horizontal(*columns: IntoExprColumn) -> ExprOrSeries: ...
1524
+ def decreasing_horizontal(*columns: IntoExprColumn) -> ExprOrSeries:
1495
1525
  """Check if a set of columns are decreasing."""
1496
1526
  columns2 = ensure_expr_or_series_many(*columns)
1497
1527
  if len(columns2) == 0:
@@ -1650,13 +1680,13 @@ def is_near_event(
1650
1680
  before: int = 0,
1651
1681
  after: int = 0,
1652
1682
  **named_exprs: IntoExprColumn,
1653
- ) -> Expr | Series: ...
1683
+ ) -> ExprOrSeries: ...
1654
1684
  def is_near_event(
1655
1685
  *exprs: IntoExprColumn,
1656
1686
  before: int = 0,
1657
1687
  after: int = 0,
1658
1688
  **named_exprs: IntoExprColumn,
1659
- ) -> Expr | Series:
1689
+ ) -> ExprOrSeries:
1660
1690
  """Compute the rows near any event."""
1661
1691
  if before <= -1:
1662
1692
  raise _IsNearEventBeforeError(before=before)
@@ -2021,6 +2051,19 @@ def normal(
2021
2051
  ##
2022
2052
 
2023
2053
 
2054
+ def offset_datetime(
2055
+ datetime: ZonedDateTime, offset: str, /, *, n: int = 1
2056
+ ) -> ZonedDateTime:
2057
+ """Offset a datetime as `polars` would."""
2058
+ sr = Series(values=[datetime.py_datetime()])
2059
+ for _ in range(n):
2060
+ sr = sr.dt.offset_by(offset)
2061
+ return ZonedDateTime.from_py_datetime(sr.item())
2062
+
2063
+
2064
+ ##
2065
+
2066
+
2024
2067
  @overload
2025
2068
  def order_of_magnitude(column: ExprLike, /, *, round_: bool = False) -> Expr: ...
2026
2069
  @overload
@@ -2028,10 +2071,10 @@ def order_of_magnitude(column: Series, /, *, round_: bool = False) -> Series: ..
2028
2071
  @overload
2029
2072
  def order_of_magnitude(
2030
2073
  column: IntoExprColumn, /, *, round_: bool = False
2031
- ) -> Expr | Series: ...
2074
+ ) -> ExprOrSeries: ...
2032
2075
  def order_of_magnitude(
2033
2076
  column: IntoExprColumn, /, *, round_: bool = False
2034
- ) -> Expr | Series:
2077
+ ) -> ExprOrSeries:
2035
2078
  """Compute the order of magnitude of a column."""
2036
2079
  column = ensure_expr_or_series(column)
2037
2080
  result = column.abs().log10()
@@ -2041,6 +2084,75 @@ def order_of_magnitude(
2041
2084
  ##
2042
2085
 
2043
2086
 
2087
+ @overload
2088
+ def period_range(
2089
+ start: ZonedDateTime,
2090
+ end_or_length: ZonedDateTime | int,
2091
+ /,
2092
+ *,
2093
+ interval: str = "1d",
2094
+ time_unit: TimeUnit | None = None,
2095
+ time_zone: TimeZoneLike | None = None,
2096
+ eager: Literal[True],
2097
+ ) -> Series: ...
2098
+ @overload
2099
+ def period_range(
2100
+ start: ZonedDateTime,
2101
+ end_or_length: ZonedDateTime | int,
2102
+ /,
2103
+ *,
2104
+ interval: str = "1d",
2105
+ time_unit: TimeUnit | None = None,
2106
+ time_zone: TimeZoneLike | None = None,
2107
+ eager: Literal[False] = False,
2108
+ ) -> Expr: ...
2109
+ @overload
2110
+ def period_range(
2111
+ start: ZonedDateTime,
2112
+ end_or_length: ZonedDateTime | int,
2113
+ /,
2114
+ *,
2115
+ interval: str = "1d",
2116
+ time_unit: TimeUnit | None = None,
2117
+ time_zone: TimeZoneLike | None = None,
2118
+ eager: bool = False,
2119
+ ) -> Series | Expr: ...
2120
+ def period_range(
2121
+ start: ZonedDateTime,
2122
+ end_or_length: ZonedDateTime | int,
2123
+ /,
2124
+ *,
2125
+ interval: str = "1d",
2126
+ time_unit: TimeUnit | None = None,
2127
+ time_zone: TimeZoneLike | None = None,
2128
+ eager: bool = False,
2129
+ ) -> Series | Expr:
2130
+ """Construct a period range."""
2131
+ time_zone_use = None if time_zone is None else ensure_time_zone(time_zone).key
2132
+ match end_or_length:
2133
+ case ZonedDateTime() as end:
2134
+ ...
2135
+ case int() as length:
2136
+ end = offset_datetime(start, interval, n=length)
2137
+ case never:
2138
+ assert_never(never)
2139
+ starts = datetime_range(
2140
+ start.py_datetime(),
2141
+ end.py_datetime(),
2142
+ interval,
2143
+ closed="left",
2144
+ time_unit=time_unit,
2145
+ time_zone=time_zone_use,
2146
+ eager=eager,
2147
+ ).alias("start")
2148
+ ends = (starts.dt.offset_by(interval)).alias("end")
2149
+ period = struct(starts, ends)
2150
+ return try_reify_expr(period, starts, ends)
2151
+
2152
+
2153
+ ##
2154
+
2155
+
2044
2156
  def reify_exprs(
2045
2157
  *exprs: IntoExprColumn, **named_exprs: IntoExprColumn
2046
2158
  ) -> Expr | Series | DataFrame:
@@ -2363,7 +2475,7 @@ class _StructFromDataClassTypeError(StructFromDataClassError):
2363
2475
 
2364
2476
  def try_reify_expr(
2365
2477
  expr: IntoExprColumn, /, *exprs: IntoExprColumn, **named_exprs: IntoExprColumn
2366
- ) -> Expr | Series:
2478
+ ) -> ExprOrSeries:
2367
2479
  """Try reify an expression."""
2368
2480
  expr = ensure_expr_or_series(expr)
2369
2481
  all_exprs = ensure_expr_or_series_many(*exprs, **named_exprs)
@@ -2430,8 +2542,8 @@ def week_num(column: ExprLike, /, *, start: WeekDay = "mon") -> Expr: ...
2430
2542
  @overload
2431
2543
  def week_num(column: Series, /, *, start: WeekDay = "mon") -> Series: ...
2432
2544
  @overload
2433
- def week_num(column: IntoExprColumn, /, *, start: WeekDay = "mon") -> Expr | Series: ...
2434
- def week_num(column: IntoExprColumn, /, *, start: WeekDay = "mon") -> Expr | Series:
2545
+ def week_num(column: IntoExprColumn, /, *, start: WeekDay = "mon") -> ExprOrSeries: ...
2546
+ def week_num(column: IntoExprColumn, /, *, start: WeekDay = "mon") -> ExprOrSeries:
2435
2547
  """Compute the week number of a date column."""
2436
2548
  column = ensure_expr_or_series(column)
2437
2549
  epoch = column.dt.epoch(time_unit="d").alias("epoch")
@@ -2477,6 +2589,7 @@ __all__ = [
2477
2589
  "DatetimeUSEastern",
2478
2590
  "DatetimeUTC",
2479
2591
  "DropNullStructSeriesError",
2592
+ "ExprOrSeries",
2480
2593
  "FiniteEWMMeanError",
2481
2594
  "GetDataTypeOrSeriesTimeZoneError",
2482
2595
  "GetSeriesNumberOfDecimalsError",
@@ -2489,6 +2602,10 @@ __all__ = [
2489
2602
  "StructFromDataClassError",
2490
2603
  "acf",
2491
2604
  "adjust_frequencies",
2605
+ "all_dataframe_columns",
2606
+ "all_series",
2607
+ "any_dataframe_columns",
2608
+ "any_series",
2492
2609
  "append_dataclass",
2493
2610
  "are_frames_equal",
2494
2611
  "bernoulli",
@@ -2529,7 +2646,9 @@ __all__ = [
2529
2646
  "nan_sum_agg",
2530
2647
  "nan_sum_cols",
2531
2648
  "normal",
2649
+ "offset_datetime",
2532
2650
  "order_of_magnitude",
2651
+ "period_range",
2533
2652
  "read_dataframe",
2534
2653
  "read_series",
2535
2654
  "replace_time_zone",