diff --git a/native/Cargo.lock b/native/Cargo.lock index 8f977ff..4f5228e 100644 --- a/native/Cargo.lock +++ b/native/Cargo.lock @@ -638,7 +638,7 @@ checksum = "b90ca2580b73ab6a1f724b76ca11ab632df820fd6040c336200d2c1df7b3c82c" [[package]] name = "factor-expr" -version = "0.2.3" +version = "0.3.0" dependencies = [ "anyhow", "arrow", diff --git a/native/Cargo.toml b/native/Cargo.toml index 42e02a2..1790b6d 100644 --- a/native/Cargo.toml +++ b/native/Cargo.toml @@ -2,7 +2,7 @@ authors = ["Weiyuan Wu "] edition = "2018" name = "factor-expr" -version = "0.2.3" +version = "0.3.0" [lib] crate-type = ["rlib", "cdylib"] diff --git a/native/src/ops/window/minmax.rs b/native/src/ops/window/minmax.rs index b27f470..217ec09 100644 --- a/native/src/ops/window/minmax.rs +++ b/native/src/ops/window/minmax.rs @@ -84,10 +84,11 @@ macro_rules! impl_minmax { self.window.push_back((self.seq, val)); - let val = if self.window.len() == self.win_size { + let val = if self.i >= self.ready_offset() { let val = ($($vfunc)+) (&self.window, self.seq, self.win_size); val } else { + self.i += 1; f64::NAN }; results.push(val); diff --git a/python/factor_expr/replay.py b/python/factor_expr/replay.py index 0f7047a..2581159 100644 --- a/python/factor_expr/replay.py +++ b/python/factor_expr/replay.py @@ -7,7 +7,6 @@ from tqdm.auto import tqdm import numpy as np -import pandas as pd import pyarrow as pa import pyarrow.parquet as pq import pyarrow.compute as pc diff --git a/python/factor_expr/tests/factors/test_arithmetic.py b/python/factor_expr/tests/factors/test_arithmetic.py index 94b48ee..55b6496 100644 --- a/python/factor_expr/tests/factors/test_arithmetic.py +++ b/python/factor_expr/tests/factors/test_arithmetic.py @@ -16,13 +16,12 @@ def test_add(): [FILENAME], [Factor("(+ :price_ask_l1_high :price_bid_l1_open)")], pbar=False, - index_col="time", ) ) assert np.isclose( df.price_ask_l1_high + df.price_bid_l1_open, - result.iloc[:, 0], + result.to_pandas().iloc[:, 0], ).all() @@ -34,28 +33,23 @@ def test_sub(): [FILENAME], [Factor("(- :price_ask_l1_open :price_bid_l1_open)")], pbar=False, - index_col="time", ) ) assert np.isclose( df.price_ask_l1_open - df.price_bid_l1_open, - result.iloc[:, 0], + result.to_pandas().iloc[:, 0], ).all() def test_mul(): df = pd.read_parquet(FILENAME) - result = asyncio.run( - replay( - [FILENAME], [Factor("(* :price_ask_l1_open :price_bid_l1_low)")], pbar=False - ) - ) + result = asyncio.run(replay([FILENAME], [Factor("(* :price_ask_l1_open :price_bid_l1_low)")], pbar=False)) assert np.isclose( df.price_ask_l1_open * df.price_bid_l1_low, - result.iloc[:, 0], + result.to_pandas().iloc[:, 0], ).all() @@ -67,76 +61,65 @@ def test_div(): [FILENAME], [Factor("(/ :price_ask_l1_close :price_bid_l1_high)")], pbar=False, - index_col="time", ) ) assert np.isclose( df.price_ask_l1_close / df.price_bid_l1_high, - result.iloc[:, 0], + result.to_pandas().iloc[:, 0], ).all() def test_power(): df = pd.read_parquet(FILENAME) - result = asyncio.run( - replay([FILENAME], [Factor("(^ 3 :price_ask_l1_open)")], pbar=False) - ) + result = asyncio.run(replay([FILENAME], [Factor("(^ 3 :price_ask_l1_open)")], pbar=False)) assert np.isclose( - df.price_ask_l1_open ** 3, - result.iloc[:, 0], + df.price_ask_l1_open**3, + result.to_pandas().iloc[:, 0], ).all() def test_signed_power(): df = pd.read_parquet(FILENAME) - result = asyncio.run( - replay([FILENAME], [Factor("(SPow 2 :price_ask_l1_low)")], pbar=False) - ) + result = asyncio.run(replay([FILENAME], [Factor("(SPow 2 :price_ask_l1_low)")], pbar=False)) assert np.isclose( np.sign(df.price_ask_l1_low) * df.price_ask_l1_low.abs() ** 2, - result.iloc[:, 0], + result.to_pandas().iloc[:, 0], ).all() def test_log(): df = pd.read_parquet(FILENAME) - result = asyncio.run( - replay([FILENAME], [Factor("(LogAbs :volume_ask_l1_high)")], pbar=False) - ) + result = asyncio.run(replay([FILENAME], [Factor("(LogAbs :volume_ask_l1_high)")], pbar=False)) assert np.isclose( np.log(np.abs(df.volume_ask_l1_high)), - result.iloc[:, 0], + result.to_pandas().iloc[:, 0], ).all() def test_sign(): df = pd.read_parquet(FILENAME) - result = asyncio.run( - replay([FILENAME], [Factor("(Sign :price_ask_l1_close)")], pbar=False) - ) + result = asyncio.run(replay([FILENAME], [Factor("(Sign :price_ask_l1_close)")], pbar=False)) assert np.isclose( np.sign(df.price_ask_l1_close), - result.iloc[:, 0], + result.to_pandas().iloc[:, 0], ).all() def test_abs(): df = pd.read_parquet(FILENAME) - result = asyncio.run( - replay([FILENAME], [Factor("(Abs :price_ask_l1_open)")], pbar=False) - ) + result = asyncio.run(replay([FILENAME], [Factor("(Abs :price_ask_l1_open)")], pbar=False)) assert np.isclose( np.abs(df.price_ask_l1_open), - result.iloc[:, 0], + result.to_pandas().iloc[:, 0], ).all() diff --git a/python/factor_expr/tests/factors/test_logic.py b/python/factor_expr/tests/factors/test_logic.py index a31f2cc..cfda06b 100644 --- a/python/factor_expr/tests/factors/test_logic.py +++ b/python/factor_expr/tests/factors/test_logic.py @@ -16,11 +16,10 @@ def test_gt(): [FILENAME], [Factor("(> :price_ask_l1_open 0)")], pbar=False, - index_col="time", ) ) - assert ((df.price_ask_l1_open > 0).values == result.iloc[:, 0].values).all() + assert ((df.price_ask_l1_open > 0).values == result.to_pandas().iloc[:, 0].values).all() def test_gte(): @@ -31,11 +30,10 @@ def test_gte(): [FILENAME], [Factor("(>= :price_ask_l1_low 0)")], pbar=False, - index_col="time", ) ) - assert ((df.price_ask_l1_low >= 0).values == result.iloc[:, 0].values).all() + assert ((df.price_ask_l1_low >= 0).values == result.to_pandas().iloc[:, 0].values).all() def test_lt(): @@ -46,11 +44,10 @@ def test_lt(): [FILENAME], [Factor("(< :price_ask_l1_high 0)")], pbar=False, - index_col="time", ) ) - assert ((df.price_ask_l1_high < 0).values == result.iloc[:, 0].values).all() + assert ((df.price_ask_l1_high < 0).values == result.to_pandas().iloc[:, 0].values).all() def test_lte(): @@ -61,11 +58,10 @@ def test_lte(): [FILENAME], [Factor("(<= :price_ask_l1_close 0)")], pbar=False, - index_col="time", ) ) - assert ((df.price_ask_l1_close <= 0).values == result.iloc[:, 0].values).all() + assert ((df.price_ask_l1_close <= 0).values == result.to_pandas().iloc[:, 0].values).all() def test_or(): @@ -79,8 +75,7 @@ def test_or(): ) assert ( - ((df.price_ask_l1_close < 0).values | (df.price_bid_l1_high > 0).values) - == result.iloc[:, 0].values + ((df.price_ask_l1_close < 0).values | (df.price_bid_l1_high > 0).values) == result.to_pandas().iloc[:, 0].values ).all() @@ -95,8 +90,7 @@ def test_and(): ) assert ( - ((df.price_ask_l1_open < 0).values & (df.price_bid_l1_low > 0).values) - == result.iloc[:, 0].values + ((df.price_ask_l1_open < 0).values & (df.price_bid_l1_low > 0).values) == result.to_pandas().iloc[:, 0].values ).all() @@ -111,8 +105,7 @@ def test_not(): ) assert ( - ~((df.price_ask_l1_close < 0).values & (df.price_bid_l1_low > 0).values) - == result.iloc[:, 0].values + ~((df.price_ask_l1_close < 0).values & (df.price_bid_l1_low > 0).values) == result.to_pandas().iloc[:, 0].values ).all() @@ -122,13 +115,8 @@ def test_if(): result = asyncio.run( replay( [FILENAME], - [ - Factor( - "(If (< :price_ask_l1_high 0) :price_ask_l1_close :price_bid_l1_open)" - ) - ], + [Factor("(If (< :price_ask_l1_high 0) :price_ask_l1_close :price_bid_l1_open)")], pbar=False, - index_col="time", ) ) @@ -138,5 +126,5 @@ def test_if(): df.price_ask_l1_close.values, df.price_bid_l1_open.values, ) - == result.iloc[:, 0].values + == result.to_pandas().iloc[:, 0].values ).all() diff --git a/python/factor_expr/tests/factors/test_sanity.py b/python/factor_expr/tests/factors/test_sanity.py index 9c59d0e..c5345c0 100644 --- a/python/factor_expr/tests/factors/test_sanity.py +++ b/python/factor_expr/tests/factors/test_sanity.py @@ -9,34 +9,11 @@ def test_index(): - f = Factor("(TSMean 10 :price_ask_l1_open)") + f = Factor("(Mean 10 :price_ask_l1_open)") asyncio.run( replay( [FILENAME], [f], - trim=False, - index_col="time", pbar=False, ) ) - - -def test_trim(): - f = Factor("(TSMean 10 :price_ask_l1_open)") - asyncio.run(replay([FILENAME], [f], trim=True, pbar=False)) - - -def test_predicate(): - f = Factor("(TSMean 10 :price_ask_l1_open)") - predicate = Factor( - "(> (TSStd 60 (TSLogReturn 120 (+ :price_bid_l1_close :price_ask_l1_close))) 0.005)" - ) - asyncio.run(replay([FILENAME], [f], predicate=predicate, pbar=False)) - - -def test_predicate_with_trim(): - f = Factor("(TSMean 10 :price_ask_l1_open)") - predicate = Factor( - "(> (TSStd 60 (TSLogReturn 120 (+ :price_bid_l1_close :price_ask_l1_close))) 0.005)" - ) - asyncio.run(replay([FILENAME], [f], predicate=predicate, trim=True, pbar=False)) diff --git a/python/factor_expr/tests/factors/test_window.py b/python/factor_expr/tests/factors/test_window.py index fb81e5c..6d0041c 100644 --- a/python/factor_expr/tests/factors/test_window.py +++ b/python/factor_expr/tests/factors/test_window.py @@ -10,88 +10,71 @@ def test_sum(): df = pd.read_parquet(FILENAME) - f = Factor("(TSSum 10 :price_ask_l1_close)") - result = asyncio.run( - replay([FILENAME], [f], trim=True, pbar=False, index_col="time") - ) - + f = Factor("(Sum 10 :price_ask_l1_close)") + result = asyncio.run(replay([FILENAME], [f], pbar=False)) assert np.isclose( df.price_ask_l1_close.rolling(10).sum().values[f.ready_offset() :], - result.values.ravel(), + result.to_pandas().values.ravel()[f.ready_offset() :], ).all() def test_mean(): df = pd.read_parquet(FILENAME) - f = Factor("(TSMean 10 :price_ask_l1_open)") - result = asyncio.run( - replay([FILENAME], [f], trim=True, pbar=False, index_col="time") - ) + f = Factor("(Mean 10 :price_ask_l1_open)") + result = asyncio.run(replay([FILENAME], [f], pbar=False)) assert np.isclose( df.price_ask_l1_open.rolling(10).mean().values[f.ready_offset() :], - result.values.ravel(), + result.to_pandas().values.ravel()[f.ready_offset() :], ).all() def test_correlation(): df = pd.read_parquet(FILENAME) - f = Factor("(TSCorr 10 :price_ask_l1_high :price_bid_l1_low)") - result = asyncio.run( - replay([FILENAME], [f], trim=True, pbar=False, index_col="time") - ) + f = Factor("(Corr 10 :price_ask_l1_high :price_bid_l1_low)") + result = asyncio.run(replay([FILENAME], [f], pbar=False)) def func(sub): subdf = df.loc[sub.index] return np.corrcoef(subdf.price_ask_l1_high, subdf.price_bid_l1_low)[0, 1] assert np.isclose( - np.nan_to_num( - df.price_ask_l1_high.rolling(10) - .apply(func, raw=False) - .values[f.ready_offset() :] - ), - result.values.ravel(), + np.nan_to_num(df.price_ask_l1_high.rolling(10).apply(func, raw=False).values)[f.ready_offset() :], + result.to_pandas().values.ravel()[f.ready_offset() :], ).all() def test_min(): df = pd.read_parquet(FILENAME) - f = Factor("(TSMin 10 :price_ask_l1_close)") - result = asyncio.run( - replay([FILENAME], [f], trim=True, pbar=False, index_col="time") - ) + f = Factor("(Min 10 :price_ask_l1_close)") + result = asyncio.run(replay([FILENAME], [f], pbar=False)) assert np.isclose( df.price_ask_l1_close.rolling(10).min().values[f.ready_offset() :], - result.values.ravel(), + result.to_pandas().values.ravel()[f.ready_offset() :], ).all() def test_max(): df = pd.read_parquet(FILENAME) - f = Factor("(TSMax 10 :price_ask_l1_open)") - result = asyncio.run( - replay([FILENAME], [f], trim=True, pbar=False, index_col="time") - ) + f = Factor("(Max 10 :price_ask_l1_open)") + result = asyncio.run(replay([FILENAME], [f], pbar=False)) assert np.isclose( df.price_ask_l1_open.rolling(10).max().values[f.ready_offset() :], - result.values.ravel(), + result.to_pandas().values.ravel()[f.ready_offset() :], ).all() def test_argmax(): df = pd.read_parquet(FILENAME) - f = Factor("(TSArgMax 10 :price_ask_l1_close)") - result = asyncio.run( - replay([FILENAME], [f], trim=True, pbar=False, index_col="time") - ) + f = Factor("(ArgMax 10 :price_ask_l1_close)") + result = asyncio.run(replay([FILENAME], [f], pbar=False)) def func(sub): subdf = df.loc[sub.index] @@ -99,17 +82,15 @@ def func(sub): assert np.isclose( df.price_ask_l1_close.rolling(10).apply(func).values[f.ready_offset() :], - result.values.ravel(), + result.to_pandas().values.ravel()[f.ready_offset() :], ).all() def test_argmin(): df = pd.read_parquet(FILENAME) - f = Factor("(TSArgMin 10 :price_ask_l1_low)") - result = asyncio.run( - replay([FILENAME], [f], trim=True, pbar=False, index_col="time") - ) + f = Factor("(ArgMin 10 :price_ask_l1_low)") + result = asyncio.run(replay([FILENAME], [f], pbar=False)) def func(sub): subdf = df.loc[sub.index] @@ -117,21 +98,19 @@ def func(sub): assert np.isclose( df.price_ask_l1_low.rolling(10).apply(func).values[f.ready_offset() :], - result.values.ravel(), + result.to_pandas().values.ravel()[f.ready_offset() :], ).all() def test_std(): df = pd.read_parquet(FILENAME) - f = Factor("(TSStd 10 :price_ask_l1_high)") - result = asyncio.run( - replay([FILENAME], [f], trim=True, pbar=False, index_col="time") - ) + f = Factor("(Std 10 :price_ask_l1_high)") + result = asyncio.run(replay([FILENAME], [f], pbar=False)) assert np.isclose( df.price_ask_l1_high.rolling(10).std().values[f.ready_offset() :], - result.values.ravel(), + result.to_pandas().values.ravel()[f.ready_offset() :], atol=1e-5, ).all() @@ -139,16 +118,12 @@ def test_std(): def test_skew(): df = pd.read_parquet(FILENAME) - f = Factor("(TSSkew 10 :price_bid_l1_high)") - result = asyncio.run( - replay([FILENAME], [f], trim=True, pbar=False, index_col="time") - ) + f = Factor("(Skew 10 :price_bid_l1_high)") + result = asyncio.run(replay([FILENAME], [f], pbar=False)) assert np.isclose( - np.nan_to_num( - df.price_bid_l1_high.rolling(10).skew().values[f.ready_offset() :] - ), - result.values.ravel(), + np.nan_to_num(df.price_bid_l1_high.rolling(10).skew().values)[f.ready_offset() :], + result.to_pandas().values.ravel()[f.ready_offset() :], ).all() @@ -156,80 +131,61 @@ def test_delay(): df = pd.read_parquet(FILENAME) f = Factor("(Delay 10 :price_ask_l1_close)") - result = asyncio.run( - replay([FILENAME], [f], trim=True, pbar=False, index_col="time") - ) + result = asyncio.run(replay([FILENAME], [f], pbar=False)) assert np.isclose( df.price_ask_l1_close.shift(10).values[f.ready_offset() :], - result.values.ravel(), + result.to_pandas().values.ravel()[f.ready_offset() :], ).all() def test_rank(): df = pd.read_parquet(FILENAME) - f = Factor("(TSRank 10 :price_ask_l1_open)") - result = asyncio.run( - replay([FILENAME], [f], trim=True, pbar=False, index_col="time") - ) + f = Factor("(Rank 10 :price_ask_l1_open)") + result = asyncio.run(replay([FILENAME], [f], pbar=False)) def func(sub): subdf = df.loc[sub.index] - return ( - subdf.price_ask_l1_open.values[-1] > subdf.price_ask_l1_open.values - ).sum() + return (subdf.price_ask_l1_open.values[-1] > subdf.price_ask_l1_open.values).sum() assert np.isclose( df.price_ask_l1_open.rolling(10).apply(func).values[f.ready_offset() :], - result.values.ravel(), + result.to_pandas().values.ravel()[f.ready_offset() :], ).all() def test_logreturn(): df = pd.read_parquet(FILENAME) - f = Factor("(TSLogReturn 100 (Abs :price_ask_l1_high))") - result = asyncio.run( - replay([FILENAME], [f], trim=True, pbar=False, index_col="time") - ) + f = Factor("(LogReturn 100 (Abs :price_ask_l1_high))") + result = asyncio.run(replay([FILENAME], [f], pbar=False)) assert np.isclose( - np.log( - np.abs( - df.price_ask_l1_high.values[f.ready_offset() :] - / df.price_ask_l1_high.values[: -f.ready_offset()] - ) - ), - result.values.ravel(), + np.log(df.price_ask_l1_high.abs().pct_change(100) + 1)[f.ready_offset() :], + result.to_pandas().values.ravel()[f.ready_offset() :], ).all() def test_quantile(): df = pd.read_parquet(FILENAME) - f = Factor("(TSQuantile 30 0.3 :price_bid_l1_open)") - result = asyncio.run( - replay([FILENAME], [f], trim=True, pbar=False, index_col="time") - ) + f = Factor("(Quantile 30 0.3 :price_bid_l1_open)") + result = asyncio.run(replay([FILENAME], [f], pbar=False)) assert np.isclose( - df.price_bid_l1_open.rolling(30) - .quantile(0.3, "lower") - .values[f.ready_offset() :], - result.values.ravel(), + df.price_bid_l1_open.rolling(30).quantile(0.3, "lower").values[f.ready_offset() :], + result.to_pandas().values.ravel()[f.ready_offset() :], ).all() def test_median(): df = pd.read_parquet(FILENAME) - f = Factor("(TSQuantile 37 0.5 :price_bid_l1_open)") - result = asyncio.run( - replay([FILENAME], [f], trim=True, pbar=False, index_col="time") - ) + f = Factor("(Quantile 37 0.5 :price_bid_l1_open)") + result = asyncio.run(replay([FILENAME], [f], pbar=False)) assert np.isclose( df.price_bid_l1_open.rolling(37).median().values[f.ready_offset() :], - result.values.ravel(), + result.to_pandas().values.ravel()[f.ready_offset() :], ).all() diff --git a/python/poetry.lock b/python/poetry.lock index 12266a3..fc7e93e 100644 --- a/python/poetry.lock +++ b/python/poetry.lock @@ -1,15 +1,5 @@ # This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. -[[package]] -name = "atomicwrites" -version = "1.4.1" -description = "Atomic file writes." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, -] - [[package]] name = "attrs" version = "23.2.0" @@ -52,6 +42,70 @@ pyyaml = ["pyyaml (>=6.0)"] tomlkit = ["tomlkit (>=0.11.8)"] ujson = ["ujson (>=5.7.0)"] +[[package]] +name = "cffi" +version = "1.16.0" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, +] + +[package.dependencies] +pycparser = "*" + [[package]] name = "colorama" version = "0.4.6" @@ -300,64 +354,64 @@ files = [ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] -[[package]] -name = "py" -version = "1.11.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] - [[package]] name = "pyarrow" -version = "14.0.2" +version = "15.0.0" description = "Python library for Apache Arrow" optional = false python-versions = ">=3.8" files = [ - {file = "pyarrow-14.0.2-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:ba9fe808596c5dbd08b3aeffe901e5f81095baaa28e7d5118e01354c64f22807"}, - {file = "pyarrow-14.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:22a768987a16bb46220cef490c56c671993fbee8fd0475febac0b3e16b00a10e"}, - {file = "pyarrow-14.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dbba05e98f247f17e64303eb876f4a80fcd32f73c7e9ad975a83834d81f3fda"}, - {file = "pyarrow-14.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a898d134d00b1eca04998e9d286e19653f9d0fcb99587310cd10270907452a6b"}, - {file = "pyarrow-14.0.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:87e879323f256cb04267bb365add7208f302df942eb943c93a9dfeb8f44840b1"}, - {file = "pyarrow-14.0.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:76fc257559404ea5f1306ea9a3ff0541bf996ff3f7b9209fc517b5e83811fa8e"}, - {file = "pyarrow-14.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:b0c4a18e00f3a32398a7f31da47fefcd7a927545b396e1f15d0c85c2f2c778cd"}, - {file = "pyarrow-14.0.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:87482af32e5a0c0cce2d12eb3c039dd1d853bd905b04f3f953f147c7a196915b"}, - {file = "pyarrow-14.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:059bd8f12a70519e46cd64e1ba40e97eae55e0cbe1695edd95384653d7626b23"}, - {file = "pyarrow-14.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f16111f9ab27e60b391c5f6d197510e3ad6654e73857b4e394861fc79c37200"}, - {file = "pyarrow-14.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06ff1264fe4448e8d02073f5ce45a9f934c0f3db0a04460d0b01ff28befc3696"}, - {file = "pyarrow-14.0.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:6dd4f4b472ccf4042f1eab77e6c8bce574543f54d2135c7e396f413046397d5a"}, - {file = "pyarrow-14.0.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:32356bfb58b36059773f49e4e214996888eeea3a08893e7dbde44753799b2a02"}, - {file = "pyarrow-14.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:52809ee69d4dbf2241c0e4366d949ba035cbcf48409bf404f071f624ed313a2b"}, - {file = "pyarrow-14.0.2-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:c87824a5ac52be210d32906c715f4ed7053d0180c1060ae3ff9b7e560f53f944"}, - {file = "pyarrow-14.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a25eb2421a58e861f6ca91f43339d215476f4fe159eca603c55950c14f378cc5"}, - {file = "pyarrow-14.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c1da70d668af5620b8ba0a23f229030a4cd6c5f24a616a146f30d2386fec422"}, - {file = "pyarrow-14.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2cc61593c8e66194c7cdfae594503e91b926a228fba40b5cf25cc593563bcd07"}, - {file = "pyarrow-14.0.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:78ea56f62fb7c0ae8ecb9afdd7893e3a7dbeb0b04106f5c08dbb23f9c0157591"}, - {file = "pyarrow-14.0.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:37c233ddbce0c67a76c0985612fef27c0c92aef9413cf5aa56952f359fcb7379"}, - {file = "pyarrow-14.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:e4b123ad0f6add92de898214d404e488167b87b5dd86e9a434126bc2b7a5578d"}, - {file = "pyarrow-14.0.2-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:e354fba8490de258be7687f341bc04aba181fc8aa1f71e4584f9890d9cb2dec2"}, - {file = "pyarrow-14.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:20e003a23a13da963f43e2b432483fdd8c38dc8882cd145f09f21792e1cf22a1"}, - {file = "pyarrow-14.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc0de7575e841f1595ac07e5bc631084fd06ca8b03c0f2ecece733d23cd5102a"}, - {file = "pyarrow-14.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66e986dc859712acb0bd45601229021f3ffcdfc49044b64c6d071aaf4fa49e98"}, - {file = "pyarrow-14.0.2-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:f7d029f20ef56673a9730766023459ece397a05001f4e4d13805111d7c2108c0"}, - {file = "pyarrow-14.0.2-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:209bac546942b0d8edc8debda248364f7f668e4aad4741bae58e67d40e5fcf75"}, - {file = "pyarrow-14.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:1e6987c5274fb87d66bb36816afb6f65707546b3c45c44c28e3c4133c010a881"}, - {file = "pyarrow-14.0.2-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:a01d0052d2a294a5f56cc1862933014e696aa08cc7b620e8c0cce5a5d362e976"}, - {file = "pyarrow-14.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a51fee3a7db4d37f8cda3ea96f32530620d43b0489d169b285d774da48ca9785"}, - {file = "pyarrow-14.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64df2bf1ef2ef14cee531e2dfe03dd924017650ffaa6f9513d7a1bb291e59c15"}, - {file = "pyarrow-14.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c0fa3bfdb0305ffe09810f9d3e2e50a2787e3a07063001dcd7adae0cee3601a"}, - {file = "pyarrow-14.0.2-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c65bf4fd06584f058420238bc47a316e80dda01ec0dfb3044594128a6c2db794"}, - {file = "pyarrow-14.0.2-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:63ac901baec9369d6aae1cbe6cca11178fb018a8d45068aaf5bb54f94804a866"}, - {file = "pyarrow-14.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:75ee0efe7a87a687ae303d63037d08a48ef9ea0127064df18267252cfe2e9541"}, - {file = "pyarrow-14.0.2.tar.gz", hash = "sha256:36cef6ba12b499d864d1def3e990f97949e0b79400d08b7cf74504ffbd3eb025"}, + {file = "pyarrow-15.0.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:0a524532fd6dd482edaa563b686d754c70417c2f72742a8c990b322d4c03a15d"}, + {file = "pyarrow-15.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:60a6bdb314affa9c2e0d5dddf3d9cbb9ef4a8dddaa68669975287d47ece67642"}, + {file = "pyarrow-15.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:66958fd1771a4d4b754cd385835e66a3ef6b12611e001d4e5edfcef5f30391e2"}, + {file = "pyarrow-15.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f500956a49aadd907eaa21d4fff75f73954605eaa41f61cb94fb008cf2e00c6"}, + {file = "pyarrow-15.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6f87d9c4f09e049c2cade559643424da84c43a35068f2a1c4653dc5b1408a929"}, + {file = "pyarrow-15.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85239b9f93278e130d86c0e6bb455dcb66fc3fd891398b9d45ace8799a871a1e"}, + {file = "pyarrow-15.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:5b8d43e31ca16aa6e12402fcb1e14352d0d809de70edd185c7650fe80e0769e3"}, + {file = "pyarrow-15.0.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:fa7cd198280dbd0c988df525e50e35b5d16873e2cdae2aaaa6363cdb64e3eec5"}, + {file = "pyarrow-15.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8780b1a29d3c8b21ba6b191305a2a607de2e30dab399776ff0aa09131e266340"}, + {file = "pyarrow-15.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe0ec198ccc680f6c92723fadcb97b74f07c45ff3fdec9dd765deb04955ccf19"}, + {file = "pyarrow-15.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:036a7209c235588c2f07477fe75c07e6caced9b7b61bb897c8d4e52c4b5f9555"}, + {file = "pyarrow-15.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:2bd8a0e5296797faf9a3294e9fa2dc67aa7f10ae2207920dbebb785c77e9dbe5"}, + {file = "pyarrow-15.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:e8ebed6053dbe76883a822d4e8da36860f479d55a762bd9e70d8494aed87113e"}, + {file = "pyarrow-15.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:17d53a9d1b2b5bd7d5e4cd84d018e2a45bc9baaa68f7e6e3ebed45649900ba99"}, + {file = "pyarrow-15.0.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:9950a9c9df24090d3d558b43b97753b8f5867fb8e521f29876aa021c52fda351"}, + {file = "pyarrow-15.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:003d680b5e422d0204e7287bb3fa775b332b3fce2996aa69e9adea23f5c8f970"}, + {file = "pyarrow-15.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f75fce89dad10c95f4bf590b765e3ae98bcc5ba9f6ce75adb828a334e26a3d40"}, + {file = "pyarrow-15.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca9cb0039923bec49b4fe23803807e4ef39576a2bec59c32b11296464623dc2"}, + {file = "pyarrow-15.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:9ed5a78ed29d171d0acc26a305a4b7f83c122d54ff5270810ac23c75813585e4"}, + {file = "pyarrow-15.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:6eda9e117f0402dfcd3cd6ec9bfee89ac5071c48fc83a84f3075b60efa96747f"}, + {file = "pyarrow-15.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:9a3a6180c0e8f2727e6f1b1c87c72d3254cac909e609f35f22532e4115461177"}, + {file = "pyarrow-15.0.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:19a8918045993349b207de72d4576af0191beef03ea655d8bdb13762f0cd6eac"}, + {file = "pyarrow-15.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d0ec076b32bacb6666e8813a22e6e5a7ef1314c8069d4ff345efa6246bc38593"}, + {file = "pyarrow-15.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5db1769e5d0a77eb92344c7382d6543bea1164cca3704f84aa44e26c67e320fb"}, + {file = "pyarrow-15.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2617e3bf9df2a00020dd1c1c6dce5cc343d979efe10bc401c0632b0eef6ef5b"}, + {file = "pyarrow-15.0.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:d31c1d45060180131caf10f0f698e3a782db333a422038bf7fe01dace18b3a31"}, + {file = "pyarrow-15.0.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:c8c287d1d479de8269398b34282e206844abb3208224dbdd7166d580804674b7"}, + {file = "pyarrow-15.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:07eb7f07dc9ecbb8dace0f58f009d3a29ee58682fcdc91337dfeb51ea618a75b"}, + {file = "pyarrow-15.0.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:47af7036f64fce990bb8a5948c04722e4e3ea3e13b1007ef52dfe0aa8f23cf7f"}, + {file = "pyarrow-15.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93768ccfff85cf044c418bfeeafce9a8bb0cee091bd8fd19011aff91e58de540"}, + {file = "pyarrow-15.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6ee87fd6892700960d90abb7b17a72a5abb3b64ee0fe8db6c782bcc2d0dc0b4"}, + {file = "pyarrow-15.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:001fca027738c5f6be0b7a3159cc7ba16a5c52486db18160909a0831b063c4e4"}, + {file = "pyarrow-15.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:d1c48648f64aec09accf44140dccb92f4f94394b8d79976c426a5b79b11d4fa7"}, + {file = "pyarrow-15.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:972a0141be402bb18e3201448c8ae62958c9c7923dfaa3b3d4530c835ac81aed"}, + {file = "pyarrow-15.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:f01fc5cf49081426429127aa2d427d9d98e1cb94a32cb961d583a70b7c4504e6"}, + {file = "pyarrow-15.0.0.tar.gz", hash = "sha256:876858f549d540898f927eba4ef77cd549ad8d24baa3207cf1b72e5788b50e83"}, ] [package.dependencies] -numpy = ">=1.16.6" +numpy = ">=1.16.6,<2" + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] [[package]] name = "pyright" @@ -379,27 +433,23 @@ dev = ["twine (>=3.4.1)"] [[package]] name = "pytest" -version = "6.2.5" +version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, - {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, + {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, + {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, ] [package.dependencies] -atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} -attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} iniconfig = "*" packaging = "*" pluggy = ">=0.12,<2.0" -py = ">=1.8.2" -toml = "*" [package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "python-dateutil" @@ -548,17 +598,6 @@ files = [ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] - [[package]] name = "tqdm" version = "4.66.1" @@ -667,4 +706,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "8d2303ae8f3d5cc50dc9e6613ab75a7b2d553f6c4cbcb569541f4316aa88037f" +content-hash = "92f329fedd56ea70f5b71d3479e80d5d47bd0296458d189e42176d5d32d60ff8" diff --git a/python/pyproject.toml b/python/pyproject.toml index a6fc48d..ee79321 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -16,12 +16,11 @@ keywords = ["factor", "expression", "alpha", "S-expression", "quantative trading license = "MIT" name = "factor_expr" readme = "README.md" -version = "0.2.3" +version = "0.3.0" [tool.poetry.dependencies] numpy = "^1.26" -pandas = "^2" -pyarrow = "^14" +pyarrow = {extras = ["cffi"], version = "^15.0.0"} python = "^3.11" tqdm = "^4" @@ -30,7 +29,9 @@ ruff = "^0.1.13" python-lsp-ruff = "^2.0.2" pyright = "^1.1.347" docopt = "^0.6.2" -pytest = "^6.2.3" +cffi = "^1.16.0" +pytest = "^7.4.4" +pandas = "^2.2.0" [build-system] requires = ["poetry-core>=1.0.0"]