openseries 1.7.7__py3-none-any.whl → 1.8.0__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.
openseries/__init__.py CHANGED
@@ -10,6 +10,7 @@ from .datefixer import (
10
10
  )
11
11
  from .frame import OpenFrame
12
12
  from .load_plotly import load_plotly_dict
13
+ from .owntypes import ValueType
13
14
  from .portfoliotools import (
14
15
  constrain_optimized_portfolios,
15
16
  efficient_frontier,
@@ -19,7 +20,6 @@ from .portfoliotools import (
19
20
  )
20
21
  from .series import OpenTimeSeries, timeseries_chain
21
22
  from .simulation import ReturnSimulation
22
- from .types import ValueType
23
23
 
24
24
  __all__ = [
25
25
  "OpenFrame",
@@ -49,7 +49,7 @@ from .datefixer import (
49
49
  holiday_calendar,
50
50
  )
51
51
  from .load_plotly import load_plotly_dict
52
- from .types import (
52
+ from .owntypes import (
53
53
  CountriesType,
54
54
  DaysInYearType,
55
55
  LiteralBarPlotMode,
openseries/_risk.py CHANGED
@@ -14,7 +14,7 @@ from numpy import (
14
14
  from pandas import DataFrame, Series
15
15
 
16
16
  if TYPE_CHECKING:
17
- from .types import LiteralQuantileInterp # pragma: no cover
17
+ from .owntypes import LiteralQuantileInterp # pragma: no cover
18
18
 
19
19
 
20
20
  def _cvar_down_calc(
openseries/datefixer.py CHANGED
@@ -22,7 +22,7 @@ from pandas import (
22
22
  from pandas.tseries.offsets import CustomBusinessDay
23
23
 
24
24
  if TYPE_CHECKING:
25
- from .types import ( # pragma: no cover
25
+ from .owntypes import ( # pragma: no cover
26
26
  CountriesType,
27
27
  DateType,
28
28
  HolidayType,
@@ -114,7 +114,7 @@ def date_fix(
114
114
 
115
115
  """
116
116
  msg = f"Unknown date format {fixerdate!s} of type {type(fixerdate)!s} encountered"
117
- if isinstance(fixerdate, (Timestamp, dt.datetime)):
117
+ if isinstance(fixerdate, Timestamp | dt.datetime):
118
118
  return fixerdate.date()
119
119
  if isinstance(fixerdate, dt.date):
120
120
  return fixerdate
openseries/frame.py CHANGED
@@ -43,8 +43,7 @@ from typing_extensions import Self
43
43
 
44
44
  from ._common_model import _CommonModel
45
45
  from .datefixer import _do_resample_to_business_period_ends
46
- from .series import OpenTimeSeries
47
- from .types import (
46
+ from .owntypes import (
48
47
  CountriesType,
49
48
  DaysInYearType,
50
49
  LiteralBizDayFreq,
@@ -59,6 +58,7 @@ from .types import (
59
58
  OpenFramePropertiesList,
60
59
  ValueType,
61
60
  )
61
+ from .series import OpenTimeSeries
62
62
 
63
63
  __all__ = ["OpenFrame"]
64
64
 
@@ -181,7 +181,7 @@ class OpenFrame(_CommonModel):
181
181
  [x.tsdf for x in self.constituents],
182
182
  )
183
183
 
184
- mapper = dict(zip(self.columns_lvl_zero, lvl_zero))
184
+ mapper = dict(zip(self.columns_lvl_zero, lvl_zero, strict=True))
185
185
  self.tsdf = self.tsdf.rename(columns=mapper, level=0)
186
186
 
187
187
  if self.tsdf.empty:
@@ -653,7 +653,7 @@ class OpenFrame(_CommonModel):
653
653
  """
654
654
  if self.weights:
655
655
  new_c, new_w = [], []
656
- for serie, weight in zip(self.constituents, self.weights):
656
+ for serie, weight in zip(self.constituents, self.weights, strict=True):
657
657
  if serie.label != lvl_zero_item:
658
658
  new_c.append(serie)
659
659
  new_w.append(weight)
openseries/load_plotly.py CHANGED
@@ -11,7 +11,7 @@ import requests
11
11
  from requests.exceptions import ConnectionError as RequestsConnectionError
12
12
 
13
13
  if TYPE_CHECKING:
14
- from .types import CaptorLogoType, PlotlyLayoutType # pragma: no cover
14
+ from .owntypes import CaptorLogoType, PlotlyLayoutType # pragma: no cover
15
15
 
16
16
  __all__ = ["load_plotly_dict"]
17
17
 
@@ -30,7 +30,7 @@ CountryListType = conset(
30
30
  item_type=CountryStringType,
31
31
  min_length=1,
32
32
  )
33
- CountriesType = Union[CountryListType, CountryStringType] # type: ignore[valid-type]
33
+ CountriesType = Union[CountryListType, CountryStringType] # type: ignore[valid-type] # noqa: UP007
34
34
 
35
35
 
36
36
  class Countries(BaseModel):
@@ -77,16 +77,6 @@ DateListType = Annotated[
77
77
 
78
78
  ValueListType = Annotated[list[float], conlist(float, min_length=1)]
79
79
 
80
- DatabaseIdStringType = Annotated[
81
- str,
82
- StringConstraints(
83
- pattern=r"^([0-9a-f]{24})?$",
84
- strict=True,
85
- strip_whitespace=True,
86
- max_length=24,
87
- ),
88
- ]
89
-
90
80
  DaysInYearType = Annotated[int, Field(strict=True, ge=1, le=366)]
91
81
 
92
82
  DateType = str | dt.date | dt.datetime | datetime64 | Timestamp
@@ -3,9 +3,10 @@
3
3
  # mypy: disable-error-code="index,assignment"
4
4
  from __future__ import annotations
5
5
 
6
+ from collections.abc import Callable
6
7
  from inspect import stack
7
8
  from pathlib import Path
8
- from typing import TYPE_CHECKING, Callable, cast
9
+ from typing import TYPE_CHECKING, cast
9
10
 
10
11
  from numpy import (
11
12
  append,
@@ -33,17 +34,17 @@ from plotly.offline import plot # type: ignore[import-untyped,unused-ignore]
33
34
  from scipy.optimize import minimize # type: ignore[import-untyped,unused-ignore]
34
35
 
35
36
  from .load_plotly import load_plotly_dict
36
- from .series import OpenTimeSeries
37
-
38
- # noinspection PyProtectedMember
39
- from .simulation import _random_generator
40
- from .types import (
37
+ from .owntypes import (
41
38
  LiteralLinePlotMode,
42
39
  LiteralMinimizeMethods,
43
40
  LiteralPlotlyJSlib,
44
41
  LiteralPlotlyOutput,
45
42
  ValueType,
46
43
  )
44
+ from .series import OpenTimeSeries
45
+
46
+ # noinspection PyProtectedMember
47
+ from .simulation import _random_generator
47
48
 
48
49
  if TYPE_CHECKING: # pragma: no cover
49
50
  from pydantic import DirectoryPath
@@ -189,7 +190,7 @@ def efficient_frontier( # noqa: C901
189
190
  frontier_max = cleaned_arithmetic_means.max()
190
191
 
191
192
  def _check_sum(weights: NDArray[float64]) -> float64:
192
- return cast(float64, npsum(weights) - 1)
193
+ return npsum(weights) - 1
193
194
 
194
195
  def _get_ret_vol_sr(
195
196
  lg_ret: DataFrame,
@@ -415,12 +416,14 @@ def prepare_plot_data(
415
416
  for wgt, nm in zip(
416
417
  cast(list[float], assets.weights),
417
418
  assets.columns_lvl_zero,
419
+ strict=True,
418
420
  )
419
421
  ],
420
422
  )
421
423
 
422
424
  opt_text_list = [
423
- f"{wgt:.1%} {nm}" for wgt, nm in zip(optimized[3:], assets.columns_lvl_zero)
425
+ f"{wgt:.1%} {nm}"
426
+ for wgt, nm in zip(optimized[3:], assets.columns_lvl_zero, strict=True)
424
427
  ]
425
428
  opt_text = "<br><br>Weights:<br>" + "<br>".join(opt_text_list)
426
429
  vol: Series[float] = assets.vol
@@ -552,7 +555,7 @@ def sharpeplot( # noqa: C901
552
555
  dict[str, str | int | float | bool | list[str]],
553
556
  fig["layout"],
554
557
  ).get("colorway")[: len(point_frame.columns)]
555
- for col, clr in zip(point_frame.columns, colorway):
558
+ for col, clr in zip(point_frame.columns, colorway, strict=True):
556
559
  returns.extend([point_frame.loc["ret", col]])
557
560
  risk.extend([point_frame.loc["stdev", col]])
558
561
  figure.add_scatter(
openseries/series.py CHANGED
@@ -3,6 +3,7 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import datetime as dt
6
+ from collections.abc import Iterable
6
7
  from copy import deepcopy
7
8
  from logging import warning
8
9
  from typing import Any, TypeVar, cast
@@ -30,12 +31,11 @@ from typing_extensions import Self
30
31
 
31
32
  from ._common_model import _CommonModel
32
33
  from .datefixer import _do_resample_to_business_period_ends, date_fix
33
- from .types import (
34
+ from .owntypes import (
34
35
  Countries,
35
36
  CountriesType,
36
37
  Currency,
37
38
  CurrencyStringType,
38
- DatabaseIdStringType,
39
39
  DateListType,
40
40
  DaysInYearType,
41
41
  LiteralBizDayFreq,
@@ -60,9 +60,9 @@ class OpenTimeSeries(_CommonModel):
60
60
 
61
61
  Parameters
62
62
  ----------
63
- timeseries_id : DatabaseIdStringType
63
+ timeseries_id : str
64
64
  Database identifier of the timeseries
65
- instrument_id: DatabaseIdStringType
65
+ instrument_id: str
66
66
  Database identifier of the instrument associated with the timeseries
67
67
  name : str
68
68
  string identifier of the timeseries and/or instrument
@@ -91,8 +91,8 @@ class OpenTimeSeries(_CommonModel):
91
91
 
92
92
  """
93
93
 
94
- timeseries_id: DatabaseIdStringType
95
- instrument_id: DatabaseIdStringType
94
+ timeseries_id: str
95
+ instrument_id: str
96
96
  name: str
97
97
  valuetype: ValueType
98
98
  dates: DateListType
@@ -147,8 +147,8 @@ class OpenTimeSeries(_CommonModel):
147
147
  dates: DateListType,
148
148
  values: ValueListType,
149
149
  valuetype: ValueType = ValueType.PRICE,
150
- timeseries_id: DatabaseIdStringType = "",
151
- instrument_id: DatabaseIdStringType = "",
150
+ timeseries_id: str = "",
151
+ instrument_id: str = "",
152
152
  isin: str | None = None,
153
153
  baseccy: CurrencyStringType = "SEK",
154
154
  *,
@@ -166,9 +166,9 @@ class OpenTimeSeries(_CommonModel):
166
166
  Array of float values
167
167
  valuetype : ValueType, default: ValueType.PRICE
168
168
  Identifies if the series is a series of values or returns
169
- timeseries_id : DatabaseIdStringType, optional
169
+ timeseries_id : str, optional
170
170
  Database identifier of the timeseries
171
- instrument_id: DatabaseIdStringType, optional
171
+ instrument_id: str, optional
172
172
  Database identifier of the instrument associated with the timeseries
173
173
  isin : str, optional
174
174
  ISO 6166 identifier code of the associated instrument
@@ -234,12 +234,13 @@ class OpenTimeSeries(_CommonModel):
234
234
 
235
235
  """
236
236
  msg = "Argument dframe must be pandas Series or DataFrame."
237
+ values: list[float]
237
238
  if isinstance(dframe, Series):
238
239
  if isinstance(dframe.name, tuple):
239
240
  label, _ = dframe.name
240
241
  else:
241
242
  label = dframe.name
242
- values = dframe.to_numpy().tolist()
243
+ values = cast(list[float], dframe.to_numpy().tolist())
243
244
  elif isinstance(dframe, DataFrame):
244
245
  values = dframe.iloc[:, column_nmbr].to_list()
245
246
  if isinstance(dframe.columns, MultiIndex):
@@ -331,24 +332,19 @@ class OpenTimeSeries(_CommonModel):
331
332
  An OpenTimeSeries object
332
333
 
333
334
  """
334
- if not isinstance(d_range, DatetimeIndex) and all([days, end_dt]):
335
+ if not isinstance(d_range, Iterable) and all([days, end_dt]):
335
336
  d_range = DatetimeIndex(
336
337
  [d.date() for d in date_range(periods=days, end=end_dt, freq="D")],
337
338
  )
338
- elif not isinstance(d_range, DatetimeIndex) and not all([days, end_dt]):
339
+ elif not isinstance(d_range, Iterable) and not all([days, end_dt]):
339
340
  msg = "If d_range is not provided both days and end_dt must be."
340
341
  raise ValueError(msg)
341
342
 
342
343
  deltas = array(
343
- [
344
- i.days
345
- for i in cast(DatetimeIndex, d_range)[1:]
346
- - cast(DatetimeIndex, d_range)[:-1]
347
- ],
344
+ [i.days for i in DatetimeIndex(d_range)[1:] - DatetimeIndex(d_range)[:-1]], # type: ignore[arg-type]
348
345
  )
349
- # noinspection PyTypeChecker
350
- arr = list(cumprod(insert(1 + deltas * rate / 365, 0, 1.0)))
351
- dates = [d.strftime("%Y-%m-%d") for d in cast(DatetimeIndex, d_range)]
346
+ arr: list[float] = list(cumprod(insert(1 + deltas * rate / 365, 0, 1.0)))
347
+ dates = [d.strftime("%Y-%m-%d") for d in DatetimeIndex(d_range)] # type: ignore[arg-type]
352
348
 
353
349
  return cls(
354
350
  timeseries_id="",
@@ -517,7 +513,9 @@ class OpenTimeSeries(_CommonModel):
517
513
 
518
514
  deltas = array([i.days for i in self.tsdf.index[1:] - self.tsdf.index[:-1]])
519
515
  # noinspection PyTypeChecker
520
- arr = cumprod(insert(1.0 + deltas * arr[:-1] / days_in_year, 0, 1.0))
516
+ arr = cumprod( # type: ignore[assignment,unused-ignore]
517
+ a=insert(arr=1.0 + deltas * arr[:-1] / days_in_year, obj=0, values=1.0)
518
+ )
521
519
 
522
520
  self.dates = [d.strftime("%Y-%m-%d") for d in self.tsdf.index]
523
521
  self.values = list(arr)
openseries/simulation.py CHANGED
@@ -25,7 +25,7 @@ from pydantic import (
25
25
  from typing_extensions import Self
26
26
 
27
27
  from .datefixer import generate_calendar_date_range
28
- from .types import (
28
+ from .owntypes import (
29
29
  CountriesType,
30
30
  DaysInYearType,
31
31
  ValueType,
@@ -1,36 +1,38 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.3
2
2
  Name: openseries
3
- Version: 1.7.7
3
+ Version: 1.8.0
4
4
  Summary: Tools for analyzing financial timeseries.
5
- Home-page: https://github.com/CaptorAB/openseries
6
5
  License: BSD-3-Clause
7
6
  Keywords: python,finance,fintech,data-science,timeseries,timeseries-data,timeseries-analysis,investment,investment-analysis,investing
8
7
  Author: Martin Karrin
9
8
  Author-email: martin.karrin@captor.se
9
+ Maintainer: Martin Karrin
10
+ Maintainer-email: martin.karrin@captor.se
10
11
  Requires-Python: >=3.10,<3.14
11
- Classifier: Development Status :: 5 - Production/Stable
12
- Classifier: Framework :: Pydantic
13
- Classifier: Intended Audience :: Financial and Insurance Industry
14
- Classifier: License :: OSI Approved :: BSD License
15
- Classifier: Natural Language :: English
16
- Classifier: Operating System :: OS Independent
17
- Classifier: Programming Language :: Python :: 3
18
12
  Classifier: Programming Language :: Python :: 3.10
19
13
  Classifier: Programming Language :: Python :: 3.11
20
14
  Classifier: Programming Language :: Python :: 3.12
21
15
  Classifier: Programming Language :: Python :: 3.13
16
+ Classifier: License :: OSI Approved :: BSD License
17
+ Classifier: Intended Audience :: Financial and Insurance Industry
22
18
  Classifier: Topic :: Office/Business :: Financial :: Investment
19
+ Classifier: Natural Language :: English
20
+ Classifier: Development Status :: 5 - Production/Stable
21
+ Classifier: Operating System :: OS Independent
22
+ Classifier: Framework :: Pydantic
23
23
  Requires-Dist: holidays (>=0.30,<1.0)
24
24
  Requires-Dist: numpy (>=1.23.2,<3.0.0)
25
25
  Requires-Dist: openpyxl (>=3.1.2,<4.0.0)
26
26
  Requires-Dist: pandas (>=2.1.2,<3.0.0)
27
27
  Requires-Dist: plotly (>=5.18.0,<6.0.0)
28
- Requires-Dist: pyarrow (>=14.0.2,<19.0.0)
28
+ Requires-Dist: pyarrow (>=14.0.2,<20.0.0)
29
29
  Requires-Dist: pydantic (>=2.5.2,<3.0.0)
30
30
  Requires-Dist: python-dateutil (>=2.8.2,<3.0.0)
31
31
  Requires-Dist: requests (>=2.20.0,<3.0.0)
32
32
  Requires-Dist: scipy (>=1.11.4,<2.0.0)
33
33
  Requires-Dist: statsmodels (>=0.14.0,!=0.14.2,<1.0.0)
34
+ Project-URL: Documentation, https://github.com/CaptorAB/openseries
35
+ Project-URL: Homepage, https://github.com/CaptorAB/openseries
34
36
  Project-URL: Repository, https://github.com/CaptorAB/openseries
35
37
  Description-Content-Type: text/markdown
36
38
 
@@ -43,6 +45,7 @@ Description-Content-Type: text/markdown
43
45
  [![PyPI version](https://img.shields.io/pypi/v/openseries.svg)](https://pypi.org/project/openseries/)
44
46
  [![Conda Version](https://img.shields.io/conda/vn/conda-forge/openseries.svg)](https://anaconda.org/conda-forge/openseries)
45
47
  [![Conda platforms](https://img.shields.io/conda/pn/conda-forge/openseries.svg)](https://anaconda.org/conda-forge/openseries)
48
+ [![Code Sample](https://img.shields.io/badge/-Code%20Sample-blue)](https://nbviewer.org/github/karrmagadgeteer2/NoteBook/blob/master/openseriesnotebook.ipynb)
46
49
  [![Python version](https://img.shields.io/pypi/pyversions/openseries.svg)](https://www.python.org/)
47
50
  [![GitHub Action Test Suite](https://github.com/CaptorAB/openseries/actions/workflows/test.yml/badge.svg)](https://github.com/CaptorAB/openseries/actions/workflows/test.yml)
48
51
  [![Coverage](https://cdn.jsdelivr.net/gh/CaptorAB/openseries@master/coverage.svg)](https://github.com/CaptorAB/openseries/actions/workflows/test.yml)
@@ -80,10 +83,10 @@ Install openseries and yfinance first.
80
83
  from openseries import OpenTimeSeries
81
84
  import yfinance as yf
82
85
 
83
- move=yf.Ticker("^MOVE")
86
+ move=yf.Ticker(ticker="^MOVE")
84
87
  history=move.history(period="max")
85
- series=OpenTimeSeries.from_df(history.loc[:, "Close"])
86
- _=series.set_new_label("ICE BofAML MOVE Index")
88
+ series=OpenTimeSeries.from_df(dframe=history.loc[:, "Close"])
89
+ _=series.set_new_label(lvl_zero="ICE BofAML MOVE Index")
87
90
  _,_=series.plot_series()
88
91
 
89
92
  ```
@@ -117,11 +120,6 @@ first indices 2006-01-03
117
120
  last indices 2023-04-05 2023-04-05
118
121
  ```
119
122
 
120
- ### Usage example on Jupyter Nbviewer
121
-
122
- [![nbviewer](https://raw.githubusercontent.com/jupyter/design/master/logos/Badges/nbviewer_badge.svg)](https://nbviewer.org/github/karrmagadgeteer2/NoteBook/blob/master/openseriesnotebook.ipynb)
123
-
124
-
125
123
  ## Development Instructions
126
124
 
127
125
  These instructions assume that you have a compatible Python version installed on
@@ -0,0 +1,16 @@
1
+ openseries/__init__.py,sha256=DrWDr7AJuhhBVivuFyLRIcVIYepuDoJO4k0ztQT9MR0,1035
2
+ openseries/_common_model.py,sha256=w80ce2Qw9eV75m3DWmuLfg_Bf3T1LN7m3_x6Qlfoz7c,73771
3
+ openseries/_risk.py,sha256=Dx-ZcQpc27qCs3j6o_Q1WshJ5m-vvf2ufYrKWD_q7PE,2085
4
+ openseries/datefixer.py,sha256=2QvioTNIzL067srtzBWB8mEgbPYydiNmjTPM9YICPl0,12300
5
+ openseries/frame.py,sha256=3uqlGTY6wu5OhXaS7gwhroj4gEjeEGE7zJjqrr9lCdg,55407
6
+ openseries/load_plotly.py,sha256=-s_KkLSU0Zvw3bdjV1kFtbNd5ShS-z5nd46tzGvZiYU,1959
7
+ openseries/owntypes.py,sha256=TwKCjD_911x2mEUcK_KM0d-I5sNH46OKt8ttLq-33-Q,7317
8
+ openseries/plotly_captor_logo.json,sha256=F5nhMzEyxKywtjvQqMTKgKRCJQYMDIiBgDSxdte8Clo,178
9
+ openseries/plotly_layouts.json,sha256=ahx8-dL4_RPzvHtBOX0SiL0AH7xQJzNRSDhGrSmU-Og,1429
10
+ openseries/portfoliotools.py,sha256=eVFs-ded4mt4IqdDS2S665_u0P213oC4ZkW_nmc-mWw,19180
11
+ openseries/series.py,sha256=vtjnn1UJedXqFIMJSG0DaVt-MyIw58qnxwyG2nfqG-w,27598
12
+ openseries/simulation.py,sha256=3bMG9wYKMlXY6BZuORGAPQvLvvDg3qp7e2JPSwMHyOo,13881
13
+ openseries-1.8.0.dist-info/LICENSE.md,sha256=IQ8_IMXgHxyv4M48G14fJsjcrkiSASdalASTXWCOsj4,1515
14
+ openseries-1.8.0.dist-info/METADATA,sha256=gXQGuyWqwhd7gMSw5DvMOQOW_kC4l6saD4kvICDV6AM,43789
15
+ openseries-1.8.0.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
16
+ openseries-1.8.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 1.9.1
2
+ Generator: poetry-core 2.0.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -1,16 +0,0 @@
1
- openseries/__init__.py,sha256=gWSOyzR78BMAANZokCz2CoC1RxZM4eSpJOHFGQfFToc,1032
2
- openseries/_common_model.py,sha256=R9PhG5hrOk5pJjv3aox9fI1-Pv90wXYjbdbOU_YNlVA,73768
3
- openseries/_risk.py,sha256=PReIfkzhInvIgJkzI4k1wYvhmLZ4cCurYKuQAvlHLlE,2082
4
- openseries/datefixer.py,sha256=3E8Ddf3Ps9k5qUWqL13ONelyMECZsvtyrsFJg7r3bxE,12298
5
- openseries/frame.py,sha256=nGqqLlENLuSj0YuR1AXtgLg-w8kPCfUQf6xkjGiOTEI,55378
6
- openseries/load_plotly.py,sha256=vL4nZuX20d3F5q-NbaHldIsKInUc9tXOu6S-rDGHuDw,1956
7
- openseries/plotly_captor_logo.json,sha256=F5nhMzEyxKywtjvQqMTKgKRCJQYMDIiBgDSxdte8Clo,178
8
- openseries/plotly_layouts.json,sha256=ahx8-dL4_RPzvHtBOX0SiL0AH7xQJzNRSDhGrSmU-Og,1429
9
- openseries/portfoliotools.py,sha256=s8bQ1SfcXF-xY3GbpyOvMHfypPBXtEl6jDZwVRcrSY4,19102
10
- openseries/series.py,sha256=i-zVf3lsk4u_4VlWCSFRQax51LAStMewKIVgiqlo7gQ,27654
11
- openseries/simulation.py,sha256=Gc5h3KD3K5AySWqXzm1lbsn2_mwOEWjHr6EVNHb1R-w,13878
12
- openseries/types.py,sha256=IbzW9iVuA3MEx3WtjyB6QYeSd3TkGjTOkFnnpSADKlY,7491
13
- openseries-1.7.7.dist-info/LICENSE.md,sha256=IQ8_IMXgHxyv4M48G14fJsjcrkiSASdalASTXWCOsj4,1515
14
- openseries-1.7.7.dist-info/METADATA,sha256=nnf395aWacK9fb1hkrRk65fx250WqtnGFth8JDm2XAs,43744
15
- openseries-1.7.7.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
16
- openseries-1.7.7.dist-info/RECORD,,