Skip to content

Commit 7c4b378

Browse files
authored
python 3.8 external pins pandas<1.1.0, numpy<1.19.0 (#962)
1 parent cf1f019 commit 7c4b378

File tree

13 files changed

+64
-48
lines changed

13 files changed

+64
-48
lines changed

CHANGES.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
## Changelog
22

3-
### 1.80.5
3+
### 1.80.5 (2022-09-05)
44
* Feature: #950 remove all traces of python 2.7 and six package
55
* Feature: #959 add python 3.8 support
6+
* Feature: #962 pin pandas<1.1.0, numpy<1.19.0
67

78
### 1.80.4 (2022-01-25)
89
* Bugfix: #940 fix rows per chunk causing divide by zero

README.md

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
[![Documentation Status](https://readthedocs.org/projects/arctic/badge/?version=latest)](https://arctic.readthedocs.io/en/latest/?badge=latest)
55
[![CircleCI](https://circleci.com/gh/man-group/arctic/tree/master.svg?style=shield)](https://app.circleci.com/pipelines/github/man-group/arctic?branch=master)
6-
[![PyPI](https://img.shields.io/pypi/v/arctic)](https://pypi.org/project/arctic/)
6+
[![PyPI](https://img.shields.io/pypi/v/arctic)](https://pypi.org/project/arctic)
77
[![Python](https://img.shields.io/badge/Python-3.6|3.7|3.8-green.svg)](https://github.com/man-group/arctic)
88
[![Join the chat at https://gitter.im/man-group/arctic](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/man-group/arctic?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
99

@@ -19,9 +19,6 @@ Arctic has been under active development at [Man Group](https://www.man.com/) si
1919

2020
---
2121

22-
23-
:loudspeaker::loudspeaker::loudspeaker: **BUILDING THE NEXT GENERATION OF ARCTIC** :loudspeaker::loudspeaker::loudspeaker:
24-
2522
## Man Group is currently building the next generation of Arctic.
2623

2724
This will offer the same intuitive Python-centric API whilst utilizing a custom C++ storage engine and modern S3 compatible object storage to provide a timeseries database that is:
@@ -141,10 +138,10 @@ Arctic storage implementations are **pluggable**. VersionStore is the default.
141138

142139
Arctic currently works with:
143140

144-
* Python 3.6, 3.7
145-
* pymongo >= 3.6.0 <= 3.11.0
146-
* Pandas >= 0.22.0 <= 1.0.3
147-
* MongoDB >= 2.4.x <= 4.2.8
141+
* python 3.6, 3.7, 3.8
142+
* pymongo >= 3.6.0 <= 3.11.0
143+
* pandas >= 0.22.0 <1.1.0
144+
* MongoDB >= 2.4.x <= 4.2.8
148145

149146

150147
Operating Systems:

arctic/date/_util.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import datetime
33
import sys
44
from datetime import timedelta
5-
65
import pandas as pd
76

87
from ._daterange import DateRange
@@ -168,11 +167,13 @@ def datetime_to_ms(d):
168167
try:
169168
millisecond = d.microsecond // 1000
170169

171-
# python3.8 workaround https://github.com/pandas-dev/pandas/issues/32174
170+
# https://github.com/pandas-dev/pandas/issues/32526
171+
# https://github.com/pandas-dev/pandas/issues/32174
172172
if sys.version_info < (3, 8, 0):
173173
return calendar.timegm(_add_tzone(d).utctimetuple()) * 1000 + millisecond
174174
else:
175175
tmp = _add_tzone(d)
176+
# convert to Datetime seems to be the only reliable option
176177
if isinstance(tmp, pd.Timestamp):
177178
return calendar.timegm(tmp.to_pydatetime().utctimetuple()) * 1000 + millisecond
178179
else:

arctic/serialization/numpy_records.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,13 @@ def _index_from_records(self, recarr):
9595
if len(index) == 1:
9696
rtn = Index(np.copy(recarr[str(index[0])]), name=index[0])
9797
if isinstance(rtn, DatetimeIndex) and 'index_tz' in recarr.dtype.metadata:
98-
rtn = rtn.tz_localize('UTC').tz_convert(recarr.dtype.metadata['index_tz'])
98+
if PD_VER >= '1.0.4':
99+
if isinstance(recarr.dtype.metadata['index_tz'], list):
100+
rtn = rtn.tz_localize('UTC').tz_convert(recarr.dtype.metadata['index_tz'][0])
101+
else:
102+
rtn = rtn.tz_localize('UTC').tz_convert(recarr.dtype.metadata['index_tz'])
103+
else:
104+
rtn = rtn.tz_localize('UTC').tz_convert(recarr.dtype.metadata['index_tz'])
99105
else:
100106
level_arrays = []
101107
index_tz = recarr.dtype.metadata.get('index_tz', [])

arctic/store/_pickle_store.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ def write(self, arctic_lib, version, symbol, item, _previous_version):
9292
version['blob'] = _MAGIC_CHUNKEDV2
9393
# Python 3.8 onwards uses protocol 5 which cannot be unpickled in Python versions below that, so limiting
9494
# it to use a maximum of protocol 4 in Python which is understood by 3.4 onwards and is still fairly efficient.
95-
# The min() used to allow lower versions to be used in py2 (which supported a max of 2)
95+
# pickle version 4 is introduced with python 3.4 and default with 3.8 onward
9696
pickle_protocol = min(pickle.HIGHEST_PROTOCOL, 4)
9797
pickled = pickle.dumps(item, protocol=pickle_protocol)
9898

setup.cfg

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
1+
[metadata]
2+
name = arctic
3+
14
[pycodestyle]
25
ignore = E122,E126,E501,E731,W503,E722,W504

setup.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ def run_tests(self):
6060
name="arctic",
6161
version="1.80.5",
6262
author="Man AHL Technology",
63-
author_email="ManAHLTech@ahl.com",
63+
author_email="arctic@man.com",
6464
description=("AHL Research Versioned TimeSeries and Tick store"),
6565
license="GPL",
6666
keywords=["ahl", "keyvalue", "tickstore", "mongo", "timeseries", ],
@@ -69,15 +69,15 @@ def run_tests(self):
6969
long_description='\n'.join((long_description, changelog)),
7070
long_description_content_type="text/markdown",
7171
cmdclass={'test': PyTest},
72-
setup_requires=["numpy<=1.18.4",
72+
setup_requires=["numpy<1.19.0",
7373
"setuptools-git",
7474
],
7575
install_requires=["decorator",
7676
"enum-compat",
7777
"mock",
7878
"mockextras",
79-
"pandas<=1.0.3",
80-
"numpy<=1.18.4",
79+
"pandas<1.1.0",
80+
"numpy<1.19.0",
8181
"pymongo>=3.6.0, <= 3.11.0",
8282
"pytz",
8383
"tzlocal",

tests/integration/chunkstore/test_chunkstore.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from arctic.date import DateRange
1616
from arctic.exceptions import NoDataFoundException
1717
from tests.integration.chunkstore.test_utils import create_test_data
18-
from tests.util import assert_frame_equal_
18+
from tests.util import assert_frame_equal_, assert_series_equal_
1919

2020

2121
def test_write_dataframe(chunkstore_lib):
@@ -714,7 +714,7 @@ def test_overwrite_series(chunkstore_lib):
714714

715715
chunkstore_lib.write('test', s)
716716
chunkstore_lib.write('test', s + 1)
717-
assert_series_equal(chunkstore_lib.read('test'), s + 1)
717+
assert_series_equal_(chunkstore_lib.read('test'), s + 1, check_freq=False)
718718

719719

720720
def test_overwrite_series_monthly(chunkstore_lib):

tests/integration/store/test_pandas_store.py

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
# Do not remove PandasStore, used in global scope
2222
from arctic.store._pandas_ndarray_store import PandasDataFrameStore, PandasSeriesStore, PandasStore
2323
from arctic.store.version_store import register_versioned_storage
24-
from tests.util import assert_frame_equal_
24+
from tests.util import assert_frame_equal_, assert_series_equal_
2525

2626
register_versioned_storage(PandasDataFrameStore)
2727

@@ -851,30 +851,30 @@ def test_daterange_large_DataFrame_middle(library):
851851

852852
@pytest.mark.parametrize("df,assert_equal", [
853853
(DataFrame(index=date_range(dt(2001, 1, 1), freq='D', periods=30000),
854-
data=list(range(30000)), columns=['A']), assert_frame_equal),
854+
data=list(range(30000)), columns=['A']), assert_frame_equal_),
855855
(Series(index=date_range(dt(2001, 1, 1), freq='D', periods=30000),
856-
data=range(30000)), assert_series_equal),
856+
data=range(30000)), assert_series_equal_),
857857
])
858858
def test_daterange(library, df, assert_equal):
859859
df.index.name = 'idx'
860860
df.name = 'FOO'
861861
library.write('MYARR', df)
862862
# whole array
863863
saved_arr = library.read('MYARR').data
864-
assert_equal(df, saved_arr)
865-
assert_equal(df, library.read('MYARR', date_range=DateRange(df.index[0])).data)
866-
assert_equal(df, library.read('MYARR', date_range=DateRange(df.index[0], df.index[-1])).data)
867-
assert_equal(df, library.read('MYARR', date_range=DateRange()).data)
868-
assert_equal(df[df.index[10]:], library.read('MYARR', date_range=DateRange(df.index[10])).data)
869-
assert_equal(df[:df.index[10]], library.read('MYARR', date_range=DateRange(end=df.index[10])).data)
870-
assert_equal(df[df.index[-1]:], library.read('MYARR', date_range=DateRange(df.index[-1])).data)
871-
assert_equal(df[df.index[-1]:], library.read('MYARR', date_range=DateRange(df.index[-1], df.index[-1])).data)
872-
assert_equal(df[df.index[0]:df.index[0]], library.read('MYARR', date_range=DateRange(df.index[0], df.index[0])).data)
873-
assert_equal(df[:df.index[0]], library.read('MYARR', date_range=DateRange(end=df.index[0])).data)
864+
assert_equal(df, saved_arr, check_freq=False)
865+
assert_equal(df, library.read('MYARR', date_range=DateRange(df.index[0])).data, check_freq=False)
866+
assert_equal(df, library.read('MYARR', date_range=DateRange(df.index[0], df.index[-1])).data, check_freq=False)
867+
assert_equal(df, library.read('MYARR', date_range=DateRange()).data, check_freq=False)
868+
assert_equal(df[df.index[10]:], library.read('MYARR', date_range=DateRange(df.index[10])).data, check_freq=False)
869+
assert_equal(df[:df.index[10]], library.read('MYARR', date_range=DateRange(end=df.index[10])).data, check_freq=False)
870+
assert_equal(df[df.index[-1]:], library.read('MYARR', date_range=DateRange(df.index[-1])).data, check_freq=False)
871+
assert_equal(df[df.index[-1]:], library.read('MYARR', date_range=DateRange(df.index[-1], df.index[-1])).data, check_freq=False)
872+
assert_equal(df[df.index[0]:df.index[0]], library.read('MYARR', date_range=DateRange(df.index[0], df.index[0])).data, check_freq=False)
873+
assert_equal(df[:df.index[0]], library.read('MYARR', date_range=DateRange(end=df.index[0])).data, check_freq=False)
874874
assert_equal(df[df.index[0] - DateOffset(days=1):],
875-
library.read('MYARR', date_range=DateRange(df.index[0] - DateOffset(days=1))).data)
875+
library.read('MYARR', date_range=DateRange(df.index[0] - DateOffset(days=1))).data, check_freq=False)
876876
assert_equal(df[df.index[-1] + DateOffset(days=1):],
877-
library.read('MYARR', date_range=DateRange(df.index[-1] + DateOffset(days=1))).data)
877+
library.read('MYARR', date_range=DateRange(df.index[-1] + DateOffset(days=1))).data, check_freq=False)
878878
assert len(library.read('MYARR', date_range=DateRange(dt(1950, 1, 1), dt(1951, 1, 1))).data) == 0
879879
assert len(library.read('MYARR', date_range=DateRange(dt(2091, 1, 1), dt(2091, 1, 1))).data) == 0
880880

tests/integration/store/test_version_store.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
from tests.unit.serialization.serialization_test_data import _mixed_test_data
2727
from ...util import read_str_as_pandas
2828
from ..test_utils import enable_profiling_for_library
29-
from tests.util import assert_frame_equal_
29+
from tests.util import assert_frame_equal_, assert_series_equal_
3030

3131
ts1 = read_str_as_pandas(""" times | near
3232
2012-09-08 17:06:11.040 | 1.0
@@ -1743,7 +1743,7 @@ def test_can_write_tz_aware_data_series(library, fw_pointers_cfg):
17431743
# Arctic converts by default the data to UTC, convert back
17441744
read_data = read_data.dt.tz_localize('UTC').dt.tz_convert(read_data.index.tzinfo)
17451745
assert library._versions.find_one({'symbol': 'symTzSer'})['type'] == PandasSeriesStore.TYPE
1746-
assert_series_equal(myseries, read_data)
1746+
assert_series_equal_(myseries, read_data, check_freq=False)
17471747

17481748

17491749
@pytest.mark.parametrize('write_cfg, read_cfg, append_cfg, reread_cfg', [

0 commit comments

Comments
 (0)