Skip to content

Commit

Permalink
v1.0.0 (#53)
Browse files Browse the repository at this point in the history
- v1.0.0
- Fixes #52 using Mike
  • Loading branch information
FBruzzesi committed Nov 26, 2023
1 parent fdf5820 commit d9241a1
Show file tree
Hide file tree
Showing 8 changed files with 61 additions and 56 deletions.
5 changes: 4 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,12 @@ docs-serve:
mkdocs serve

docs-deploy:
mkdocs gh-deploy
mike set-default --push --update-aliases $(shell grep -m 1 version pyproject.toml | tr -s ' ' | tr -d '"' | tr -d "'" | cut -d' ' -f3) latest

pypi-push:
rm -rf dist
hatch build
hatch publish

get-version :
@echo $(shell grep -m 1 version pyproject.toml | tr -s ' ' | tr -d '"' | tr -d "'" | cut -d' ' -f3)
18 changes: 9 additions & 9 deletions docs/user-guide/dataframe-modules.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ is_isoweekdate_series(s_iso + "abc") # False

On the other hand the extensions[^1] approach extends the `pandas.Series` and `polars.Series`/`polars.Expr` classes with new methods.

The extensions are available through the `isoweek` namespace, and the methods available are the same as the functions.
The extensions are available through the `iwd` (isoweekdate) namespace, and the methods available are the same as the functions.

"Translating" the previous examples to extensions:

Expand All @@ -71,20 +71,20 @@ import pandas as pd
from iso_week_date.pandas_utils import SeriesIsoWeek # noqa: F401 (1)

s_date = pd.Series(pd.date_range(date(2023, 1, 1), date(2023, 1, 10), freq="1d"))
s_date.isoweek.datetime_to_isoweek(offset=pd.Timedelta(days=1)).to_list()
s_date.iwd.datetime_to_isoweek(offset=pd.Timedelta(days=1)).to_list()
# ['2022-W52', '2022-W52', '2023-W01',..., '2023-W01', '2023-W02']

s_iso = pd.Series(["2022-W52", "2023-W01", "2023-W02"])
s_iso.isoweek.isoweek_to_datetime(offset=pd.Timedelta(days=1))
s_iso.iwd.isoweek_to_datetime(offset=pd.Timedelta(days=1))
'''
0 2022-12-27
1 2023-01-03
2 2023-01-10
dtype: datetime64[ns]
'''

s_iso.isoweek.is_isoweek(s_iso) # True
s_iso.isoweek.is_isoweek(s_iso + "abc") # False
s_iso.iwd.is_isoweek(s_iso) # True
s_iso.iwd.is_isoweek(s_iso + "abc") # False
```

1. The import of `SeriesIsoWeek` is needed to register the extensions.
Expand All @@ -96,20 +96,20 @@ import polars as pl
from iso_week_date.polars_utils import SeriesIsoWeek # noqa: F401 (1)

s_date = pl.date_range(date(2023, 1, 1), date(2023, 1, 10), interval="1d")
s_date.isoweek.datetime_to_isoweekdate(offset=timedelta(days=1)).to_list()
s_date.iwd.datetime_to_isoweekdate(offset=timedelta(days=1)).to_list()
# ['2022-W52-6', '2022-W52-7', '2023-W01-1',..., '2023-W01-7', '2023-W02-1']

s_iso = pl.Series(["2022-W52-1", "2023-W01-2", "2023-W02-7"])
s_iso.isoweek.isoweekdate_to_datetime(offset=timedelta(days=1))
s_iso.iwd.isoweekdate_to_datetime(offset=timedelta(days=1))
'''
date
2022-12-27
2023-01-04
2023-01-16
'''

s_iso.isoweek.is_isoweekdate() # True
(s_iso + "abc").isoweek.is_isoweekdate_series() # False
s_iso.iwd.is_isoweekdate() # True
(s_iso + "abc").iwd.is_isoweekdate_series() # False
```

1. The import of `SeriesIsoWeek` is needed to register the extensions.
Expand Down
16 changes: 8 additions & 8 deletions iso_week_date/pandas_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,7 @@ def is_isoweekdate_series(series: pd.Series) -> bool:
return _match_series(series, ISOWEEKDATE_PATTERN.pattern)


@pd.api.extensions.register_series_accessor("isoweek")
@pd.api.extensions.register_series_accessor("iwd")
class SeriesIsoWeek:
"""Pandas Series extension that provides methods for working with ISO weeks and dates.
Expand All @@ -320,7 +320,7 @@ class SeriesIsoWeek:
from iso_week_date.pandas_utils import SeriesIsoWeek # noqa: F401
s = pd.Series(pd.date_range(date(2023, 1, 1), date(2023, 1, 10), freq="1d"))
s.isoweek.datetime_to_isoweek(offset=pd.Timedelta(days=1)).to_list()
s.iwd.datetime_to_isoweek(offset=pd.Timedelta(days=1)).to_list()
# ['2022-W52', '2022-W52', '2023-W01',..., '2023-W01', '2023-W02']
```
Parameters:
Expand Down Expand Up @@ -353,7 +353,7 @@ def datetime_to_isoweek(self: Self, offset: Union[pd.Timedelta, int] = pd.Timede
from iso_week_date.pandas_utils import SeriesIsoWeek # noqa: F401
s = pd.Series(pd.date_range(date(2023, 1, 1), date(2023, 1, 10), freq="1d"))
s.isoweek.datetime_to_isoweek(offset=pd.Timedelta(days=1)).to_list()
s.iwd.datetime_to_isoweek(offset=pd.Timedelta(days=1)).to_list()
# ['2022-W52', '2022-W52', '2023-W01',..., '2023-W01', '2023-W02']
```
"""
Expand All @@ -379,7 +379,7 @@ def datetime_to_isoweekdate(self: Self, offset: Union[pd.Timedelta, int] = pd.Ti
from iso_week_date.pandas_utils import SeriesIsoWeek # noqa: F401
s = pd.Series(pd.date_range(date(2023, 1, 1), date(2023, 1, 10), freq="1d"))
s.isoweek.datetime_to_isoweekdate(offset=pd.Timedelta(days=1)).to_list()
s.iwd.datetime_to_isoweekdate(offset=pd.Timedelta(days=1)).to_list()
# ['2022-W52-6', '2022-W52-7', '2023-W01-1',..., '2023-W01-7', '2023-W02-1']
```
"""
Expand Down Expand Up @@ -413,7 +413,7 @@ def isoweek_to_datetime(
from iso_week_date.pandas_utils import SeriesIsoWeek # noqa: F401
s = pd.Series(["2022-W52", "2023-W01", "2023-W02"])
s.isoweek.isoweek_to_datetime(offset=pd.Timedelta(days=1))
s.iwd.isoweek_to_datetime(offset=pd.Timedelta(days=1))
'''
0 2022-12-27
1 2023-01-03
Expand Down Expand Up @@ -446,7 +446,7 @@ def isoweekdate_to_datetime(self: Self, offset: Union[pd.Timedelta, int] = pd.Ti
from iso_week_date.pandas_utils import SeriesIsoWeek # noqa: F401
s = pd.Series(["2022-W52-1", "2023-W01-1", "2023-W02-1"])
s.isoweek.isoweekdate_to_datetime(offset=pd.Timedelta(days=1))
s.iwd.isoweekdate_to_datetime(offset=pd.Timedelta(days=1))
'''
0 2022-12-27
1 2023-01-03
Expand All @@ -469,7 +469,7 @@ def is_isoweek(self: Self) -> bool:
from iso_week_date.pandas_utils import SeriesIsoWeek # noqa: F401
s = pd.Series(["2022-W52", "2023-W01", "2023-W02"])
s.isoweek.is_isoweek() # True
s.iwd.is_isoweek() # True
```
"""
return is_isoweek_series(self._series)
Expand All @@ -486,7 +486,7 @@ def is_isoweekdate(self: Self) -> bool:
from iso_week_date.pandas_utils import SeriesIsoWeek # noqa: F401
s = pd.Series(["2022-W52-1", "2023-W01-1", "2023-W02-1"])
s.isoweek.is_isoweekdate() # True
s.iwd.is_isoweekdate() # True
```
"""
return is_isoweekdate_series(self._series)
24 changes: 12 additions & 12 deletions iso_week_date/polars_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -312,8 +312,8 @@ def is_isoweekdate_series(series: T) -> bool:
return _match_series(series, ISOWEEKDATE_PATTERN.pattern)


@pl.api.register_series_namespace("isoweek")
@pl.api.register_expr_namespace("isoweek")
@pl.api.register_series_namespace("iwd")
@pl.api.register_expr_namespace("iwd")
class SeriesIsoWeek(Generic[T]):
"""Polars Series and Expr extension that provides methods for working with ISO weeks and dates.
Expand All @@ -329,10 +329,10 @@ class SeriesIsoWeek(Generic[T]):
from iso_week_date.polars_utils import SeriesIsoWeek # noqa: F401
s = pl.date_range(date(2023, 1, 1), date(2023, 1, 10), interval="1d")
s.isoweek.datetime_to_isoweek(offset=timedelta(days=1))
s.iwd.datetime_to_isoweek(offset=timedelta(days=1))
df = pl.DataFrame({"date": s})
df.select(pl.col("date").isoweek.datetime_to_isoweek(offset=1))
df.select(pl.col("date").iwd.datetime_to_isoweek(offset=1))
```
Parameters:
series: The pandas Series object the extension is attached to.
Expand Down Expand Up @@ -366,10 +366,10 @@ def datetime_to_isoweek(self: Self, offset: Union[timedelta, int] = timedelta(0)
from iso_week_date.polars_utils import SeriesIsoWeek # noqa: F401
s = pl.date_range(date(2023, 1, 1), date(2023, 1, 10), interval="1d")
s.isoweek.datetime_to_isoweek(offset=timedelta(days=1))
s.iwd.datetime_to_isoweek(offset=timedelta(days=1))
df = pl.DataFrame({"date": s})
df.select(pl.col("date").isoweek.datetime_to_isoweek(offset=1))
df.select(pl.col("date").iwd.datetime_to_isoweek(offset=1))
```
"""
return datetime_to_isoweek(self._series, offset=offset)
Expand All @@ -396,10 +396,10 @@ def datetime_to_isoweekdate(self: Self, offset: Union[timedelta, int] = timedelt
from iso_week_date.polars_utils import SeriesIsoWeek # noqa: F401
s = pl.date_range(date(2023, 1, 1), date(2023, 1, 10), interval="1d")
s.isoweek.datetime_to_isoweekdate(offset=timedelta(days=1))
s.iwd.datetime_to_isoweekdate(offset=timedelta(days=1))
df = pl.DataFrame({"date": s})
df.select(pl.col("date").isoweek.datetime_to_isoweekdate(offset=1))
df.select(pl.col("date").iwd.datetime_to_isoweekdate(offset=1))
```
"""
return datetime_to_isoweekdate(self._series, offset=offset)
Expand Down Expand Up @@ -432,7 +432,7 @@ def isoweek_to_datetime(self: Self, offset: Union[timedelta, int] = timedelta(0)
from iso_week_date.polars_utils import SeriesIsoWeek # noqa: F401
s = pl.Series(["2022-W52", "2023-W01", "2023-W02"])
s.isoweek.isoweek_to_datetime(offset=timedelta(days=1))
s.iwd.isoweek_to_datetime(offset=timedelta(days=1))
'''
date
2022-12-27
Expand Down Expand Up @@ -467,7 +467,7 @@ def isoweekdate_to_datetime(self: Self, offset: Union[timedelta, int] = timedelt
from iso_week_date.polars_utils import SeriesIsoWeek # noqa: F401
s = pl.Series(["2022-W52-7", "2023-W01-1", "2023-W02-1"])
s.isoweek.isoweekdate_to_datetime(offset=timedelta(days=1))
s.iwd.isoweekdate_to_datetime(offset=timedelta(days=1))
'''
date
2022-01-02
Expand All @@ -490,7 +490,7 @@ def is_isoweek(self: Self) -> bool:
from iso_week_date.polars_utils import SeriesIsoWeek # noqa: F401
s = pl.Series(["2022-W52", "2023-W01", "2023-W02"])
s.isoweek.is_isoweek() # True
s.iwd.is_isoweek() # True
```
"""
return is_isoweek_series(self._series)
Expand All @@ -507,7 +507,7 @@ def is_isoweekdate(self: Self) -> bool:
from iso_week_date.polars_utils import SeriesIsoWeek # noqa: F401
s = pl.Series(["2022-W52-1", "2023-W01-1", "2023-W02-1"])
s.isoweek.is_isoweekdate() # True
s.iwd.is_isoweekdate() # True
```
"""
return is_isoweekdate_series(self._series)
7 changes: 6 additions & 1 deletion mkdocs.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -66,13 +66,18 @@ theme:

# Plugins
plugins:
- mkdocstrings
- autorefs
- mike:
alias_type: symlink
canonical_version: latest
- mkdocstrings
- search:
separator: '[\s\-,:!=\[\]()"`/]+|\.(?!\d)|&[lg]t;|(?!\b)(?=[A-Z][a-z])'

# Customization
extra:
version:
provider: mike
social:
- icon: fontawesome/brands/github
link: https://github.com/fbruzzesi
Expand Down
3 changes: 2 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "hatchling.build"

[project]
name = "iso-week-date"
version = "0.3.0"
version = "1.0.0"
description = "Toolkit to work with str representing ISO Week date format"

license = {file = "LICENSE"}
Expand Down Expand Up @@ -56,6 +56,7 @@ docs = [
"mkdocs-material>=9.2.0",
"mkdocstrings[python]>=0.20.0",
"mkdocs-autorefs",
"mike==2.0.0"
]

test = [
Expand Down
20 changes: 9 additions & 11 deletions tests/pandas_utils_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,22 +31,20 @@ def test_datetime_to(periods: int, offset: int):
# datetime_to_(format, isoweek)
to_isoweek_g = _datetime_to_format(dt_series, offset=offset, _format=ISOWEEK__DATE_FORMAT) # from generic function
to_isoweek_f = datetime_to_isoweek(dt_series, offset=offset) # from function
to_isoweek_m = dt_series.isoweek.datetime_to_isoweek(offset=offset) # from method extension
to_isoweek_m = dt_series.iwd.datetime_to_isoweek(offset=offset) # from method extension

assert_series_equal(to_isoweek_g, to_isoweek_f)
assert_series_equal(to_isoweek_g, to_isoweek_m)

assert all([is_isoweek_series(to_isoweek_g), is_isoweek_series(to_isoweek_f), is_isoweek_series(to_isoweek_m)])
assert all(
[to_isoweek_g.isoweek.is_isoweek(), to_isoweek_f.isoweek.is_isoweek(), to_isoweek_m.isoweek.is_isoweek()]
)
assert all([to_isoweek_g.iwd.is_isoweek(), to_isoweek_f.iwd.is_isoweek(), to_isoweek_m.iwd.is_isoweek()])

# datetime_to_(format, isoweekdate)
to_isoweekdate_g = _datetime_to_format(
dt_series, offset=offset, _format=ISOWEEKDATE__DATE_FORMAT
) # from generic function
to_isoweekdate_f = datetime_to_isoweekdate(dt_series, offset=offset) # from function
to_isoweekdate_m = dt_series.isoweek.datetime_to_isoweekdate(offset=offset) # from method extension
to_isoweekdate_m = dt_series.iwd.datetime_to_isoweekdate(offset=offset) # from method extension

assert_series_equal(to_isoweekdate_g, to_isoweekdate_f)
assert_series_equal(to_isoweekdate_g, to_isoweekdate_m)
Expand All @@ -60,9 +58,9 @@ def test_datetime_to(periods: int, offset: int):
)
assert all(
[
to_isoweekdate_g.isoweek.is_isoweekdate(),
to_isoweekdate_f.isoweek.is_isoweekdate(),
to_isoweekdate_m.isoweek.is_isoweekdate(),
to_isoweekdate_g.iwd.is_isoweekdate(),
to_isoweekdate_f.iwd.is_isoweekdate(),
to_isoweekdate_m.iwd.is_isoweekdate(),
]
)

Expand Down Expand Up @@ -119,10 +117,10 @@ class CustomWeek(IsoWeek):
iso_series = pd.Series(CustomWeek.from_date(_start - timedelta(weeks=1)).weeksout(periods))

dt_series_f = isoweek_to_datetime(iso_series, offset=offset, weekday=weekday)
dt_series_m = iso_series.isoweek.isoweek_to_datetime(offset=offset, weekday=weekday)
dt_series_m = iso_series.iwd.isoweek_to_datetime(offset=offset, weekday=weekday)
assert all([is_datetime(dt_series_f), is_datetime(dt_series_m)])

assert_series_equal(dt_series_f.isoweek.datetime_to_isoweek(offset=offset), iso_series)
assert_series_equal(dt_series_f.iwd.datetime_to_isoweek(offset=offset), iso_series)


@pytest.mark.parametrize("periods", [5, 10, 52])
Expand All @@ -140,7 +138,7 @@ class CustomWeekDate(IsoWeekDate):
iso_series = pd.Series(CustomWeekDate.from_date(_start - timedelta(days=1)).daysout(periods))

dt_series_f = isoweekdate_to_datetime(iso_series, offset=offset)
dt_series_m = iso_series.isoweek.isoweekdate_to_datetime(offset=offset)
dt_series_m = iso_series.iwd.isoweekdate_to_datetime(offset=offset)
assert all([is_datetime(dt_series_f), is_datetime(dt_series_m)])

assert_series_equal(datetime_to_isoweekdate(dt_series_f, offset=offset), iso_series)
Expand Down
24 changes: 11 additions & 13 deletions tests/polars_utils_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,21 +30,19 @@ def test_datetime_to_isoweek(periods, offset):
# datetime_to_(format, isoweek)
to_isoweek_g = _datetime_to_format(dt_series, offset=offset, _format=ISOWEEK__DATE_FORMAT) # from generic function
to_isoweek_f = datetime_to_isoweek(dt_series, offset=offset) # from function
to_isoweek_m = dt_series.isoweek.datetime_to_isoweek(offset=offset) # from method extension
to_isoweek_m = dt_series.iwd.datetime_to_isoweek(offset=offset) # from method extension

assert_series_equal(to_isoweek_g, to_isoweek_f)
assert_series_equal(to_isoweek_g, to_isoweek_m)

assert all([is_isoweek_series(to_isoweek_g), is_isoweek_series(to_isoweek_f), is_isoweek_series(to_isoweek_m)])
assert all(
[to_isoweek_g.isoweek.is_isoweek(), to_isoweek_f.isoweek.is_isoweek(), to_isoweek_m.isoweek.is_isoweek()]
)
assert all([to_isoweek_g.iwd.is_isoweek(), to_isoweek_f.iwd.is_isoweek(), to_isoweek_m.iwd.is_isoweek()])
# datetime_to_(format, isoweekdate)
to_isoweekdate_g = _datetime_to_format(
dt_series, offset=offset, _format=ISOWEEKDATE__DATE_FORMAT
) # from generic function
to_isoweekdate_f = datetime_to_isoweekdate(dt_series, offset=offset) # from function
to_isoweekdate_m = dt_series.isoweek.datetime_to_isoweekdate(offset=offset) # from method extension
to_isoweekdate_m = dt_series.iwd.datetime_to_isoweekdate(offset=offset) # from method extension

assert_series_equal(to_isoweekdate_g, to_isoweekdate_f)
assert_series_equal(to_isoweekdate_g, to_isoweekdate_m)
Expand All @@ -58,9 +56,9 @@ def test_datetime_to_isoweek(periods, offset):
)
assert all(
[
to_isoweekdate_g.isoweek.is_isoweekdate(),
to_isoweekdate_f.isoweek.is_isoweekdate(),
to_isoweekdate_m.isoweek.is_isoweekdate(),
to_isoweekdate_g.iwd.is_isoweekdate(),
to_isoweekdate_f.iwd.is_isoweekdate(),
to_isoweekdate_m.iwd.is_isoweekdate(),
]
)

Expand Down Expand Up @@ -115,10 +113,10 @@ class CustomWeek(IsoWeek):
iso_series = pl.Series(CustomWeek.from_date(_start - timedelta(weeks=1)).weeksout(periods))

dt_series_f = isoweek_to_datetime(iso_series, offset=offset, weekday=weekday)
dt_series_m = iso_series.isoweek.isoweek_to_datetime(offset=offset, weekday=weekday)
dt_series_m = iso_series.iwd.isoweek_to_datetime(offset=offset, weekday=weekday)

assert_series_equal(dt_series_f.isoweek.datetime_to_isoweek(offset=offset), iso_series, check_names=False)
assert_series_equal(dt_series_m.isoweek.datetime_to_isoweek(offset=offset), iso_series, check_names=False)
assert_series_equal(dt_series_f.iwd.datetime_to_isoweek(offset=offset), iso_series, check_names=False)
assert_series_equal(dt_series_m.iwd.datetime_to_isoweek(offset=offset), iso_series, check_names=False)


@pytest.mark.parametrize("periods", [5, 10, 52])
Expand All @@ -136,10 +134,10 @@ class CustomWeekDate(IsoWeekDate):
iso_series = pl.Series(CustomWeekDate.from_date(_start - timedelta(days=1)).daysout(periods))

dt_series_f = isoweekdate_to_datetime(iso_series, offset=offset)
dt_series_m = iso_series.isoweek.isoweekdate_to_datetime(offset=offset)
dt_series_m = iso_series.iwd.isoweekdate_to_datetime(offset=offset)

assert_series_equal(datetime_to_isoweekdate(dt_series_f, offset=offset), iso_series, check_names=False)
assert_series_equal(dt_series_m.isoweek.datetime_to_isoweekdate(offset=offset), iso_series, check_names=False)
assert_series_equal(dt_series_m.iwd.datetime_to_isoweekdate(offset=offset), iso_series, check_names=False)


@pytest.mark.parametrize(
Expand Down

0 comments on commit d9241a1

Please sign in to comment.