From d0032de0f28ea684ef9c762f71d31faebb92622b Mon Sep 17 00:00:00 2001 From: gfyoung Date: Mon, 4 Nov 2019 02:16:16 +0000 Subject: [PATCH 1/3] TST: Test DataFrame.rolling with window as string Closes https://github.com/pandas-dev/pandas/issues/22590 --- pandas/tests/window/test_rolling.py | 390 +++++++++++++++++++++++++++- 1 file changed, 388 insertions(+), 2 deletions(-) diff --git a/pandas/tests/window/test_rolling.py b/pandas/tests/window/test_rolling.py index 70ba85120af3c..edc369398c90d 100644 --- a/pandas/tests/window/test_rolling.py +++ b/pandas/tests/window/test_rolling.py @@ -1,4 +1,4 @@ -from datetime import timedelta +from datetime import datetime, timedelta import numpy as np import pytest @@ -7,7 +7,7 @@ import pandas.util._test_decorators as td import pandas as pd -from pandas import DataFrame, Series +from pandas import DataFrame, Index, Series from pandas.core.window import Rolling from pandas.tests.window.common import Base import pandas.util.testing as tm @@ -361,3 +361,389 @@ def test_rolling_datetime(self, axis_frame, tz_naive_fixture): } ) tm.assert_frame_equal(result, expected) + + +def test_rolling_window_as_string(): + # see gh-22590 + date_today = datetime.now() + days = pd.date_range(date_today, date_today + timedelta(365), freq="D") + + np.random.seed(seed=421) + + data = np.random.randint(1, high=100, size=len(days)) + df = DataFrame({"DateCol": days, "metric": data}) + + df.set_index("DateCol", inplace=True) + result = df.rolling(window="21D", min_periods=2, closed="left")["metric"].agg("max") + + expData = [ + np.nan, + np.nan, + 88.0, + 88.0, + 88.0, + 88.0, + 88.0, + 88.0, + 88.0, + 88.0, + 88.0, + 88.0, + 88.0, + 88.0, + 88.0, + 88.0, + 88.0, + 88.0, + 97.0, + 97.0, + 97.0, + 97.0, + 97.0, + 97.0, + 97.0, + 97.0, + 97.0, + 98.0, + 99.0, + 99.0, + 99.0, + 99.0, + 99.0, + 99.0, + 99.0, + 99.0, + 99.0, + 99.0, + 99.0, + 99.0, + 99.0, + 99.0, + 99.0, + 99.0, + 99.0, + 99.0, + 99.0, + 99.0, + 99.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 93.0, + 93.0, + 93.0, + 93.0, + 93.0, + 89.0, + 89.0, + 89.0, + 89.0, + 89.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 94.0, + 94.0, + 94.0, + 94.0, + 94.0, + 94.0, + 94.0, + 94.0, + 94.0, + 94.0, + 94.0, + 94.0, + 94.0, + 94.0, + 90.0, + 90.0, + 90.0, + 90.0, + 90.0, + 90.0, + 90.0, + 90.0, + 90.0, + 90.0, + 90.0, + 90.0, + 90.0, + 88.0, + 88.0, + 90.0, + 90.0, + 90.0, + 90.0, + 90.0, + 90.0, + 90.0, + 90.0, + 90.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 96.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 91.0, + 87.0, + 87.0, + 87.0, + 87.0, + 87.0, + 87.0, + 92.0, + 92.0, + 92.0, + 92.0, + 92.0, + 92.0, + 92.0, + 92.0, + 92.0, + 92.0, + 92.0, + 92.0, + 92.0, + 92.0, + 92.0, + 92.0, + 92.0, + 92.0, + 92.0, + 92.0, + 92.0, + 83.0, + 83.0, + 86.0, + 86.0, + 86.0, + 86.0, + 86.0, + 86.0, + 86.0, + 86.0, + 86.0, + 86.0, + 87.0, + 87.0, + 87.0, + 87.0, + 87.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 97.0, + 97.0, + 97.0, + 97.0, + 97.0, + 97.0, + 97.0, + 97.0, + 97.0, + 97.0, + 97.0, + 97.0, + 97.0, + 97.0, + 93.0, + 93.0, + 93.0, + 93.0, + 93.0, + 93.0, + 93.0, + 87.0, + 87.0, + 87.0, + 87.0, + 86.0, + 86.0, + 86.0, + 86.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 85.0, + 85.0, + 85.0, + 85.0, + 85.0, + 85.0, + 85.0, + 85.0, + 85.0, + 85.0, + 85.0, + 85.0, + 85.0, + 85.0, + 83.0, + 83.0, + 76.0, + 76.0, + 76.0, + 76.0, + 76.0, + 81.0, + 81.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 98.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 91.0, + 91.0, + 91.0, + 91.0, + 91.0, + 91.0, + 91.0, + 86.0, + 93.0, + 93.0, + 93.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + 95.0, + ] + + expected = Series(expData, index=Index(days, name="DateCol"), name="metric") + tm.assert_series_equal(result, expected) From a2c8ae37ce6994602021a0400d2b83ff160d0d03 Mon Sep 17 00:00:00 2001 From: gfyoung Date: Mon, 4 Nov 2019 02:50:23 +0000 Subject: [PATCH 2/3] Condense expData construction via list addition --- pandas/tests/window/test_rolling.py | 407 +++------------------------- 1 file changed, 39 insertions(+), 368 deletions(-) diff --git a/pandas/tests/window/test_rolling.py b/pandas/tests/window/test_rolling.py index edc369398c90d..651f27a0abcfc 100644 --- a/pandas/tests/window/test_rolling.py +++ b/pandas/tests/window/test_rolling.py @@ -376,374 +376,45 @@ def test_rolling_window_as_string(): df.set_index("DateCol", inplace=True) result = df.rolling(window="21D", min_periods=2, closed="left")["metric"].agg("max") - expData = [ - np.nan, - np.nan, - 88.0, - 88.0, - 88.0, - 88.0, - 88.0, - 88.0, - 88.0, - 88.0, - 88.0, - 88.0, - 88.0, - 88.0, - 88.0, - 88.0, - 88.0, - 88.0, - 97.0, - 97.0, - 97.0, - 97.0, - 97.0, - 97.0, - 97.0, - 97.0, - 97.0, - 98.0, - 99.0, - 99.0, - 99.0, - 99.0, - 99.0, - 99.0, - 99.0, - 99.0, - 99.0, - 99.0, - 99.0, - 99.0, - 99.0, - 99.0, - 99.0, - 99.0, - 99.0, - 99.0, - 99.0, - 99.0, - 99.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 93.0, - 93.0, - 93.0, - 93.0, - 93.0, - 89.0, - 89.0, - 89.0, - 89.0, - 89.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 94.0, - 94.0, - 94.0, - 94.0, - 94.0, - 94.0, - 94.0, - 94.0, - 94.0, - 94.0, - 94.0, - 94.0, - 94.0, - 94.0, - 90.0, - 90.0, - 90.0, - 90.0, - 90.0, - 90.0, - 90.0, - 90.0, - 90.0, - 90.0, - 90.0, - 90.0, - 90.0, - 88.0, - 88.0, - 90.0, - 90.0, - 90.0, - 90.0, - 90.0, - 90.0, - 90.0, - 90.0, - 90.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 96.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 91.0, - 87.0, - 87.0, - 87.0, - 87.0, - 87.0, - 87.0, - 92.0, - 92.0, - 92.0, - 92.0, - 92.0, - 92.0, - 92.0, - 92.0, - 92.0, - 92.0, - 92.0, - 92.0, - 92.0, - 92.0, - 92.0, - 92.0, - 92.0, - 92.0, - 92.0, - 92.0, - 92.0, - 83.0, - 83.0, - 86.0, - 86.0, - 86.0, - 86.0, - 86.0, - 86.0, - 86.0, - 86.0, - 86.0, - 86.0, - 87.0, - 87.0, - 87.0, - 87.0, - 87.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 97.0, - 97.0, - 97.0, - 97.0, - 97.0, - 97.0, - 97.0, - 97.0, - 97.0, - 97.0, - 97.0, - 97.0, - 97.0, - 97.0, - 93.0, - 93.0, - 93.0, - 93.0, - 93.0, - 93.0, - 93.0, - 87.0, - 87.0, - 87.0, - 87.0, - 86.0, - 86.0, - 86.0, - 86.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 85.0, - 85.0, - 85.0, - 85.0, - 85.0, - 85.0, - 85.0, - 85.0, - 85.0, - 85.0, - 85.0, - 85.0, - 85.0, - 85.0, - 83.0, - 83.0, - 76.0, - 76.0, - 76.0, - 76.0, - 76.0, - 81.0, - 81.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 98.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 91.0, - 91.0, - 91.0, - 91.0, - 91.0, - 91.0, - 91.0, - 86.0, - 93.0, - 93.0, - 93.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - 95.0, - ] + expData = ( + [np.nan] * 2 + + [88.0] * 16 + + [97.0] * 9 + + [98.0] + + [99.0] * 21 + + [95.0] * 16 + + [93.0] * 5 + + [89.0] * 5 + + [96.0] * 21 + + [94.0] * 14 + + [90.0] * 13 + + [88.0] * 2 + + [90.0] * 9 + + [96.0] * 21 + + [95.0] * 6 + + [91.0] + + [87.0] * 6 + + [92.0] * 21 + + [83.0] * 2 + + [86.0] * 10 + + [87.0] * 5 + + [98.0] * 21 + + [97.0] * 14 + + [93.0] * 7 + + [87.0] * 4 + + [86.0] * 4 + + [95.0] * 21 + + [85.0] * 14 + + [83.0] * 2 + + [76.0] * 5 + + [81.0] * 2 + + [98.0] * 21 + + [95.0] * 14 + + [91.0] * 7 + + [86.0] + + [93.0] * 3 + + [95.0] * 20 + ) expected = Series(expData, index=Index(days, name="DateCol"), name="metric") tm.assert_series_equal(result, expected) From 532ba5cf01309aca5137618661ea461320084783 Mon Sep 17 00:00:00 2001 From: gfyoung Date: Mon, 4 Nov 2019 16:05:07 +0000 Subject: [PATCH 3/3] MAINT: Use RandomState to set seed locally --- pandas/tests/window/test_rolling.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/tests/window/test_rolling.py b/pandas/tests/window/test_rolling.py index 651f27a0abcfc..72b72b31d8faa 100644 --- a/pandas/tests/window/test_rolling.py +++ b/pandas/tests/window/test_rolling.py @@ -368,9 +368,9 @@ def test_rolling_window_as_string(): date_today = datetime.now() days = pd.date_range(date_today, date_today + timedelta(365), freq="D") - np.random.seed(seed=421) + npr = np.random.RandomState(seed=421) - data = np.random.randint(1, high=100, size=len(days)) + data = npr.randint(1, high=100, size=len(days)) df = DataFrame({"DateCol": days, "metric": data}) df.set_index("DateCol", inplace=True)