Skip to content

Commit 1e4123f

Browse files
committed
Rename SeriesUniverseMapping to PolarsUniverseMapping
improve a line in an e2e test, add coverage config and reformat pyproject.toml fix some type hints
1 parent 15246fb commit 1e4123f

File tree

14 files changed

+121
-118
lines changed

14 files changed

+121
-118
lines changed

pyproject.toml

Lines changed: 47 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -6,71 +6,75 @@ readme = "README.md"
66
requires-python = ">=3.13"
77
authors = [{ name = "jathoms", email = "[email protected]" }]
88
dependencies = [
9-
"altair>=5.5.0",
10-
"croniter>=6.0.0",
11-
"numpy>=2.3.2",
12-
"polars>=1.32.3",
13-
"python-dateutil>=2.9.0.post0",
14-
"vegafusion>=2.0.3",
15-
"vl-convert-python>=1.8.0",
9+
"altair>=5.5.0",
10+
"croniter>=6.0.0",
11+
"numpy>=2.3.2",
12+
"polars>=1.32.3",
13+
"python-dateutil>=2.9.0.post0",
14+
"vegafusion>=2.0.3",
15+
"vl-convert-python>=1.8.0",
1616
]
1717

1818
[dependency-groups]
1919
dev = [
20-
"jupyter>=1.1.1",
21-
"pyarrow>=21.0.0",
22-
"lxml>=6.0.0",
23-
"pandas>=2.3.1",
24-
"ruff>=0.12.8",
25-
"ty>=0.0.1a17",
26-
"yfinance>=0.2.65",
27-
"mypy>=1.17.1",
28-
"pyright>=1.1.404",
29-
"pyrefly>=0.29.2",
30-
"pandas-stubs>=2.3.3.251201",
31-
"types-python-dateutil>=2.9.0.20251115",
32-
"types-croniter>=6.0.0.20250809",
33-
"pytest>=8.3.0",
34-
"pytest-cov>=5.0.0",
35-
"pre-commit>=3.6.0",
20+
"jupyter>=1.1.1",
21+
"lxml>=6.0.0",
22+
"mypy>=1.17.1",
23+
"pandas>=2.3.1",
24+
"pandas-stubs>=2.3.3.251201",
25+
"pre-commit>=3.6.0",
26+
"pyarrow>=21.0.0",
27+
"pyrefly>=0.29.2",
28+
"pyright>=1.1.404",
29+
"pytest>=8.3.0",
30+
"pytest-cov>=5.0.0",
31+
"ruff>=0.12.8",
32+
"ty>=0.0.1a17",
33+
"types-croniter>=6.0.0.20250809",
34+
"types-python-dateutil>=2.9.0.20251115",
35+
"yfinance>=0.2.65",
3636
]
3737
docs = [
38-
"pydata-sphinx-theme>=0.16.1",
39-
"sphinx>=8.2.3",
38+
"pydata-sphinx-theme>=0.16.1",
39+
"sphinx>=8.2.3",
4040
]
4141

4242
[build-system]
4343
requires = ["hatchling"]
4444
build-backend = "hatchling.build"
4545

46-
[tool.ty.src]
47-
include = ["src"]
48-
exclude = ["src/backtest_lib/examples/*"]
46+
[tool.coverage.run]
47+
source = ["backtest_lib"]
48+
branch = true
49+
50+
[tool.pyrefly]
51+
project-includes = ["**/*"]
52+
project-excludes = [
53+
"**/node_modules",
54+
"**/__pycache__",
55+
"**/*venv*/**",
56+
"**/*.ipynb",
57+
"src/backtest_lib/examples/*",
58+
]
4959

5060
[tool.ruff]
5161
line-length = 88
5262

5363
[tool.ruff.lint]
5464
exclude = ["src/backtest_lib/examples/*"]
5565
select = [
56-
"E",
57-
"F",
58-
"UP",
59-
"B",
60-
"SIM",
61-
"I",
66+
"E",
67+
"F",
68+
"UP",
69+
"B",
70+
"SIM",
71+
"I",
6272
]
6373
ignore = ["EM101"]
6474

6575
[tool.ruff.format]
6676
docstring-code-format = true
6777

68-
[tool.pyrefly]
69-
project-includes = ["**/*"]
70-
project-excludes = [
71-
"**/node_modules",
72-
"**/__pycache__",
73-
"**/*venv*/**",
74-
"**/*.ipynb",
75-
"src/backtest_lib/examples/*",
76-
]
78+
[tool.ty.src]
79+
include = ["src"]
80+
exclude = ["src/backtest_lib/examples/*"]

