From 9399ec664dcff19119d686bf011a6bfe40de1789 Mon Sep 17 00:00:00 2001 From: ShaharNaveh <> Date: Mon, 12 Apr 2021 20:06:27 +0300 Subject: [PATCH 01/12] Fix docs for algorithms.py --- ci/code_checks.sh | 4 ++++ pandas/core/algorithms.py | 20 +++++++++++--------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/ci/code_checks.sh b/ci/code_checks.sh index 3b1774ade6f85..132d5feeaf25e 100755 --- a/ci/code_checks.sh +++ b/ci/code_checks.sh @@ -138,6 +138,10 @@ if [[ -z "$CHECK" || "$CHECK" == "doctests" ]]; then # Individual files + MSG='Doctests algorithms.py' ; echo $MSG + pytest -q --doctest-modules pandas/core/algorithms.py + RET=$(($RET + $?)) ; echo $MSG "DONE" + MSG='Doctests accessor.py' ; echo $MSG pytest -q --doctest-modules pandas/core/accessor.py RET=$(($RET + $?)) ; echo $MSG "DONE" diff --git a/pandas/core/algorithms.py b/pandas/core/algorithms.py index 9e2dd846f0379..e324cc103985f 100644 --- a/pandas/core/algorithms.py +++ b/pandas/core/algorithms.py @@ -381,13 +381,15 @@ def unique(values): >>> pd.unique(pd.Series([pd.Timestamp('20160101', tz='US/Eastern'), ... pd.Timestamp('20160101', tz='US/Eastern')])) - array([Timestamp('2016-01-01 00:00:00-0500', tz='US/Eastern')], - dtype=object) + + ['2016-01-01 00:00:00-05:00'] + Length: 1, dtype: datetime64[ns, US/Eastern] >>> pd.unique(pd.Index([pd.Timestamp('20160101', tz='US/Eastern'), ... pd.Timestamp('20160101', tz='US/Eastern')])) DatetimeIndex(['2016-01-01 00:00:00-05:00'], - ... dtype='datetime64[ns, US/Eastern]', freq=None) + dtype='datetime64[ns, US/Eastern]', + freq=None) >>> pd.unique(list('baabc')) array(['b', 'a', 'c'], dtype=object) @@ -396,21 +398,21 @@ def unique(values): order of appearance. >>> pd.unique(pd.Series(pd.Categorical(list('baabc')))) - [b, a, c] - Categories (3, object): [b, a, c] + ['b', 'a', 'c'] + Categories (3, object): ['b', 'a', 'c'] >>> pd.unique(pd.Series(pd.Categorical(list('baabc'), ... categories=list('abc')))) - [b, a, c] - Categories (3, object): [b, a, c] + ['b', 'a', 'c'] + Categories (3, object): ['b', 'a', 'c'] An ordered Categorical preserves the category ordering. >>> pd.unique(pd.Series(pd.Categorical(list('baabc'), ... categories=list('abc'), ... ordered=True))) - [b, a, c] - Categories (3, object): [a < b < c] + ['b', 'a', 'c'] + Categories (3, object): ['a' < 'b' < 'c'] An array of tuples From 65e4ff40831535a2582f05984f78663e40270a64 Mon Sep 17 00:00:00 2001 From: ShaharNaveh <> Date: Mon, 12 Apr 2021 20:37:33 +0300 Subject: [PATCH 02/12] Fix docs for nanops.py --- ci/code_checks.sh | 4 ++++ pandas/core/nanops.py | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/ci/code_checks.sh b/ci/code_checks.sh index 132d5feeaf25e..4ae93edca2621 100755 --- a/ci/code_checks.sh +++ b/ci/code_checks.sh @@ -166,6 +166,10 @@ if [[ -z "$CHECK" || "$CHECK" == "doctests" ]]; then pytest -q --doctest-modules pandas/core/generic.py RET=$(($RET + $?)) ; echo $MSG "DONE" + MSG='Doctests nanops.py' ; echo $MSG + pytest -q --doctest-modules pandas/core/nanops.py + RET=$(($RET + $?)) ; echo $MSG "DONE" + MSG='Doctests series.py' ; echo $MSG pytest -q --doctest-modules pandas/core/series.py RET=$(($RET + $?)) ; echo $MSG "DONE" diff --git a/pandas/core/nanops.py b/pandas/core/nanops.py index 43a61ed799e8f..c0609d1cff70b 100644 --- a/pandas/core/nanops.py +++ b/pandas/core/nanops.py @@ -1056,7 +1056,7 @@ def nanargmax( [ 6., 7., nan], [ 9., 10., nan]]) >>> nanops.nanargmax(arr, axis=1) - array([2, 2, 1, 1], dtype=int64) + array([2, 2, 1, 1]) """ values, mask, _, _, _ = _get_values(values, True, fill_value_typ="-inf", mask=mask) # error: Need type annotation for 'result' @@ -1102,7 +1102,7 @@ def nanargmin( [nan, 7., 8.], [nan, 10., 11.]]) >>> nanops.nanargmin(arr, axis=1) - array([0, 0, 1, 1], dtype=int64) + array([0, 0, 1, 1]) """ values, mask, _, _, _ = _get_values(values, True, fill_value_typ="+inf", mask=mask) # error: Need type annotation for 'result' From 291cae26e6d58392e527ce9e0d244046ee391b1c Mon Sep 17 00:00:00 2001 From: ShaharNaveh <> Date: Mon, 12 Apr 2021 20:51:43 +0300 Subject: [PATCH 03/12] Fix docs for indexers.py --- ci/code_checks.sh | 4 ++++ pandas/core/indexers.py | 25 +++++++++++++++---------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/ci/code_checks.sh b/ci/code_checks.sh index 4ae93edca2621..737e8d646c719 100755 --- a/ci/code_checks.sh +++ b/ci/code_checks.sh @@ -166,6 +166,10 @@ if [[ -z "$CHECK" || "$CHECK" == "doctests" ]]; then pytest -q --doctest-modules pandas/core/generic.py RET=$(($RET + $?)) ; echo $MSG "DONE" + MSG='Doctests indexers.py' ; echo $MSG + pytest -q --doctest-modules pandas/core/indexers.py + RET=$(($RET + $?)) ; echo $MSG "DONE" + MSG='Doctests nanops.py' ; echo $MSG pytest -q --doctest-modules pandas/core/nanops.py RET=$(($RET + $?)) ; echo $MSG "DONE" diff --git a/pandas/core/indexers.py b/pandas/core/indexers.py index db28ad710989d..2a61a0cb31b88 100644 --- a/pandas/core/indexers.py +++ b/pandas/core/indexers.py @@ -209,16 +209,21 @@ def validate_indices(indices: np.ndarray, n: int) -> None: Examples -------- - >>> validate_indices([1, 2], 3) - # OK - >>> validate_indices([1, -2], 3) - ValueError - >>> validate_indices([1, 2, 3], 3) - IndexError - >>> validate_indices([-1, -1], 0) - # OK - >>> validate_indices([0, 1], 0) - IndexError + >>> validate_indices(np.ndarray([1, 2]), 3) # OK + + >>> validate_indices(np.ndarray([1, -2]), 3) + Traceback (most recent call last): + ... + ValueError: negative dimensions are not allowed + + >>> validate_indices(np.ndarray([1, 2, 3]), 3) # OK + + >>> validate_indices(np.ndarray([-1, -1]), 0) + Traceback (most recent call last): + ... + ValueError: negative dimensions are not allowed + + >>> validate_indices(np.ndarray([0, 1]), 0) # OK """ if len(indices): min_idx = indices.min() From 857c11060a30191c4001188324fc50080dc22c07 Mon Sep 17 00:00:00 2001 From: ShaharNaveh <> Date: Mon, 19 Apr 2021 15:59:11 +0300 Subject: [PATCH 04/12] Switching from `np.ndarray` to `np.array` As pointed here: https://github.com/pandas-dev/pandas/pull/40903#discussion_r611884623 --- pandas/core/indexers.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/pandas/core/indexers.py b/pandas/core/indexers.py index 2a61a0cb31b88..aa780787d58b6 100644 --- a/pandas/core/indexers.py +++ b/pandas/core/indexers.py @@ -209,21 +209,24 @@ def validate_indices(indices: np.ndarray, n: int) -> None: Examples -------- - >>> validate_indices(np.ndarray([1, 2]), 3) # OK + >>> validate_indices(np.array([1, 2]), 3) # OK - >>> validate_indices(np.ndarray([1, -2]), 3) + >>> validate_indices(np.array([1, -2]), 3) Traceback (most recent call last): ... ValueError: negative dimensions are not allowed - >>> validate_indices(np.ndarray([1, 2, 3]), 3) # OK - - >>> validate_indices(np.ndarray([-1, -1]), 0) + >>> validate_indices(np.array([1, 2, 3]), 3) Traceback (most recent call last): ... - ValueError: negative dimensions are not allowed + IndexError: indices are out-of-bounds + + >>> validate_indices(np.array([-1, -1]), 0) # OK - >>> validate_indices(np.ndarray([0, 1]), 0) # OK + >>> validate_indices(np.array([0, 1]), 0) + Traceback (most recent call last): + ... + IndexError: indices are out-of-bounds """ if len(indices): min_idx = indices.min() From 73d5d029aa059113b24d12244fd496e98237cab5 Mon Sep 17 00:00:00 2001 From: ShaharNaveh <> Date: Mon, 19 Apr 2021 16:22:42 +0300 Subject: [PATCH 05/12] Rerunning the CI From 4bca61f07e9e6520814283050038af7a6f7e0645 Mon Sep 17 00:00:00 2001 From: ShaharNaveh <> Date: Mon, 19 Apr 2021 21:09:23 +0300 Subject: [PATCH 06/12] Fixed failing tests --- pandas/core/algorithms.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/core/algorithms.py b/pandas/core/algorithms.py index 9982556b82026..e86ead905bc57 100644 --- a/pandas/core/algorithms.py +++ b/pandas/core/algorithms.py @@ -399,12 +399,12 @@ def unique(values): >>> pd.unique(pd.Series(pd.Categorical(list('baabc')))) ['b', 'a', 'c'] - Categories (3, object): ['b', 'a', 'c'] + Categories (3, object): ['a', 'b', 'c'] >>> pd.unique(pd.Series(pd.Categorical(list('baabc'), ... categories=list('abc')))) ['b', 'a', 'c'] - Categories (3, object): ['b', 'a', 'c'] + Categories (3, object): ['a', 'b', 'c'] An ordered Categorical preserves the category ordering. From bec5b3ae5752efe4c7bd2efd9040fe0304592e39 Mon Sep 17 00:00:00 2001 From: ShaharNaveh <> Date: Mon, 19 Apr 2021 21:20:59 +0300 Subject: [PATCH 07/12] Applied "black formatting" on the example code --- pandas/core/algorithms.py | 40 +++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/pandas/core/algorithms.py b/pandas/core/algorithms.py index e86ead905bc57..4b7482d7e921f 100644 --- a/pandas/core/algorithms.py +++ b/pandas/core/algorithms.py @@ -375,48 +375,60 @@ def unique(values): >>> pd.unique(pd.Series([2] + [1] * 5)) array([2, 1]) - >>> pd.unique(pd.Series([pd.Timestamp('20160101'), - ... pd.Timestamp('20160101')])) + >>> pd.unique(pd.Series([pd.Timestamp("20160101"), pd.Timestamp("20160101")])) array(['2016-01-01T00:00:00.000000000'], dtype='datetime64[ns]') - >>> pd.unique(pd.Series([pd.Timestamp('20160101', tz='US/Eastern'), - ... pd.Timestamp('20160101', tz='US/Eastern')])) + >>> pd.unique( + ... pd.Series( + ... [ + ... pd.Timestamp("20160101", tz="US/Eastern"), + ... pd.Timestamp("20160101", tz="US/Eastern"), + ... ] + ... ) + ... ) ['2016-01-01 00:00:00-05:00'] Length: 1, dtype: datetime64[ns, US/Eastern] - >>> pd.unique(pd.Index([pd.Timestamp('20160101', tz='US/Eastern'), - ... pd.Timestamp('20160101', tz='US/Eastern')])) + >>> pd.unique( + ... pd.Index( + ... [ + ... pd.Timestamp("20160101", tz="US/Eastern"), + ... pd.Timestamp("20160101", tz="US/Eastern"), + ... ] + ... ) + ... ) DatetimeIndex(['2016-01-01 00:00:00-05:00'], dtype='datetime64[ns, US/Eastern]', freq=None) - >>> pd.unique(list('baabc')) + >>> pd.unique(list("baabc")) array(['b', 'a', 'c'], dtype=object) An unordered Categorical will return categories in the order of appearance. - >>> pd.unique(pd.Series(pd.Categorical(list('baabc')))) + >>> pd.unique(pd.Series(pd.Categorical(list("baabc")))) ['b', 'a', 'c'] Categories (3, object): ['a', 'b', 'c'] - >>> pd.unique(pd.Series(pd.Categorical(list('baabc'), - ... categories=list('abc')))) + >>> pd.unique(pd.Series(pd.Categorical(list("baabc"), categories=list("abc")))) ['b', 'a', 'c'] Categories (3, object): ['a', 'b', 'c'] An ordered Categorical preserves the category ordering. - >>> pd.unique(pd.Series(pd.Categorical(list('baabc'), - ... categories=list('abc'), - ... ordered=True))) + >>> pd.unique( + ... pd.Series( + ... pd.Categorical(list("baabc"), categories=list("abc"), ordered=True) + ... ) + ... ) ['b', 'a', 'c'] Categories (3, object): ['a' < 'b' < 'c'] An array of tuples - >>> pd.unique([('a', 'b'), ('b', 'a'), ('a', 'c'), ('b', 'a')]) + >>> pd.unique([("a", "b"), ("b", "a"), ("a", "c"), ("b", "a")]) array([('a', 'b'), ('b', 'a'), ('a', 'c')], dtype=object) """ values = _ensure_arraylike(values) From 6adfead166d4889f535415ed62c80272ae3ac5ae Mon Sep 17 00:00:00 2001 From: ShaharNaveh <> Date: Mon, 26 Apr 2021 15:39:16 +0300 Subject: [PATCH 08/12] Revert "Applied "black formatting" on the example code" This reverts commit bec5b3ae5752efe4c7bd2efd9040fe0304592e39. --- pandas/core/algorithms.py | 40 ++++++++++++++------------------------- 1 file changed, 14 insertions(+), 26 deletions(-) diff --git a/pandas/core/algorithms.py b/pandas/core/algorithms.py index 4b7482d7e921f..e86ead905bc57 100644 --- a/pandas/core/algorithms.py +++ b/pandas/core/algorithms.py @@ -375,60 +375,48 @@ def unique(values): >>> pd.unique(pd.Series([2] + [1] * 5)) array([2, 1]) - >>> pd.unique(pd.Series([pd.Timestamp("20160101"), pd.Timestamp("20160101")])) + >>> pd.unique(pd.Series([pd.Timestamp('20160101'), + ... pd.Timestamp('20160101')])) array(['2016-01-01T00:00:00.000000000'], dtype='datetime64[ns]') - >>> pd.unique( - ... pd.Series( - ... [ - ... pd.Timestamp("20160101", tz="US/Eastern"), - ... pd.Timestamp("20160101", tz="US/Eastern"), - ... ] - ... ) - ... ) + >>> pd.unique(pd.Series([pd.Timestamp('20160101', tz='US/Eastern'), + ... pd.Timestamp('20160101', tz='US/Eastern')])) ['2016-01-01 00:00:00-05:00'] Length: 1, dtype: datetime64[ns, US/Eastern] - >>> pd.unique( - ... pd.Index( - ... [ - ... pd.Timestamp("20160101", tz="US/Eastern"), - ... pd.Timestamp("20160101", tz="US/Eastern"), - ... ] - ... ) - ... ) + >>> pd.unique(pd.Index([pd.Timestamp('20160101', tz='US/Eastern'), + ... pd.Timestamp('20160101', tz='US/Eastern')])) DatetimeIndex(['2016-01-01 00:00:00-05:00'], dtype='datetime64[ns, US/Eastern]', freq=None) - >>> pd.unique(list("baabc")) + >>> pd.unique(list('baabc')) array(['b', 'a', 'c'], dtype=object) An unordered Categorical will return categories in the order of appearance. - >>> pd.unique(pd.Series(pd.Categorical(list("baabc")))) + >>> pd.unique(pd.Series(pd.Categorical(list('baabc')))) ['b', 'a', 'c'] Categories (3, object): ['a', 'b', 'c'] - >>> pd.unique(pd.Series(pd.Categorical(list("baabc"), categories=list("abc")))) + >>> pd.unique(pd.Series(pd.Categorical(list('baabc'), + ... categories=list('abc')))) ['b', 'a', 'c'] Categories (3, object): ['a', 'b', 'c'] An ordered Categorical preserves the category ordering. - >>> pd.unique( - ... pd.Series( - ... pd.Categorical(list("baabc"), categories=list("abc"), ordered=True) - ... ) - ... ) + >>> pd.unique(pd.Series(pd.Categorical(list('baabc'), + ... categories=list('abc'), + ... ordered=True))) ['b', 'a', 'c'] Categories (3, object): ['a' < 'b' < 'c'] An array of tuples - >>> pd.unique([("a", "b"), ("b", "a"), ("a", "c"), ("b", "a")]) + >>> pd.unique([('a', 'b'), ('b', 'a'), ('a', 'c'), ('b', 'a')]) array([('a', 'b'), ('b', 'a'), ('a', 'c')], dtype=object) """ values = _ensure_arraylike(values) From 72cf54306876ce023fc8bdd759a355f786728fc5 Mon Sep 17 00:00:00 2001 From: ShaharNaveh <> Date: Mon, 26 Apr 2021 15:58:15 +0300 Subject: [PATCH 09/12] Revert "Revert "Applied "black formatting" on the example code"" This reverts commit 6adfead166d4889f535415ed62c80272ae3ac5ae. --- pandas/core/algorithms.py | 40 +++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/pandas/core/algorithms.py b/pandas/core/algorithms.py index 498adea7d1a99..16ec2bb5f253c 100644 --- a/pandas/core/algorithms.py +++ b/pandas/core/algorithms.py @@ -375,48 +375,60 @@ def unique(values): >>> pd.unique(pd.Series([2] + [1] * 5)) array([2, 1]) - >>> pd.unique(pd.Series([pd.Timestamp('20160101'), - ... pd.Timestamp('20160101')])) + >>> pd.unique(pd.Series([pd.Timestamp("20160101"), pd.Timestamp("20160101")])) array(['2016-01-01T00:00:00.000000000'], dtype='datetime64[ns]') - >>> pd.unique(pd.Series([pd.Timestamp('20160101', tz='US/Eastern'), - ... pd.Timestamp('20160101', tz='US/Eastern')])) + >>> pd.unique( + ... pd.Series( + ... [ + ... pd.Timestamp("20160101", tz="US/Eastern"), + ... pd.Timestamp("20160101", tz="US/Eastern"), + ... ] + ... ) + ... ) ['2016-01-01 00:00:00-05:00'] Length: 1, dtype: datetime64[ns, US/Eastern] - >>> pd.unique(pd.Index([pd.Timestamp('20160101', tz='US/Eastern'), - ... pd.Timestamp('20160101', tz='US/Eastern')])) + >>> pd.unique( + ... pd.Index( + ... [ + ... pd.Timestamp("20160101", tz="US/Eastern"), + ... pd.Timestamp("20160101", tz="US/Eastern"), + ... ] + ... ) + ... ) DatetimeIndex(['2016-01-01 00:00:00-05:00'], dtype='datetime64[ns, US/Eastern]', freq=None) - >>> pd.unique(list('baabc')) + >>> pd.unique(list("baabc")) array(['b', 'a', 'c'], dtype=object) An unordered Categorical will return categories in the order of appearance. - >>> pd.unique(pd.Series(pd.Categorical(list('baabc')))) + >>> pd.unique(pd.Series(pd.Categorical(list("baabc")))) ['b', 'a', 'c'] Categories (3, object): ['a', 'b', 'c'] - >>> pd.unique(pd.Series(pd.Categorical(list('baabc'), - ... categories=list('abc')))) + >>> pd.unique(pd.Series(pd.Categorical(list("baabc"), categories=list("abc")))) ['b', 'a', 'c'] Categories (3, object): ['a', 'b', 'c'] An ordered Categorical preserves the category ordering. - >>> pd.unique(pd.Series(pd.Categorical(list('baabc'), - ... categories=list('abc'), - ... ordered=True))) + >>> pd.unique( + ... pd.Series( + ... pd.Categorical(list("baabc"), categories=list("abc"), ordered=True) + ... ) + ... ) ['b', 'a', 'c'] Categories (3, object): ['a' < 'b' < 'c'] An array of tuples - >>> pd.unique([('a', 'b'), ('b', 'a'), ('a', 'c'), ('b', 'a')]) + >>> pd.unique([("a", "b"), ("b", "a"), ("a", "c"), ("b", "a")]) array([('a', 'b'), ('b', 'a'), ('a', 'c')], dtype=object) """ values = _ensure_arraylike(values) From f4d79c64a597cf6fec13e2176a143229d373e70e Mon Sep 17 00:00:00 2001 From: ShaharNaveh <> Date: Mon, 26 Apr 2021 19:32:40 +0300 Subject: [PATCH 10/12] Make output on single line --- pandas/core/algorithms.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pandas/core/algorithms.py b/pandas/core/algorithms.py index 16ec2bb5f253c..8871badf0ac5d 100644 --- a/pandas/core/algorithms.py +++ b/pandas/core/algorithms.py @@ -398,9 +398,11 @@ def unique(values): ... ] ... ) ... ) - DatetimeIndex(['2016-01-01 00:00:00-05:00'], - dtype='datetime64[ns, US/Eastern]', - freq=None) + DatetimeIndex(\ +['2016-01-01 00:00:00-05:00'], \ +dtype='datetime64[ns, US/Eastern]', \ +freq=None\ +) >>> pd.unique(list("baabc")) array(['b', 'a', 'c'], dtype=object) From e080f95248bc5a305737342874b25f286cc97866 Mon Sep 17 00:00:00 2001 From: ShaharNaveh <> Date: Mon, 26 Apr 2021 19:33:06 +0300 Subject: [PATCH 11/12] Revert "Make output on single line" This reverts commit f4d79c64a597cf6fec13e2176a143229d373e70e. --- pandas/core/algorithms.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/pandas/core/algorithms.py b/pandas/core/algorithms.py index 8871badf0ac5d..16ec2bb5f253c 100644 --- a/pandas/core/algorithms.py +++ b/pandas/core/algorithms.py @@ -398,11 +398,9 @@ def unique(values): ... ] ... ) ... ) - DatetimeIndex(\ -['2016-01-01 00:00:00-05:00'], \ -dtype='datetime64[ns, US/Eastern]', \ -freq=None\ -) + DatetimeIndex(['2016-01-01 00:00:00-05:00'], + dtype='datetime64[ns, US/Eastern]', + freq=None) >>> pd.unique(list("baabc")) array(['b', 'a', 'c'], dtype=object) From c72ab22893244bf68f7cf885cfee18a03aca1f01 Mon Sep 17 00:00:00 2001 From: ShaharNaveh <> Date: Mon, 26 Apr 2021 22:37:02 +0300 Subject: [PATCH 12/12] Add the changed files to the CI test --- ci/code_checks.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ci/code_checks.sh b/ci/code_checks.sh index a2a108924a0f2..c178e9f7cecbe 100755 --- a/ci/code_checks.sh +++ b/ci/code_checks.sh @@ -110,10 +110,13 @@ if [[ -z "$CHECK" || "$CHECK" == "doctests" ]]; then pytest -q --doctest-modules \ pandas/core/accessor.py \ pandas/core/aggregation.py \ + pandas/core/algorithms.py \ pandas/core/base.py \ pandas/core/construction.py \ pandas/core/frame.py \ pandas/core/generic.py \ + pandas/core/indexers.py \ + pandas/core/nanops.py \ pandas/core/series.py \ pandas/io/sql.py RET=$(($RET + $?)) ; echo $MSG "DONE"