From 4f32f3990fbba0ee440af47e23a9354fdb7a0285 Mon Sep 17 00:00:00 2001 From: Kevin Sheppard Date: Fri, 12 Mar 2021 10:52:38 +0000 Subject: [PATCH] MAINT: Fix issues arising from future changes Fix issues due to changes in SciPy and pandas --- statsmodels/regression/tests/test_rolling.py | 6 ++++-- statsmodels/stats/descriptivestats.py | 8 +++++++- statsmodels/stats/stattools.py | 4 +++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/statsmodels/regression/tests/test_rolling.py b/statsmodels/regression/tests/test_rolling.py index 050de605f..f02e076d6 100644 --- a/statsmodels/regression/tests/test_rolling.py +++ b/statsmodels/regression/tests/test_rolling.py @@ -1,5 +1,6 @@ from io import BytesIO from itertools import product +import warnings import numpy as np import pandas as pd @@ -261,8 +262,9 @@ def test_plot(): res.plot_recursive_coefficient(variables="x4") fig = plt.Figure() - with pytest.warns(Warning): - # Just silence the warning + # Just silence the warning + with warnings.catch_warnings(): + warnings.simplefilter("ignore") out = res.plot_recursive_coefficient(fig=fig) assert out is fig res.plot_recursive_coefficient(alpha=None, figsize=(30, 7)) diff --git a/statsmodels/stats/descriptivestats.py b/statsmodels/stats/descriptivestats.py index 96d455ca1..d5ad2f2a5 100644 --- a/statsmodels/stats/descriptivestats.py +++ b/statsmodels/stats/descriptivestats.py @@ -446,8 +446,14 @@ class Description: else: iqr = mean + def _safe_jarque_bera(c): + a = np.asarray(c) + if a.shape[0] < 2: + return (np.nan,) * 4 + return jarque_bera(a) + jb = df.apply( - lambda x: list(jarque_bera(x.dropna())), result_type="expand" + lambda x: list(_safe_jarque_bera(x.dropna())), result_type="expand" ).T nan_mean = mean.copy() nan_mean.loc[nan_mean == 0] = np.nan diff --git a/statsmodels/stats/stattools.py b/statsmodels/stats/stattools.py index d349c472d..2ee1a6e0b 100644 --- a/statsmodels/stats/stattools.py +++ b/statsmodels/stats/stattools.py @@ -118,7 +118,9 @@ def jarque_bera(resids, axis=0): where n is the number of data points, S is the sample skewness, and K is the sample kurtosis of the data. """ - resids = np.asarray(resids) + resids = np.atleast_1d(np.asarray(resids, dtype=float)) + if resids.size < 2: + raise ValueError("resids must contain at least 2 elements") # Calculate residual skewness and kurtosis skew = stats.skew(resids, axis=axis) kurtosis = 3 + stats.kurtosis(resids, axis=axis) -- 2.32.0 From a9e21aef508ea98da8c5889547b8e5748986dae1 Mon Sep 17 00:00:00 2001 From: Kevin Sheppard Date: Wed, 7 Apr 2021 09:52:25 +0100 Subject: [PATCH] MAINT: Fix descriptive stats with extension dtypes Add special path for extension dtypes to remove N/A --- statsmodels/stats/descriptivestats.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/statsmodels/stats/descriptivestats.py b/statsmodels/stats/descriptivestats.py index d5ad2f2a5..0fd3eb542 100644 --- a/statsmodels/stats/descriptivestats.py +++ b/statsmodels/stats/descriptivestats.py @@ -441,8 +441,20 @@ class Description: loc = count > 0 mode_freq = np.full(mode.shape[0], np.nan) mode_freq[loc] = mode_counts[loc] / count.loc[loc] + # TODO: Workaround for pandas AbstractMethodError in extension + # types. Remove when quantile is supported for these + _df = df + try: + from pandas.api.types import is_extension_array_dtype + _df = df.copy() + for col in df: + if is_extension_array_dtype(df[col].dtype): + _df[col] = _df[col].astype(object).fillna(np.nan) + except ImportError: + pass + if df.shape[1] > 0: - iqr = df.quantile(0.75) - df.quantile(0.25) + iqr = _df.quantile(0.75) - _df.quantile(0.25) else: iqr = mean @@ -493,7 +505,8 @@ class Description: return results_df # Pandas before 1.0 cannot handle empty DF if df.shape[1] > 0: - perc = df.quantile(self._percentiles / 100).astype(float) + # TODO: Remove when extension types support quantile + perc = _df.quantile(self._percentiles / 100).astype(float) else: perc = pd.DataFrame(index=self._percentiles / 100, dtype=float) if np.all(np.floor(100 * perc.index) == (100 * perc.index)): -- 2.32.0