src/backtest_lib/examples/ewma.ipynb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@
8686
"import polars as pl\n",
8787
"\n",
8888
"from backtest_lib.backtest import Backtest\n",
89-
"from backtest_lib.market.polars_impl import SeriesUniverseMapping\n",
89+
"from backtest_lib.market.polars_impl import PolarsUniverseMapping\n",
9090
"from backtest_lib.portfolio import uniform_portfolio\n",
9191
"\n",
9292
"universe = tuple(past_cost_prices.by_security.as_df(show_periods=False).columns)\n",

src/backtest_lib/examples/full_sp500_test.ipynb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
"from backtest_lib.backtest import Backtest\n",
1616
"from backtest_lib.examples.get_sp500_historical import get_sp500_market_view\n",
1717
"from backtest_lib.market import MarketView\n",
18-
"from backtest_lib.market.polars_impl import PolarsPastView, SeriesUniverseMapping\n",
18+
"from backtest_lib.market.polars_impl import PolarsPastView, PolarsUniverseMapping\n",
1919
"from backtest_lib.portfolio import WeightedPortfolio\n",
2020
"\n",
2121
"logging.basicConfig(\n",

src/backtest_lib/examples/ordering_tests.ipynb

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
"metadata": {},
88
"outputs": [],
99
"source": [
10-
"from backtest_lib.market.polars_impl import SeriesUniverseMapping\n",
10+
"from backtest_lib.market.polars_impl import PolarsUniverseMapping\n",
1111
"\n",
12-
"vec1 = SeriesUniverseMapping.from_vectors([\"a\", \"b\", \"c\"], [1, 2, 3])\n",
13-
"vec2 = SeriesUniverseMapping.from_vectors([\"a\", \"b\", \"c\"], [1, 2, 3])\n",
12+
"vec1 = PolarsUniverseMapping.from_vectors([\"a\", \"b\", \"c\"], [1, 2, 3])\n",
13+
"vec2 = PolarsUniverseMapping.from_vectors([\"a\", \"b\", \"c\"], [1, 2, 3])\n",
1414
"vec1 + vec2"
1515
]
1616
},
@@ -21,7 +21,7 @@
2121
"metadata": {},
2222
"outputs": [],
2323
"source": [
24-
"vec3 = SeriesUniverseMapping.from_vectors([\"a\", \"c\", \"b\"], [0, 0, 1])\n",
24+
"vec3 = PolarsUniverseMapping.from_vectors([\"a\", \"c\", \"b\"], [0, 0, 1])\n",
2525
"res = vec1 + vec3\n",
2626
"print(res)\n",
2727
"assert dict(res) == {\"a\": 1, \"b\": 3, \"c\": 3}"
@@ -35,7 +35,7 @@
3535
"outputs": [],
3636
"source": [
3737
"try:\n",
38-
" vec4 = SeriesUniverseMapping.from_vectors([\"a\", \"c\", \"d\"], [0, 0, 1])\n",
38+
" vec4 = PolarsUniverseMapping.from_vectors([\"a\", \"c\", \"d\"], [0, 0, 1])\n",
3939
" vec1 + vec4\n",
4040
" assert False\n",
4141
"except:\n",
@@ -49,7 +49,7 @@
4949
"metadata": {},
5050
"outputs": [],
5151
"source": [
52-
"vec5 = SeriesUniverseMapping.from_vectors([\"a\", \"b\"], [0, 1])\n",
52+
"vec5 = PolarsUniverseMapping.from_vectors([\"a\", \"b\"], [0, 1])\n",
5353
"res = vec1 + vec5\n",
5454
"print(res)\n",
5555
"assert dict(res) == {\"a\": 1, \"b\": 3, \"c\": 3}"
@@ -62,7 +62,7 @@
6262
"metadata": {},
6363
"outputs": [],
6464
"source": [
65-
"vec6 = SeriesUniverseMapping.from_vectors([\"a\", \"b\"], [2, 2])\n",
65+
"vec6 = PolarsUniverseMapping.from_vectors([\"a\", \"b\"], [2, 2])\n",
6666
"res = vec1 * vec6\n",
6767
"print(res)\n",
6868
"\n",
@@ -77,7 +77,7 @@
7777
"metadata": {},
7878
"outputs": [],
7979
"source": [
80-
"vec7 = SeriesUniverseMapping.from_vectors([\"a\", \"c\"], [2, 2])\n",
80+
"vec7 = PolarsUniverseMapping.from_vectors([\"a\", \"c\"], [2, 2])\n",
8181
"res = vec1 / vec7\n",
8282
"print(res)\n",
8383
"\n",
@@ -95,9 +95,9 @@
9595
"source": [
9696
"from time import perf_counter\n",
9797
"\n",
98-
"acc = SeriesUniverseMapping.from_vectors([\"a\", \"b\", \"c\"], [1, 1, 1])\n",
99-
"one = SeriesUniverseMapping.from_vectors([\"a\", \"b\", \"c\"], [1, 1, 1])\n",
100-
"one_diff_order = SeriesUniverseMapping.from_vectors([\"c\", \"a\", \"b\"], [1, 1, 1])\n",
98+
"acc = PolarsUniverseMapping.from_vectors([\"a\", \"b\", \"c\"], [1, 1, 1])\n",
99+
"one = PolarsUniverseMapping.from_vectors([\"a\", \"b\", \"c\"], [1, 1, 1])\n",
100+
"one_diff_order = PolarsUniverseMapping.from_vectors([\"c\", \"a\", \"b\"], [1, 1, 1])\n",
101101
"\n",
102102
"\n",
103103
"# Same order allows for simple vectorised ops\n",
@@ -129,9 +129,9 @@
129129
"values = [1] * 1000\n",
130130
"\n",
131131
"print(keys)\n",
132-
"long_acc = SeriesUniverseMapping.from_vectors(keys, values)\n",
133-
"long_ones = SeriesUniverseMapping.from_vectors(keys, values)\n",
134-
"long_ones_diff_order = SeriesUniverseMapping.from_vectors(diff_keys, values)\n",
132+
"long_acc = PolarsUniverseMapping.from_vectors(keys, values)\n",
133+
"long_ones = PolarsUniverseMapping.from_vectors(keys, values)\n",
134+
"long_ones_diff_order = PolarsUniverseMapping.from_vectors(diff_keys, values)\n",
135135
"\n",
136136
"\n",
137137
"# Same order allows for simple vectorised ops\n",

src/backtest_lib/examples/sp500.ipynb

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -152,13 +152,13 @@
152152
"\n",
153153
"import numpy as np\n",
154154
"\n",
155-
"from backtest_lib.market.polars_impl import SeriesUniverseMapping\n",
155+
"from backtest_lib.market.polars_impl import PolarsUniverseMapping\n",
156156
"from backtest_lib.portfolio import QuantityPortfolio\n",
157157
"\n",
158158
"secs = tuple(past_cost_prices.by_period[-1].keys())\n",
159159
"qtys = [random.randint(0, 10) for sec in secs]\n",
160160
"\n",
161-
"holdings = SeriesUniverseMapping.from_vectors(secs, qtys)\n",
161+
"holdings = PolarsUniverseMapping.from_vectors(secs, qtys)\n",
162162
"\n",
163163
"pf = QuantityPortfolio(cash=0, holdings=holdings)\n",
164164
"\n",
@@ -178,7 +178,7 @@
178178
"outputs": [],
179179
"source": [
180180
"from backtest_lib.backtest import Backtest, BacktestSettings\n",
181-
"from backtest_lib.market.polars_impl import SeriesUniverseMapping\n",
181+
"from backtest_lib.market.polars_impl import PolarsUniverseMapping\n",
182182
"from backtest_lib.market import MarketView\n",
183183
"from backtest_lib.portfolio import WeightedPortfolio\n",
184184
"from backtest_lib.strategy.decision import (\n",
@@ -192,7 +192,7 @@
192192
"universe = securities\n",
193193
"initial_portfolio = WeightedPortfolio(\n",
194194
" cash=0,\n",
195-
" holdings=SeriesUniverseMapping.from_names_and_data(\n",
195+
" holdings=PolarsUniverseMapping.from_names_and_data(\n",
196196
" universe, pl.Series(np.tile(1 / len(securities), len(securities)))\n",
197197
" ),\n",
198198
")\n",
@@ -391,13 +391,13 @@
391391
"metadata": {},
392392
"outputs": [],
393393
"source": [
394-
"from backtest_lib.market.polars_impl._plotting import SeriesUniverseMappingPlotAccessor\n",
394+
"from backtest_lib.market.polars_impl._plotting import PolarsUniverseMappingPlotAccessor\n",
395395
"from backtest_lib.market.plotting import UniverseMappingPlotAccessor\n",
396-
"from backtest_lib.market.polars_impl._universe_mapping import SeriesUniverseMapping\n",
396+
"from backtest_lib.market.polars_impl._universe_mapping import PolarsUniverseMapping\n",
397397
"from backtest_lib.universe.universe_mapping import UniverseMapping\n",
398398
"\n",
399-
"issubclass(SeriesUniverseMappingPlotAccessor, UniverseMappingPlotAccessor)\n",
400-
"(SeriesUniverseMapping, UniverseMapping)"
399+
"issubclass(PolarsUniverseMappingPlotAccessor, UniverseMappingPlotAccessor)\n",
400+
"(PolarsUniverseMapping, UniverseMapping)"
401401
]
402402
},
403403
{

src/backtest_lib/examples/trades_tests.ipynb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"source": [
1010
"import backtest_lib as btl\n",
1111
"import backtest_lib.strategy.decision as dcn\n",
12-
"from backtest_lib.market.polars_impl._universe_mapping import SeriesUniverseMapping\n",
12+
"from backtest_lib.market.polars_impl._universe_mapping import PolarsUniverseMapping\n",
1313
"\n",
1414
"securities = [\"AAPL\", \"MSFT\", \"GOOG\"]\n",
1515
"\n",
@@ -24,7 +24,7 @@
2424
"outputs": [],
2525
"source": [
2626
"dcn._calculate_total_position_delta(\n",
27-
" trades, security_alignment=securities, mapping_type=SeriesUniverseMapping\n",
27+
" trades, security_alignment=securities, mapping_type=PolarsUniverseMapping\n",
2828
")"
2929
]
3030
},

src/backtest_lib/market/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ def get_pastview_type_from_backend(backend: str) -> type[PastView]:
4949

5050
def get_mapping_type_from_backend(backend: str) -> type[UniverseMapping]:
5151
if backend == "polars":
52-
from backtest_lib.market.polars_impl import SeriesUniverseMapping
52+
from backtest_lib.market.polars_impl import PolarsUniverseMapping
5353

54-
return SeriesUniverseMapping
54+
return PolarsUniverseMapping
5555
else:
5656
raise ValueError(f"Could not find data backend {backend}")
5757

src/backtest_lib/market/polars_impl/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@
44
PolarsPastView,
55
)
66
from backtest_lib.market.polars_impl._timeseries import PolarsTimeseries
7-
from backtest_lib.market.polars_impl._universe_mapping import SeriesUniverseMapping
7+
from backtest_lib.market.polars_impl._universe_mapping import PolarsUniverseMapping
88

99
__all__ = [
1010
"PolarsPastView",
1111
"PolarsByPeriod",
1212
"PolarsBySecurity",
1313
"PolarsTimeseries",
1414
"PolarsBySecurity",
15-
"SeriesUniverseMapping",
15+
"PolarsUniverseMapping",
1616
]

src/backtest_lib/market/polars_impl/_helpers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ def __getitem__(self, index: int) -> np.datetime64: ...
5959
@overload
6060
def __getitem__(self, index: slice) -> Self: ...
6161

62-
def __getitem__(self, index: int | slice) -> np.datetime64 | Self:
62+
def __getitem__(self, index: int | slice) -> np.datetime64 | Array1DDTView:
6363
if isinstance(index, slice):
6464
return Array1DDTView(self._a[index])
6565
if isinstance(index, (int, np.integer)):

src/backtest_lib/market/polars_impl/_past_view.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
PolarsPastViewPlotAccessor,
3535
)
3636
from backtest_lib.market.polars_impl._timeseries import PolarsTimeseries
37-
from backtest_lib.market.polars_impl._universe_mapping import SeriesUniverseMapping
37+
from backtest_lib.market.polars_impl._universe_mapping import PolarsUniverseMapping
3838

3939
if TYPE_CHECKING:
4040
import pandas as pd
@@ -118,7 +118,7 @@ def as_df(
118118
return df
119119

120120
@overload
121-
def __getitem__(self, key: SupportsIndex) -> SeriesUniverseMapping: ...
121+
def __getitem__(self, key: SupportsIndex) -> PolarsUniverseMapping: ...
122122
@overload
123123
def __getitem__(self, key: slice) -> PolarsPastView: ...
124124

@@ -129,7 +129,7 @@ def __getitem__(self, key: SupportsIndex | slice):
129129
s = self._period_column_df.get_column(col_name)
130130
if self._row_indexer is not None:
131131
s = s.gather(self._row_indexer)
132-
return SeriesUniverseMapping(
132+
return PolarsUniverseMapping(
133133
names=self._security_axis.names,
134134
_data=s,
135135
pos=self._security_axis.pos,

0 commit comments

Comments
 (0)