Release 0.15.0#
Release summary#
This note covers all changes merged into main between the v0.15.0.dev0
tag (2023-05-05) and the v0.15.0 release (2026-08-27).
statsmodels is using github to store the updated documentation. Two versions are available:
Stable, the latest release
Development, the latest build of the main branch
Warning
API stability is not guaranteed for new features, although even in this case changes will be made in a backwards compatible way if possible. The stability of a new feature depends on how much time it was already in statsmodels main and how much usage it has already seen. If there are specific known problems or limitations, then they are mentioned in the docstrings.
Release Statistics#
Issues closed: 358
Pull requests merged: 655
Non-merge commits: 1740
Contributors (by git log author, unique names): 171
Time span: 2023-05-05 through 2026-08-27
The Highlights#
SPEC-007: consistent use of rng for randomness#
statsmodels is standardizing on a single rng keyword for supplying
entropy (an integer seed, an array of integers, a NumPy Generator, or a
RandomState) wherever a model, estimator, or plotting function needs
randomness, in line with the community’s SPEC 007 convention. The older
random_state and seed keywords are deprecated in favor of rng.
Passing the old keyword still works and is transparently remapped to
rng, but it now raises a FutureWarning and will be removed in a
future release. This is one of the largest cross-cutting changes in this
release and touches, among others:
State space models (
MLEResults.simulate, simulation smoothers, impulse response simulation):random_state->rng.Distributions: copulas,
BernsteinDistribution,DiscretizedCount,MixtureDistribution, and relatedrvs-style methods:random_state->rng.MixedLM,nonlinls, GAM cross-validation, and severalsandboxdistributions:random_state->rng.Nonparametric estimation (
KDEMultivariate,KDEMultivariateConditional,KernelReg,KernelCensoredReg,TestRegCoefC/TestRegCoefD):seed->rng.VAR/SVAR/IRF simulation and Monte Carlo error bands (
varsim,VAR.simulate_var,VAR.plotsim,VARResults.irf_errband_mc,VARResults.irf_resim,SVARResults.sirf_errband_mc, and theIRAnalysis.plot/plot_cum_effects/errband_mc/err_band_sz1/err_band_sz2/err_band_sz3/cum_errband_mcfamily):seed->rng.ARDL.bounds_test,graphics.functional.hdrboxplot(seedandkernel_seed), andsandbox.panel.random_panel.PanelSample:seed->rng.The internal
statsmodels.tools.rng_qrng.check_random_statehelper (which also acceptsscipy.stats.qmc.QMCEngineinstances) is now used consistently across these code paths to turn whatever is passed viarnginto an actualGenerator/RandomStateinstance.
See Breaking Changes and Deprecations below for what this means for existing code. PR #9737, PR #9615, PR #9831, PR #9947, PR #9950
NamedTuple return values replace bare tuples#
Many statsmodels functions historically returned a plain tuple whose length
depended on the arguments passed, so that adfuller(x) and
adfuller(x, store=True) returned a different number of values. This makes
results hard to unpack defensively, hard to document, and hard to type.
These functions now return purpose-built NamedTuple result classes with a
fixed set of fields; fields that were not requested are None. Because a
NamedTuple is a tuple, positional unpacking, indexing and comparison
against plain tuples all continue to work, and field access such as
res.pvalue becomes available.
The migration follows a single rule:
Where the
NamedTupleunpacks exactly like the tuple it replaces, it is simply returned now, with no deprecation and no warning. This covers, among others,pacf/ccf/pccfwithalphaset,lagmatwithoriginal="sep",kdensity/kdensityfftwith the defaultretgrid=True,plot_partregresswithret_coords=True, and thestore=Truepaths of thestats.diagnostictests.Where adopting it would change how many values are unpacked, the legacy tuple is still returned and a
FutureWarningis raised. Passresult_object=Trueto opt in now, orresult_object=Falseto keep the current behaviour and silence the warning. The default changes in 0.16.
Functions whose result shape never varied were converted outright, with no
flag and no warning: block_jackknife, q_stat, pacf_burg,
levinson_durbin, levinson_durbin_pacf,
breakvar_heteroskedasticity_test, coint, cffilter, hpfilter,
hamilton_filter, forecast_interval, the IRF/SIRF error-band methods,
the ARIMA parameter estimators, and RegressionResults.compare_lr_test.
The migration was completed by converting the remaining Holder/
HolderTuple result objects across stats and robust (covariance
and scale estimators, proportion, rates, nonparametric,
multivariate, effect_size, oneway, and more) to documented
NamedTuple classes, and HolderTuple itself is now deprecated (see
Breaking Changes and Deprecations below). Where a converted class used to
support unpacking into a short tuple like statistic, pvalue = result, a
compat_2tuple_unpack decorator preserves that behaviour, with a
FutureWarning, during the transition.
PR #10025, PR #10027, PR #10029, PR #10030, PR #10031, PR #10035, PR #10072
Formula engine: patsy is no longer the only option#
statsmodels now has an abstracted formula-handling layer
(statsmodels.formula) that can use either patsy (the default engine
when it is installed, for backward compatibility) or formulaic as the engine behind the
formula interface (smf.ols("y ~ x", data=df), etc.). The engine can be
selected explicitly with the SM_FORMULA_ENGINE environment variable
("patsy" or "formulaic"). formulaic is now a required runtime
dependency (formulaic>=1.1.0) even when patsy continues to be used
as the default engine. This lays the groundwork for statsmodels to move away
from patsy, which has been in low-maintenance mode for several years.
PR #9423, PR #9470
Build system: meson-python replaces setuptools#
statsmodels’ build backend switched from setuptools (with a custom
setup.py) to meson-python.
Anyone building statsmodels from source needs Meson/Ninja available and a
build environment satisfying the new build requirements (numpy>=2.0,
scipy>=1.13, cython>=3.0.13). This does not affect users installing
prebuilt wheels from PyPI. PR #9634
Polars DataFrame support#
Models and the formula API now accept Polars
DataFrame/Series objects wherever pandas objects are accepted.
Polars input is converted to pandas at the data-entry point
(handle_data, and the formula-handling layer), so all internal
computation continues to use pandas/NumPy unchanged; column names, index
information, and predictions with Polars exog are preserved. Polars is
an optional dependency: code paths that do not receive Polars objects are
unaffected, and the relevant tests are skipped when Polars is not
installed. PR #9804
New robust estimation tools#
Several new robust estimators and supporting tools were added:
statsmodels.robust.covariance.CovDetMCD(minimum covariance determinant with deterministic starts),CovDetS(S-estimator for mean/covariance with deterministic starts), andCovDetMM(an MM-estimator built on top ofCovDetS). These are preliminary/experimental APIs. PR #9227, PR #8129statsmodels.robust.resistant_linear_model.RLMDetSMM, an MM-estimator for regression using S-estimator starting values, plus additional robust norms and supporting tools. PR #9186Fixes and additions to
scale.Huberand a new robust M-scale estimator. PR #9210
New models and statistical tests#
statsmodels.multivariate.multivariate_ols.MultivariateLS, a new multivariate least-squares model. PR #8919statsmodels.tsa.stattools.leybourneimplementing the Leybourne-McCabe stationarity test. PR #9399A two-sample z-test for the unequal-variances case. PR #8959
"one-sided"alternative hypotheses forproportion_confintandconfint_poisson. PR #9249, PR #9255Games-Howell post-hoc test added alongside a fix to Tukey’s HSD for the unequal-variance case. PR #9487
A sample-size calculation for the Wilcoxon/Mann-Whitney test. PR #9401
Order validation for the Hannan-Rissanen ARMA estimator. PR #9819
statsmodels.tsa.stattools.pccf, the partial cross-correlation function, together with a companionplot_pccf. PR #9802statsmodels.tsa.filters.hamilton_filter.hamilton_filter, Hamilton’s regression-based alternative to the HP filter. PR #9957, PR #9991statsmodels.tsa.stattools.block_jackknife, a delete-k (block) jackknife estimator of bias and standard error. PR #10001ARDLmodels can now use a"ctt"trend. PR #9518x13_arima_analysisgained seasonality fit diagnostics and an optional raw spec parameter. PR #9498, PR #9550A Jonckheere-Terpstra test for ordered k-sample alternatives (
statsmodels.stats.nonparametric.jonckheere_terpstra), following Terpstra (1952) and Jonckheere (1954). PR #9874, PR #10067, PR #10075A Diebold-Mariano test for equal predictive accuracy of two forecasts (
statsmodels.tsa.stattools.diebold_mariano_test), with an optional Harvey et al. (1997) small-sample correction. PR #10066A Pesaran-Timmermann test of directional predictive accuracy (
statsmodels.stats.diagnostic.pesaran_timmermann). PR #10055Local false discovery rate estimation (
statsmodels.stats.multitest.local_fdr_correction), based on the Grenander estimator of the p-value density. PR #10069
New and improved plots#
statsmodels.graphics.tsaplots.plot_ccfandplot_accf_gridfor plotting cross-correlations and cross-correlation matrices, andccfgained an option to return confidence intervals. PR #8782, PR #8783statsmodels.graphics.tsaplots.seasonal_diagnostic_plot, a new seasonal diagnostic plot. PR #9787statsmodels.graphics.regressionplots.add_ellipsefor adding confidence ellipses to scatter plots. PR #9815qqplot_2samplesaccepts additional plot keyword arguments. PR #9544
GLM and other model enhancements#
GLMResults.get_margeff(marginal effects for GLM). PR #8889GLM models now preserve the names of input pandas Series. PR #9130
het_whitegained an option to omit interaction (cross) terms. PR #9691Faster computation of state space “news”/revision impacts, and a significant performance optimization of VECM to avoid an \(O(T^2)\) projection matrix. PR #8937, PR #9720
statsmodels.stats.stattools.medcouplegained an \(O(N \log N)\) algorithm (use_fast=True, the default), replacing the previous \(O(N^2)\) implementation, which remains available viause_fast=False. PR #9571
Platform and packaging compatibility#
Cython 3 compatibility, and compatibility of the
tsa.statespaceCython code with SciPy ILP64 builds. PR #9078, PR #9798Experimental Pyodide/WebAssembly support and CI jobs. PR #9270, PR #9343
Free-threaded (no-GIL) CPython compatibility work, including free-threading-compatible Cython modules and CI coverage. PR #9717
Stricter input validation for string-valued options#
Late in the release cycle, essentially every string-valued parameter that
accepts a fixed set of options (method, alternative, trend, and
similar) was audited and, where it wasn’t already, routed through
statsmodels.tools.validation.string_like with an explicit
options= tuple (PR #10161, plus follow-ups PR #10167, PR #10173).
This is the largest single change in this release by number of call sites
touched, and it changes behavior in two distinct ways:
Previously-silent bad input now raises a clean, documented
ValueError. A number of functions had validation gaps where an unrecognized string either silently fell through to a default branch (for exampleVECM’sdeterministic,seasonal_decompose’smodel, andoneway’suse_varfamily) or produced a confusingKeyError/NameErrorinstead of the documented error (for examplevalidate_estimator). Code that was accidentally relying on one of these fallback paths, rather than passing a value from the documented{...}set, will now see aValueErrorwhere it previously ran (possibly incorrectly) without complaint.Undocumented short-form aliases now emit a
FutureWarninginstead of working silently. The most widespread example is thealternativeparameter used throughoutstatsandtsafor hypothesis-test direction ("two-sided"/"larger"/"smaller", or"increasing"/"decreasing"/"two-sided"for heteroskedasticity tests): informal short forms such as"2s","l","s","i","inc","d","dec", or"2"were accepted but never documented. These still work in 0.15.0, but now raise aFutureWarningnaming the documented spelling to switch to, and will stop being accepted after statsmodels 0.16 (PR #10170, PR #10180). This affects, among others,DescrStatsW/CompareMeansand the module-levelztest/zconfint/ztost/ttest_ind/ttost_indfunctions instatsmodels.stats.weightstats,het_goldfeldquandt,breakvar_heteroskedasticity_test(and the state space/ETStest_heteroskedasticitymethods built on it),PredictionResults.t_test/PredictionResultsBase.t_test, most ofstatsmodels.stats.power, several functions instatsmodels.stats.proportionandstatsmodels.stats.rates,confint_noncentrality,effectsize_2proportions(whosestatisticparameter separately gained"rd"/"rr"/"or"/"arcsine"as deprecated aliases for"diff"/"risk-ratio"/"odds-ratio"/"arcsin"), andksstat(whosealternativegained deprecated aliases for thescipy.stats.kstest-style spellings"two_sided"/"less"/"greater"). Pass the documented spelling to silence the warning; the deprecated forms will be removed, not just undocumented, starting after statsmodels 0.16.
A few consequential bug fixes#
A few of the more consequential correctness fixes in this release (see Notable Bug Fixes below for the full list):
families.Binomial.deriv()was missing a division bynand returned an incorrect value; it now correctly returns1 - 2 * mu / n. PR #9862The log-likelihood computation for
ETSModelwas corrected. PR #9400A state space model transition-timing bug was fixed. PR #9688
anova_lmsilently returnedNaNp-values when models were passed in reverse order. PR #9852Numerical instability in VIF was fixed by standardizing the design matrix before computing it. PR #9835
wald_test_termsreported the raw number of constraint rows asdf_constraint, rather than the rank-adjusted degrees of freedom thatwald_testitself already computes; this was wrong for rank-deficient models (e.g. incomplete factorial designs). PR #9907The adjusted (unbiased)
ccovf/acovfnormalized bylen(x) - krather than by the actual number of overlapping observation pairs, which is only the same thing when the two series are equal length. PR #9916breakvar_heteroskedasticity_test(and the state space/ETStest_heteroskedasticitymethods built on it) referred the ratio of two sums of squares directly toF(numer_dof, denom_dof); that ratio is onlyF-distributed after rescaling bydenom_dof / numer_dof, so p-values were wrong whenever missing observations left the two subsets with different numbers of usable residuals. Balanced samples were unaffected. PR #10171Every
TreatmentEffectResultsproduced byTreatmentEffect’sra/aipw/aipw_wls/ipw_ramethods was labeled.method = "IPW", regardless of which method actually produced it. Each method now labels its own result correctly. PR #10164BinomialBayesMixedGLM.fit/PoissonBayesMixedGLM.fit(documented as equivalent tofit_map) calledfit_mapand discarded its return value, so.fit()always returnedNoneinstead of the fitted results instance – any code using the documented.fit()entry point (rather than calling.fit_map()directly) could not get a usable result. PR #10195The state space univariate filter/smoother (used for exact diffuse initialization, and as the automatic fallback whenever the multivariate filter hits a singular forecast-error covariance) computed the smoothed measurement disturbance in a whitened basis and never transformed it back, so
smoothed_measurement_disturbancewas wrong by an observation-dependent factor for any model that exercised this code path – off by as much as 124 in one of the affected test cases. The corresponding disturbance covariance cannot be recovered the same way from what the univariate recursions compute, so that quantity now raises a warning instead of silently returning a value in the wrong basis. PR #9979GLS.hessian_factorreturned incorrect values for both non-scalarsigmacases: for a 1-d (heteroskedastic-weights)sigmait returned the whitening factor1 / sqrt(sigma)instead of the Hessian weight1 / sigma(PR #10196), and for a full 2-d (non-diagonal)sigmaits output does not correspond to the actual Hessian at all; rather than continue to return a plausible-looking but wrong answer, the 2-d case now raisesNotImplementedError(PR #10203, see Breaking Changes and Deprecations below).In the non-IRLS gradient-optimizer path of
GLM.fit, the fallback that is supposed to reusenormalized_cov_paramswhen the observed Hessian cannot be inverted was unreachable dead code, sobse/cov_params()silently came back as all-NaNany time the Hessian inversion failed, even though a usable covariance estimate from the optimizer was available. PR #9794LikelihoodModel.fit(method="newton")used the opposite sign convention from every other optimizer for its internal score/Hessian closures. This made no difference to the Newton step itself, but it meant theridge_factorHessian regularization (used to stabilize the solve when the Hessian is poorly conditioned) was applied with the wrong sign – shrinking the regularized Hessian’s magnitude instead of increasing it, the opposite of what regularization is supposed to do. This is most consequential for models fit with a non-defaultridge_factoror a near-singular Hessian. PR #10184TweedieGLM log-likelihood (1 < var_power < 2, the compound Poisson-Gamma case commonly used for claim-severity/insurance-style data) computedlog(wright_bessel(...)), which overflows toinfbefore the log is taken for a range of realisticendog/mu/scale combinations, silently producing an infinite or garbage log-likelihood. Fixed by usingscipy.special.log_wright_besseldirectly, which does not have this overflow. Requires SciPy >= 1.14 to take effect; on older SciPy (or 32-bit platforms, wherelog_wright_besselis not accurate enough) the previous, overflow-prone computation is still used. PR #10179, PR #10186, PR #10188HurdleCountModel.fitpassed its caller’sstart_paramsunsplit to both of its two component models, so anystart_paramsof the documented, whole-model length raised a shape-mismatch error from deep inside the optimizer instead of fitting. It is now split the same wayfit_regularizedalready splits it. The same fix also makesfit_regularizedreport the joint refit’s own convergence flag (previously overwritten by the two component fits’ flags) and makes the L1-penalized solver’s Hessian-inversion fallback raise on a non-finite (rather than merely singular) Hessian instead of silently proceeding with aNaNcovariance. PR #10205ARDLResults.apply/appendraised for a model that originally had noexogand was applied to a series with noexogeither – a legitimate no-op round trip – and, separately, its two specific, documentedexog-mismatch errors were unreachable for most of the mismatches they describe because model reconstruction failed first with an unrelated, confusing error. PR #10207
Breaking Changes and Deprecations#
Previously-silent wrong results now raise or warn#
A few of the correctness fixes described above change what a call does, not just the numbers it returns, because the previous behavior had no correct fallback:
GLS.hessian_factor(and anything built on it, e.g.GLS.hessian) raisesNotImplementedErrorfor a full 2-d (non-diagonal)sigma, instead of silently returning a value that does not correspond to the actual Hessian. The 1-d (heteroskedastic-weights) and scalarsigmacases are unaffected and continue to work. PR #10203The state space simulation smoother’s smoothed measurement disturbance covariance (as opposed to the disturbance itself, which is now computed correctly, see above) cannot be recovered in the original basis from what the univariate filter/smoother computes, so requesting it now raises a warning instead of silently returning a value in the wrong basis. PR #9979
psturng(the studentized range p-value approximation underlying Tukey’s HSD and the Games-Howell test) raisesValueErrorfor degrees of freedom1 <= v < 2combined with a very small p-value, instead of returning a fabricated0.1. Neither R’sptukeynor the literature this implementation follows supports a real computation in that region. PR #7327MixedLM.fit’s warning for keyword arguments it does not recognize changed fromRuntimeWarningtoFutureWarning, and now states that a future version will raise instead of dropping the argument. Code that specifically filtersRuntimeWarningto silence this message will need to filterFutureWarninginstead. PR #9695
seed/random_state -> rng (SPEC-007)#
As described above, wherever a function or model previously accepted
seed or random_state to control randomness, it now accepts rng
instead. The old keyword names still work but emit a FutureWarning
pointing at rng; they will be removed in a future release. If your code
passes seed= or random_state= by keyword to statsmodels functions,
you should switch to rng= to avoid the warning (and future breakage).
Positional usage is unaffected in most cases since rng occupies the same
position the old keyword did.
Variable-length tuple returns become NamedTuples#
As described above, functions that returned a tuple whose length depended on
their arguments are moving to fixed-shape NamedTuple results. Where the
NamedTuple unpacks exactly like the tuple it replaces there is nothing to
do: existing code keeps working and no warning is raised.
Where adopting it would change how many values are unpacked, the affected
call now emits a FutureWarning and continues to return the legacy tuple.
This applies to:
adfuller,kpss,range_unit_root_test(store=False), andacfwhen only one ofqstatoralphais given.yule_walker(inv=False) andOLSResults.el_test.acorr_lm,acorr_breusch_godfrey,het_arch,compare_cox,compare_jandhet_goldfeldquandtwithstore=False.kdensityandkdensityfftwithretgrid=False, andplot_partregresswithret_coords=False.
Pass result_object=True to adopt the new result now, or
result_object=False to keep the old return type and silence the warning.
The default becomes the NamedTuple in 0.16.
RegressionResults.compare_lr_test always returned three values, so it was
converted directly to a CompareLRTestResult with no deprecation period; it
still unpacks as a three-tuple.
HolderTuple deprecated#
statsmodels.stats.base.HolderTuple, used internally as the return type
for many statistical tests before the NamedTuple migration above, is now
deprecated and will be removed after statsmodels 0.16. It is no longer
constructed anywhere internally. Code that checked
isinstance(result, HolderTuple) or relied on HolderTuple’s specific
2-tuple-unpacking behaviour should switch to the documented NamedTuple
result class and named attribute access (e.g. result.statistic,
result.pvalue) instead. PR #10072
Undocumented alternative short forms deprecated#
As described above (Stricter input validation for string-valued options),
short, undocumented spellings of the alternative hypothesis-direction
parameter ("2s", "l", "s", "i", "inc", "d", "dec",
"2", and a few compare/statistic aliases in
meta_analysis and
_lilliefors) now raise a FutureWarning naming
the documented replacement instead of working silently, and will be removed
after statsmodels 0.16. PR #10170, PR #10173, PR #10180
Several previously-undocumented, silently-accepted string values elsewhere
were similarly tightened to raise ValueError for anything outside the
documented set – this is a validation fix, not a deprecation, so there is no
warning period; code passing a value outside the documented {...} set
needs to be corrected directly. PR #10161, PR #10167
Unused estimator classes deprecated#
The following classes and one function were found, during a systematic
coverage audit, to have no callers anywhere in the codebase and no test
coverage. They now raise a FutureWarning on construction/use and will be
removed after statsmodels 0.16: NonlinearLS, MLEGLS, TSMLEModel,
GLSHet, GLSHet2, TsaDescriptive, and the _Var class in
tsa.varma_process (whose own docstring already called it “Obsolete”).
nonparametric.smoothers_lowess_old.lowess gets the same treatment as a
function – its own docstring examples already point at the actively
maintained statsmodels.nonparametric.lowess. If you rely on any of
these, please open an issue. PR #10156
FactorResults.uniq_stderr is now a method, not a property#
FactorResults.uniq_stderr previously accepted a documented kurt
argument that could never actually be supplied, because the method was
wrapped in @cache_readonly and so was only ever accessed as a bare
attribute (result.uniq_stderr). The cache_readonly wrapper has been
removed so kurt is usable as documented; this means existing code must
change result.uniq_stderr to result.uniq_stderr(). There is no
deprecation period for this one, since the old attribute-style access could
never have supplied kurt correctly in the first place. PR #10175
Minimum dependency versions raised#
NumPy: 1.18 -> 1.23.5
SciPy: 1.4 -> 1.8
pandas: 1.0 -> 1.4
patsy: 0.5.2 -> 0.5.6
formulaic: new required runtime dependency, >=1.1.0Building from source now requires NumPy >= 2.0, SciPy >= 1.13, and Cython >= 3.0.13 (see the meson-python migration above). This does not affect users installing wheels from PyPI.
Deprecated parameters removed entirely#
The following previously-deprecated (not previously-working) parameters and behaviors were removed as part of a general deprecation clean-up (PR #9936):
grangercausalitytests: theverboseparameter (deprecated since 0.14) has been removed. The function no longer prints results; use the returned dictionary as before.AutoReg/ar_select_order: theold_namesparameter (pre-0.12 variable naming, deprecated since 0.13) has been removed.kpss: passingnlags=Nonenow raises aValueErrorinstead of warning and silently falling back to'auto'. Pass'auto','legacy', or an explicit integer.A number of internal compatibility shims for very old NumPy/SciPy/Python versions were removed from
statsmodels.compat, includingcompat.numpy.lstsq,NP_LT_114,compat.python.asstr,asunicode,lfilter, andcompat.scipy.SP_LT_16/SP_LT_17(along with the vendoredmultivariate_tfallback they guarded). These were internal implementation details, not public API, but could have been imported directly.
Vendored pandas private APIs#
pandas has been privatizing or removing several small utilities that
statsmodels relied on (cache_readonly, deprecate_kwarg,
Appender, Substitution). statsmodels now vendors its own copies of
these (in statsmodels.compat.pandas and
statsmodels.tools.docstring_helpers) so behavior stays stable across
pandas versions, including pandas 3. PR #9615, PR #9820, PR #9831
Other removals#
New Features and Enhancements#
Enhancements
Outlier-robust covariance estimation. PR #8129
ccfcan optionally return confidence intervals. PR #8782Plot cross-correlations and the auto/cross-correlation matrix. PR #8783
Plot the prediction curve over a scatter plot in
GLMGamResults.plot_partial. PR #8881Add
get_margeffto GLM. PR #8889Add
MultivariateLS. PR #8919Faster computation of state space revision impacts. PR #8937
Two-sample z-test, unequal-variances case. PR #8959
Improve lag selection in
pacf. PR #9016Add Cython 3 compatibility. PR #9078
GLM models now save the names of input pandas Series. PR #9130
Robust: additional tools and norms. PR #9186
Add
CovDetMCD,CovDetMM,RLMDetSMM, and related estimators. PR #9227Add a
"one-sided"alternative forproportion_confint. PR #9249Add an alternative option to
confint_poisson. PR #9255Add optional parameters to
summary_colto indicate fixed effects. PR #9280Ensure returned arrays are owned (not views). PR #9334
Improve precision of a diagnostic printout (
mean_diff:.3g). PR #9388Add the Leybourne-McCabe stationarity test. PR #9399
Add a sample-size calculation for Wilcoxon/Mann-Whitney tests. PR #9401
More reliable casting of pandas data. PR #9407
Add an abstracted formula engine supporting
patsyandformulaic. PR #9423Add
rufflint support. PR #9453x13_arima_analysiscan produce seasonality fit diagnostics. PR #9498Allow the ARDL model to use a
"ctt"trend. PR #9518Add plot keyword arguments to
qqplot_2samples. PR #9544x13_arima_analysisgained an optional raw spec parameter. PR #9550Support array-like and pandas-like data more broadly. PR #9582
Add a “no cross terms” option to White’s heteroscedasticity test. PR #9691
Add missing attributes to
AutoReg. PR #9750Add a seasonal diagnostic plot to
graphics.tsaplots. PR #9787Make
tsa.statespaceCython usage compatible with SciPy ILP64 builds. PR #9798Allow seasonal-differencing-only models with non-seasonal estimators. PR #9811
Add
add_ellipseto graphics, and support passingx/yarrays. PR #9815Add order validation to the Hannan-Rissanen estimator. PR #9819
Vendor
AppenderandSubstitutiondocstring helpers from pandas. PR #9820Vendor
cache_readonlyanddeprecate_kwargfrom pandas’ private API. PR #9831Report the last root-finder value in the
solve_powerconvergence warning. PR #9885Consistently use
rngto move towards SPEC-007. PR #9950Add the partial cross-correlation function
pccfandplot_pccf. PR #9802Add the Hamilton filter. PR #9957
Add a delete-k (block) jackknife estimator. PR #10001
Allow pre-calculated error bands to be passed to the IRF plots. PR #9816
Support
fixed_paramsininnovations_mle. PR #9845Raise an informative error for impossible one-sided
solve_powercases. PR #9895Add a
min_diagoption tocov_nearestfor zero or negative diagonal entries. PR #9898acf/pacfaccept a list of lags in addition tomaxlag. PR #10016Return
NamedTupleresults in place of variable-length tuples. PR #10025, PR #10027, PR #10029, PR #10030, PR #10035, PR #10072Accept Polars
DataFrame/Seriesinput in models and the formula API. PR #9804Add the Jonckheere-Terpstra ordered trend test. PR #9874
Add the Diebold-Mariano test of equal predictive accuracy. PR #10066
Add the Pesaran-Timmermann test of directional predictive accuracy. PR #10055
Add local false discovery rate estimation (
local_fdr_correction). PR #10069Add
LocalProjections, a Jordà (2005) local-projections estimator for impulse response functions with Newey-West HAC standard errors. PR #9871Implement an L1-penalized solver for GLM. PR #10101
Add CRV3 (cluster-jackknife) cluster-robust inference for
OLS/WLS. PR #10103Warn when
exogis (numerically) singular in the*LSmodel family, instead of silently returning an unreliable fit. PR #10140Make the
ndimcheck inarray_likeorthogonal tomaxdim, so the two can be combined instead of one silently overriding the other. PR #10090NominalGEEaccepts non-numericgroupslabels (for example strings), instead of failing to cast them tofloat64internally. PR #10182Robust linear model (
RLM) scale-estimator callables passed viascale_estmay now optionally accept the fitted model and residuals, in addition to the previously-supported single-argument (residuals only) form, which continues to work unchanged. PR #10191Add
fit_regularizedtoHurdleCountModel. PR #10204MICEDatais now iterable: each iteration step advances the chain by one update cycle and yields the current imputed dataset, soitertools.islice(mice_data, n)producesnsuccessive imputed datasets. PR #10210
Performance
Notable Bug Fixes#
Fix a typo in the
InfeasibleTestErrorexception string. PR #8878Correct diagnostics for changes in pandas. PR #8887
MNLogit Wald tests: fix
ravel, stringcov_names. PR #8907Fix writing a read-only array under pandas 2 copy-on-write. PR #8942
Fix an issue in
seasonal.py. PR #9029Ensure ARIMA simulation is reproducible. PR #9165
Fix
scale.Huberand add a robust M-scale. PR #9210Correct
cov_kwargs->cov_kwds. PR #9240Ensure the Zivot-Andrews test does not overwrite its input. PR #9311
Avoid an in-place modification bug. PR #9385
Correct
residfromUECM. PR #9390Correct the x/y label location in
qqplot_2sample. PR #9394Remove an incorrect
methodassignment in GLM’ssummary2. PR #9396Ensure the Hessian is skipped where appropriate. PR #9398
Correct the log-likelihood computation for
ETSModel. PR #9400Ensure VAR can forecast with 0 lags. PR #9413
Correct
DatetimeIndexhandling. PR #9457Correct handling of
PeriodIndexinseasonal_decompose. PR #9461SVAR: fix
A/Bdtype and a one-parameter score shape bug. PR #9468Fix formula
evaldepth in model selection. PR #9471Tukey’s HSD: fix an unused variance and add Games-Howell for the unequal-variance case. PR #9487
Fix a bug in
Runs.runs_testfor the case of a single run. PR #9524Make the Binomial family more robust to the corner case
mu=0,endog=0. PR #9581Fix the
add_trenderror message to correctly identify constant columns. PR #9636Fix conversion of 1-d arrays to scalars. PR #9673
Fix a state space model transition-timing bug. PR #9688
Pass
alphathrough toplot_predict. PR #9728Fix an incorrect length comparison in endpoint transformation logic. PR #9729
Fix compilation errors in
statespace/meson.build. PR #9738Fix patsy
eval_envhandling inFormulaManager. PR #9739Raise an error for invalid
endoginput inemplike.DescStat. PR #9747Add an informative error message when Hessian inversion fails in
fit_regularized. PR #9757Replace bare
exceptclauses withexcept Exception. PR #9758Treat empty docstrings as
Nonein theDocstringclass. PR #9773Fix
use_boxcoxcontrol flow inExponentialSmoothing.fit. PR #9797Override the
residproperty inUECMResults. PR #9812Avoid a division by zero in
estimate_location. PR #9814L-BFGS-B: respectdisp=Falseinstead of always printing output. PR #9823Remove a dead assignment to
cov_pin GLM’sfit. PR #9826Fix the
GLMInfluence.hat_matrix_diagmethod name. PR #9830Fix VIF numerical instability by standardizing the design matrix. PR #9835
Skip summary diagnostics when
slim=True. PR #9844Fix
anova_lmsilently returningNaNp-values when models are passed in reverse order. PR #9852Set
k_exog_useronSVARResultssosummary()works. PR #9853Fix
Binomial.deriv()to correctly return1 - 2*mu/n(it was missing the division byn). PR #9862Record the robust scale in
RLM.fit_history. PR #9866Fix the
NegativeBinomialcheck for the optionalalphaparameter. PR #9877Return
nanfromPower.solve_powerwhen it fails to converge, rather than a misleading value. PR #9884Correct several parameter names in docstrings (
prob_infl,bin_edges,pred_kwds,param_nums,mu1_low). PR #9886Fix
DiscreteResultscrashing withfull_output=0. PR #9887Fix an
ccovfshape mismatch for arrays of different lengths. PR #9888describe/Descriptionnow handle a 0-row (empty) input gracefully. PR #9899Fix an issue with random generation. PR #9901
Attach
mlefitattributes to the results instance so they appear indir(). PR #9902Do not pass
hesstoL-BFGS-B/TNCin_fit_minimize, which do not accept it. PR #9908Read the entropy integration limits from the kernel. PR #9919
Populate
_retain_colsinout_of_samplewithout requiring a priorin_samplecall. PR #9920Correct a test that relied on the removed random-state singleton. PR #9924
Fix an import failure when matplotlib is not installed. PR #9925
Unify
group_sumsorientation and fixgroup_demean. PR #9933Fix the
scaleattribute andresid_pearsonfor a fixed-scalecov_type. PR #9824Pass
axthrough todot_plotinCombineResults.plot_forest. PR #9829Filter unsupported keyword arguments in
MixedLM.fitinstead of raising anAttributeError. PR #9906Fix a Sison-Glaz confidence-interval failure for small or sparse counts. PR #9909
Fix the removal of the
compatlstsqshim. PR #9958Raise on non-2x2 tables in
stats.mcnemar. PR #9974Respect caller warning filters in the discrete
fit_regularized(l1) path. PR #9976Reject
Noneinstring_likeandarray_likeunlessoptional=True. PR #9985, PR #9987Do not re-validate the specification when extending SARIMAX results, so an
exogconstant column no longer blocksextend. PR #9992score_testreturns a documentedNamedTupleresult rather than a plain tuple (see the NamedTuple return values highlight above). PR #9993, PR #10072Select the correct axis in
drop_missing. PR #9994Ensure
AutoReg(and other)summary()calls still work afterremove_data(). PR #10002, PR #10009Report the correct accepted types in
dict_like. PR #10005Clip Wilson
proportion_confintbounds to[0, 1]. PR #10010Give
sign_testa clear error when every observation ties withmu0. PR #10012multipletestsno longer raisesZeroDivisionErroron an empty p-value array. PR #10013maxabsandiqrno longer raise on empty input, matching the othereval_measures. PR #10014Use the non-missing sample size for the
acfconfidence interval and Q-statistic when NaNs are handled. PR #10017Raise an explicit error rather than dividing by zero in
acf/acovf. PR #10020linear_rainbow(..., use_distance=True)now centers on the exog centroid, so the result no longer depends on the arbitrary order observations happen to be stored in. PR #9903ARDLResults.apply/appendlost the per-variable exog lag order, because they inheritedAutoRegResults.apply, which always reconstructs the cloned model as a plainAutoReg. PR #9915The adjusted
ccovfdivided bylen(x) - kinstead of the actual number of overlapping observation pairs. PR #9916wald_test_termsnow reports the rank-adjusted degrees of freedom for rank-deficient models instead of the raw constraint-matrix row count. PR #9907Cast the
np.repeatargument to platformintpsize in the Jonckheere-Terpstra test so it works on 32-bit platforms (Pyodide). PR #10075breakvar_heteroskedasticity_test(and the state space and ETStest_heteroskedasticitymethods built on it) referred the raw ratio of the two sums of squares toF(numer_dof, denom_dof). The ratio of sums is thatFonly after rescaling bydenom_dof / numer_dof, so the p-values were wrong whenever missing observations left the two subsets with different numbers of usable residuals – for example a multivariate state space model with a ragged edge. Theuse_f=Falsevariant had its multiplier and its degrees of freedom interchanged, and thedecreasingalternative did not swap the degrees of freedom when it inverted the statistic. Balanced samples, which is the usual case, are unaffected.Fix edge cases in the \(O(N \log N)\)
medcouplepath. PR #10084Check the sign of the smallest eigenvalue before taking its square root when forming a condition number, instead of letting a tiny negative value (floating-point noise) raise. PR #10088
Fix
MNLogit.resid_responseraisingValueErrorinstead of returning residuals. PR #10089Forward a kwarg that
MixedLM.from_formulawas silently dropping instead of passing to the superclass constructor. PR #10105Pivot the QR factorization used in
tools.matrix_rank, so rank is computed correctly for matrices that need pivoting for numerical stability. PR #10106Fix numerous small bugs in
robust.norms,RLM, andstats.stattools. PR #10113Add a missing
selfin anETSModelupdate path. PR #10120Correct the
distargsusage inrobust.scale.scale_trimmed. PR #10130Fix a line-style bug in the Bland-Altman agreement plot. PR #10131
Enable the
percentileoption in_select_sigmafor kernel bandwidth selection. PR #10132Fix a sign/orientation bug (
factor.pyreversed the intended direction). PR #10133Only initialize the trend component in exponential smoothing when the model actually has one. PR #10134
Correct the Hessian choice in
othermod.betareg. PR #10135Ensure the bar gap size is computed correctly in
mosaic_plot. PR #10136Ensure
SVARraises for options it does not actually implement, instead of silently ignoring them. PR #10137Fix several bugs found in a systematic full-codebase scan, including in
MixedLMandstats.multivariate_tools. PR #10139Fix additional small bugs, including in
iolib.table. PR #10141Correct the shape of the values returned by
CanCorr. PR #10143Fix
OLSInfluence._ols_xnoticrashing on every call. PR #10152Fix
RLMDetSMM.fitcrashing with its own documentedh=Nonedefault. PR #10154Fix
MICEDatausing the observed-row index instead of the full index when buildingpredict_miss_kwds. PR #10163Guard against
zero_kwds=Noneineffectsize_2proportions. PR #10165Fix a crash in SARIMAX time-varying regression when the state vector also includes differencing. PR #10172
Coerce the
offsetargument witharray_likeinPoissonZiGMLE, instead of failing on plain Python sequences. PR #10174Coerce
cov_nullwitharray_likeinstats.multivariateinstead of requiring a NumPy array. PR #10176get_predictionfor GLM-like models now always has a linear predictor available when one is requested. PR #10178Correct the knot-centering computation in
get_knots_bsplinesfor splines with few interior knots, where it previously produced incorrect (non-equally-spaced) knots or raised. PR #10177Pass
transformedthrough to the likelihood when computing theMarkovSwitchingHessian, matchingscore. PR #10187, Issue #10148wald_test(chi-square path, the default) raisedAttributeErrorfor any results class without adf_residattribute, such asMarkovRegressionResults/MarkovAutoregressionResults, even thoughdf_residis only needed for the F-test (use_f=True) path. PR #9297BinomialBayesMixedGLM.fit/PoissonBayesMixedGLM.fitalways returnedNoneinstead of the fitted results instance (see Breaking Changes and Deprecations above).VariedCovStruct.summary()(ingenmod.cov_struct) printed directly instead of returning a string like the other covariance-structuresummary()methods. PR #10195GLS.hessian_factorwas wrong for both non-scalarsigmacases, andProcessMLE.covariance()omitted theexp()link transform on the scale/smoothing parameters for models not built from a formula, silently producing wrong (and sometimesNaN, through a negative variance) covariance matrices. PR #10196; see also PR #10203 and Breaking Changes and Deprecations above.In the non-IRLS gradient-optimizer path of
GLM.fit, a validnormalized_cov_paramsfallback was discarded whenever the observed Hessian could not be inverted, sobsecame back all-NaNeven though a usable covariance estimate existed. PR #9794The
ridge_factorHessian regularization inLikelihoodModel.fit(method="newton")was applied with the wrong sign for the “newton” branch specifically. PR #10184Fix the
TweedieGLM log-likelihood overflowing toinffor1 < var_power < 2by usingscipy.special.log_wright_bessel(SciPy >= 1.14). PR #10179, PR #10186, PR #10188psturng/Tukey’s HSD/Games-Howell: raise a clear error instead of returning a fabricated p-value for degrees of freedom1 <= v < 2with an extreme statistic; also fixes wording in related error messages. PR #7327MNLogit.score_test(exog_extra=...)crashed withAttributeErrorbecauseMNLogitdid not implementscore_factor/hessian_factor. PR #10185emplikeAFT.predictusedendogwhere it meantexog, so passing new data to predict from raised or produced nonsensical output. PR #10197Two contour-plotting bugs in
emplikedescriptive statistics:DescStatUV.plot_contour’s default levels were in decreasing order, which recent Matplotlib rejects outright, andDescStatMV.mv_mean_contourcontoured the unbounded-2log log-likelihood ratio against levels documented as significance levels instead of the already-computed p-value, making the plotted region degenerate. PR #10197rvs_kernel’s Beta-kernel perturbation step ignored therngargument and always drew from SciPy’s global default state, so two calls with identically-seeded generators did not reproduce the same output. PR #10198Representation.initialize_componentsraisedTypeErroron every call (missing the requiredk_statesargument in its internalInitialization.from_componentscall). PR #10200miso_lfilterselected the wrong output column for any number of input variables other than 2 or 3 (anIndexErrorfor 1 variable, silently wrong output with no error for 4 or more). PR #10201HurdleCountModel.fitnow splitsstart_paramsbetween its zero and main components instead of passing the full vector to both, andfit_regularizedreports the joint refit’s own convergence flag; the L1-penalized solver also raises on a non-finite Hessian instead of silently returning aNaNcovariance. PR #10205ARDLResults.apply/appendno longer raises on a legitimate no-exog-to-no-exoground trip, and itsexog-mismatch error messages are now actually reachable. PR #10207
Build, Packaging, and Infrastructure#
Migrate the build backend from
setuptools/setup.pytomeson-python. PR #9634Update minimum dependency versions (multiple passes). PR #9110, PR #9112
Add experimental Pyodide/WebAssembly support and CI jobs, including fixing an OpenBLAS symbol error under Emscripten. PR #9270, PR #9343
Avoid non-deterministic ordering in
include_dirslists (reproducible builds). PR #9296Further clean-up of the build configuration. PR #9632
Generate free-threading (no-GIL) compatible Cython modules. PR #9717
Ensure the
libmC math library is linked for all build targets. PR #9778Remove the
oldest-supported-numpybuild workaround now that NumPy 2 is the floor for building from source. PR #9312CI: add Python 3.13/3.14 (including free-threaded 3.14t) jobs, drop active Python 3.9 testing, and pin GitHub Actions to full commit SHAs for supply chain hardening. PR #9547, PR #9656, PR #9709, PR #9913, PR #9843
Routine dependency updates for GitHub Actions were kept current via dependabot throughout the release cycle (
actions/checkout,actions/setup-python,actions/setup-node,github/codeql-action,pypa/cibuildwheel,r-lib/actions/setup-pandoc, andts-graphviz/setup-graphviz) across roughly two dozen pull requests not individually itemized here.Improve the documentation-build requirements. PR #9949
Improve notebook generation. PR #9990
Add a CI run for the X-13ARIMA-SEATS tests. PR #10021
Add a lint-only CI workflow (
ruff+flake8). PR #10064Improve the documentation-generation CI job, and switch the X-13ARIMA-SEATS CI job to build with coverage and use a different binary installation method. PR #10052, PR #10048, PR #10051
Remove the coveralls integration. PR #10080
Routine dependabot bumps for
pypa/cibuildwheelandactions/github-script. PR #10070, PR #10071Also look for
.exe-suffixed binaries when locating the X-13ARIMA-SEATS executable on Windows. PR #10087
Documentation#
In addition to numerous individual typo, notebook, and docstring
corrections, this release cycle included a large, systematic effort to
bring docstrings across the codebase in line with the numpydoc standard
(module by module: discrete, genmod, stats, tsa/
statespace, base/compat/datasets, graphics,
imputation/multivariate/nonparametric, emplike/duration,
treatment/gam, tools, othermod/regression/robust,
and more), plus a documentation theme change to pydata-sphinx-theme and
a pass over example notebooks to fix formatting and broken links. A second,
final pass in the closing weeks of the cycle brought the remaining modules
up to the same standard and fixed up the stragglers it turned up along the
way: tools (PR #10107), robust (PR #10108), stats (PR #10110),
othermod/treatment/multivariate (PR #10111), base/datasets/compat
(PR #10112), regression (PR #10114), formula/graphics/imputation
(PR #10116), core tsa routines (PR #10117),
discrete/duration/gam/genmod (PR #10119),
distributions/emplike/iolib/miscmodels (PR #10121), nonparametric
(PR #10123), vector_ar (PR #10124), statespace (PR #10127), and
dataset docstrings (PR #10128), plus general clean-up of numpy/
pandas usage (PR #10115), rng parameter docstrings (PR #10145),
and the AGENTS.md guidance used to drive this pass (PR #10125).
Correct links to notebooks. PR #8886
Correct a typo in the
WLS.loglikedocstring. PR #8900Add install instructions for the nightly build. PR #8941
Correct the signature of
CopulaDistribution. PR #8946Fix an inconsistency in
var_model.py. PR #8948Fix inclusion of plots in the docs. PR #8963
Include the correct plot in
scatter_ellipsedocs. PR #8974Various small typo fixes. PR #9011, PR #9082, PR #9192, PR #9208, PR #9285, PR #9397, PR #9462, PR #9532, PR #9558, PR #9626, PR #9848, PR #9850, PR #9873, PR #9941
Fix broken plots/content in
linear_regression_diagnostics_plots. PR #9158Fix interaction and other example notebooks. PR #9216, PR #9218, PR #9551, PR #9552, PR #9554, PR #9617, PR #9621, PR #9683, PR #9718, PR #9724, PR #9784, PR #9864
Update the
ztest/ztest_meanp-value description. PR #9226Improve documentation for regression diagnostics, stats, and summary. PR #9230
Generate docs for
plot_ccfandplot_accf_grid. PR #9299Fix documentation of
AutoReg. PR #9310Add a
CITATIONfile. PR #9346Improve documentation of
acfandplot_acf. PR #9348Clarify notation for the error term in the regression docs. PR #9361
Fix docstring formula display in the SVAR class. PR #9372
Improve docs for
ExponentialSmoothingand related places. PR #9391Update the mediation tutorial documentation. PR #9422
Remove an empty cell from an ARMA example notebook. PR #9483
Fix a broken link to a citation reference. PR #9561
Document currently supported Python versions. PR #9588
Fix the Gamma
loglike_obsdocstring and clarify weight parameterization; align Gamma/Negative-Binomial notation in the GLM families table. PR #9660, PR #9890, PR #9892, PR #9893Fix a broken academic reference in
anova.py. PR #9749Fix an import in the api-structure page. PR #9755
Add the seasonal diagnostic plot to the docs. PR #9788
Correct the
PredictionResults.conf_intdocstring. PR #9813Fix incorrect parameter names in
deconvolve,powerdiscrepancy, andVECMResults.predictdocstrings, and fix formula rendering inpowerdiscrepancy. PR #9838, PR #9839Switch the documentation theme to
pydata-sphinx-theme. PR #9861Improve math formulas in
robust.normsdocstrings. PR #9876Add missing
PoissonResults/NegativeBinomialPResultsto the discrete-models autosummary. PR #9914Systematic docstring fixes by module: discrete (PR #9929), genmod (PR #9930), stats (PR #9931), tsa/statespace (PR #9934), base/compat/ datasets (PR #9935), graphics (PR #9937), imputation/multivariate/ nonparametric (PR #9938), othermod/regression/robust (PR #9940), tools (PR #9945), statespace (PR #9946), emplike/duration (PR #9943), treatment/gam (PR #9944).
Update notebooks for the deprecations introduced in this release. PR #9939
Improve the
robust.normsdocstrings. PR #9766Add an ARIMA tutorial notebook. PR #9792
Add a plot for the Hamilton filter. PR #9991
Add this release note. PR #9951
Many small documentation fixes, including for the new notebook and the
STLdocstring. PR #9952, PR #9954, PR #9960, PR #9961Fix the
NegativeBinomialP.fitdocstring, notebook title levels, and a misplaced reference. PR #9962, PR #9963Allow all notebooks to run again. PR #9955
Document that
exogis matched by position for non-formula models. PR #9967Remove docstring sections that did not render correctly. PR #9969
Use HTTPS for the MixedLM reference, clarify the
add_constantprependdefault, fix the ANOVA example link, and list all GEE covariance structures. PR #9996, PR #9997, PR #9999, PR #10000Correct the
recipr0summary line and the discrete results parameters. PR #10006, PR #10011Remove five documented parameters that are not in the signature. PR #10028
Add numpydoc
Parameterssections to the newNamedTupleresult classes. PR #10031Add an AI-use policy for contributions, and an
AGENTS.mdfor AI coding agents. PR #10045, PR #10078Clarify the
anova_lmType I/II/III sums-of-squares documentation. PR #9309Add an explanation of the Benjamini-Hochberg procedure to the
fdrcorrectiondocstring. PR #4216Correct typos in the Hurdle Count Model example notebook. PR #9477
Fix the
statsmodels.family->statsmodels.familiessubmodule name in the docs. PR #7568Reorganize and improve the
robust.normsdocstrings. PR #8975, PR #10061Fix the ETS simple-exponential-smoothing equations. PR #9484
Clarify
GLMGamout-of-sample prediction and theGLSARrhoargument. PR #9998, PR #10047Various small documentation and rst fixes. PR #10033, PR #10034, PR #10036, PR #10037, PR #10038, PR #10040, PR #10041, PR #10046, PR #10053, PR #10057, PR #10062, PR #10063
Clarify how to access
TukeyHSDrejection decisions and p-values. PR #9956Improve the
yule_walkerdocumentation. PR #10076Reduce Sphinx cross-reference noise/warnings. PR #10097
Fix a typo in the WLS example notebook’s row labels, and remove an unused
scipyimport and cell left over from it. PR #10099, PR #10100Fix incorrect parameter types recorded in the regression docstrings. PR #10104
Fix the
UECMdocstring. PR #10118Replace broken OECD glossary links in the
endog/exogdocumentation. PR #10122Improve the
pacfdocstring. PR #10169Clarify that
VARResults.df_modelcounts free parameters per equation (neqs * k_arlagged terms plusk_exogdeterministic terms), not the total across all equations. PR #10209
Testing, Linting, and Maintenance#
A substantial amount of routine maintenance went into keeping the test
suite green against upstream changes in NumPy, SciPy, and pandas (including
pandas copy-on-write and preparation for pandas 3), adopting ruff for
linting in addition to flake8, running isort/pyupgrade across
the codebase, relaxing overly tight test tolerances, and improving thread
safety of the test suite ahead of free-threaded CPython support.
In the final weeks of the cycle, a systematic coverage audit went through results-class attributes and methods, computational code paths, and summary/table content that had no test asserting on it, adding regression tests and turning up several of the bug fixes listed above. PR #10150, PR #10151, PR #10153, PR #10155
Selected items:
Reduce direct use of the global
np.randomstate in the library and in tests. PR #9878, PR #9879, PR #9737Prepare for pandas 3 (string dtype changes, removed features). PR #9245, PR #9247, PR #9602, PR #9689, PR #9722
Adopt
rufffor linting. PR #9453, PR #9642, PR #9643, PR #9650Run
isortacross the codebase. PR #9855Remove the obsolete, empty
statsmodels.interfacepackage. PR #9721Improve thread safety of the test suite. PR #9742, PR #9904, PR #9910
Add CI coverage for Python 3.13/3.14 and free-threaded CPython. PR #9547, PR #9656, PR #9709
Move from
isorttorufffor import sorting. PR #9981Reduce mutation of model state inside
fit()methods. PR #9972Remove long-standing anti-patterns across
genmod,multivariate,robust,tsa,statsandtools, and extend the same conventions to the remaining modules. PR #9973, PR #9977, PR #9978, PR #9980, PR #9984Use
pathlibin place ofos.path. PR #9988Remove unproductive
if __name__ == "__main__"blocks, converting the useful ones into tests. PR #10023Archive unused
statsmodels.sandboxfiles and remove leftover debug code. PR #10018, PR #10019Remove further deprecations and outdated compatibility code. PR #10015, PR #10026
Raise the declared Python floor to the actual minimum of 3.10, and improve the formula-engine specification. PR #9953, PR #9995
Add tests for the
summary()-after-remove_data()pattern across models. PR #10003, PR #10007, PR #10008Add a marker for joblib-dependent tests and fix a test on older SciPy. PR #9948, PR #10022
Update the declared NumPy minimum to reflect the version actually required, and remove the legacy NumPy code it made unreachable. PR #10032
Reduce warning noise in the test suite (new
filterwarningsentries andpytest.warnswrappers for warnings introduced by theNamedTuplemigration). PR #10068Remove the now-redundant
methodvalidation inyule_walker(already performed bystring_like). PR #10077Rename misleadingly-named WLS equivalence tests, and clean up remaining small issues and lint. PR #10039, PR #10062, PR #10082
Prefer
pandas.read_csvovernumpy.genfromtxtfor reading example data. PR #10054Improve the issue and pull-request templates. PR #10050, PR #10060
Assorted small maintenance ahead of the release. PR #10056
Test the remaining edge cases in the Jonckheere-Terpstra test. PR #10083
Move the
NamedTupleresult classes away from a shared limited-iteration mixin, standardize field names, and simplify the mix ofNamedTupleanddataclassusage introduced earlier in the cycle. PR #10093, PR #10095, PR #10096, PR #10098Restore a behavior change that had been introduced accidentally. PR #10094
Improve import performance in some cases. PR #10102
Move non-core code out of the main package. PR #10168
Re-enable a previously-skipped test, and change the warning class expected from
fit_collinearand from tests running under WASM. PR #10138, PR #10142, PR #10144Silence expected-but-noisy singularity warnings in the test suite. PR #10146
Add tests for the
rngargument selector. PR #10147Add a marker for matplotlib-dependent tests. PR #10166
CI: work around a Cython/conda incompatibility that intermittently broke the legacy conda test job. PR #10158, PR #10160, PR #10162
Add
tools/check_public_api_coverage.pyandtools/class_coverage_report.py, AST-based scripts that find public API surface and estimation-class code with no test coverage, plus a CI job that runs them with a baseline so the zero-coverage set cannot grow; this tooling drove much of the coverage-motivated bug-hunting elsewhere in this release. PR #10189Standardize fully on
rufffor linting and dropflake8from CI and pre-commit, now thatruffcovers the rules previously split across both tools. PR #10192, PR #10193Add further regression tests from the public-API coverage audit for
statsmodels.test,docstring_helpers,eval_measures.stde,moment_helpers.mnc2mvsk,gof.gof_chisquare_discrete/gof_binning_discrete,RegressionFDR.threshold,weightstats.DescrStatsW.ttost_mean/CompareMeans.ztost_ind,datasets.utils.clear_data_home,iolib.table.SimpleTable.pad,GenericLikelihoodModel.reduceparams/nloglike, andDistributedModel.fit_joblib/DistributedResults.predict, each checked against an independent reference rather than only asserting no exception is raised. PR #10194Add coverage for
VARProcess/VARResultsautocorrelation methods. PR #10199Reduce the number of Linux CI jobs to speed up completion. PR #10181
Further
pandas-compatibility maintenance (factor.py,grouputils.py, anx13test). PR #10206Skip a test requiring an exact
LinAlgErrormessage on WASM/Pyodide. PR #10202
Major Bugs Fixed#
See github issues for a list of bug fixes included in this release
Development summary and credits#
Thanks to everyone who contributed code, documentation, bug reports, and
review to this release cycle. The following list of contributors is
generated from git log between v0.15.0.dev0 and the v0.15.0
release, and may not be complete or fully deduplicated across
differently-configured git identities:
Achraf Ez, Aditi Juneja, Adrian Ross, Agriya Khetarpal, Alex Alborghetti, Alexander Fischer, Andrés, Andrés López, Anh Trinh, Aniket, Aniket Singh Yadav, Anselm Hahn, Antoine Mayerowitz, Anton Karpov, Anuraag Pandhi, Artem Glebov, Ayush Gupta, Ben, Benjamin Leff, Bortlesboat, Caleb Lindgren, Chad Fulton, Christine P. Chai, Clément Fauchereau, Daan Knoope, David Ivanov, Deshan, Dhairya Motta, Dhruvil Darji, Eden Rochman, Elton Chang, Erich Morisse, Eugen Goebel, Evan Lyall, Evgeni Burovski, FuturMix, Hadi Dayekh, Harish Bhavandla, Hood Chatham, IsaacP, IntegralIndefinida, Illia Polovnikov, Iman, Jake Soloff, Jesse W. Collins, Jim Varanelli, Joey Scanga, Josef Perktold, Joshua Markovic, Justin Mahlik, Kaif, Kakarot35, Kayvan Zahiri, Kevin Sheppard, Kevin Gregory, Kumar Aditya, Lakshmi786, Loi Nguyen, Luke J, Maciej Skorski, Manlai Amar, Marc Bresson, Mathias Hauser, Maxime Gourguechon, Melissa Wu, Michał Górny, Michel de Ruiter, Naimish Machchhar, Panzerkampfwagen-del, Pranav Achar, Puneet Dixit, Rahul Rathnavel K, Ralf Gommers, Rebecca N. Palmer, Ritika shrestha, RoyS, Seaic Mac Murchadha, Sebastian Pölsterl, Shamus, Solaris-star, Sreekant Baheti, Tartopohm, Vedant Madane, Vikram Kumar, Viktor, Vitaliy, Vladimir Saraikin, Wali Reheman, Will Tirone, YangWu1227, Zbigniew Jędrzejewski-Szmek, Zhang Hong, Zhengbo Wang, adarshsm, alekracicot, camaramm, chuenchen309, cjck944084735-dot, genrichez, hass-nation, lev, libokai, louisabraham, mkzung, star1327p, uttam12331, whn, and many others.
These lists are automatically generated based on git log and may not be
complete.
Merged Pull Requests#
The following Pull Requests were merged since the last release:
PR #4216: DOC: Added explanation of fdr_bh to docstring of fdrcorrection
PR #7326: BUG: Fix libsturng issue #7324
PR #7568: MAINT: Fix incorrect submodule name (statsmodels.family -> sm.families)
PR #8129: ENH: Outlier robust covariance - rebased
PR #8782: ENH/TST: ccf to optionally return confidence intervals
PR #8783: ENH: Plot cross-correlations and auto/cross-correlation matrix
PR #8865: MAINT: Move from Styler.applymap to map
PR #8866: DOC: Add admonitions for changes and deprecations
PR #8867: DEV: Start of 0.15 branch
PR #8870: TST: install missing *.csv files needed by tsa.stl tests
PR #8872: MAINT: Add CI for install and sdist install
PR #8874: Backport of #8870 and #8872
PR #8875: TST: Relax tolerance on overly tight test
PR #8876: TST: Relax tolerance on overly tight test
PR #8878: BUG Fix typo in InfeasibleTestError exception string
PR #8881: ENH: plot prediction curve over scatter in GLMGamResults.plot_partial
PR #8886: DOC: Correct links to notebooks
PR #8887: BUG: Correct diagnostics for changes in pandas
PR #8889: ENH: add get_margeff to GLM
PR #8897: MAINT: Update for future pandas changes
PR #8900: DOC: correct typo in WLS.loglike docstring
PR #8907: BUG: mnlogit wald tests, ravel, string cov_names
PR #8919: ENH: add MultivariateLS
PR #8930: MAINT: Remove deprecated utility
PR #8932: CLN: Fix typos
PR #8937: ENH/PERF: faster computation of revision impacts
PR #8939: MAINT: Update nightly location
PR #8940: MAINT: Make changes for deprecations
PR #8941: DOC: Add install instructions for nightly
PR #8942: BUG: Writing read-only arry on pandas 2/CoW
PR #8946: DOC: correct signature of CopulaDistribution
PR #8948: DOC: fix inconsistency in var_model.py
PR #8959: ENH: 2-sample z-test unequal variances case
PR #8963: DOC: Fix inclusion of plots
PR #8974: DOC: Include correct plot in scatter_ellipse
PR #8975: DOC: docstrings in robust.norms, improve, reorganize
PR #8988: STY: Switch from == to is for type comparrison
PR #8989: MAINT: Insert some initial NumPy caps
PR #8990: MAINT: Block pandas 2.1.0
PR #8992: Bump actions/checkout from 3 to 4
PR #9011: DOC: fix small typo
PR #9016: ENH: Improve lag selection in pacf
PR #9029: Update seasonal.py
PR #9036: ENH: Improved performance of the ConditionalMNLogit class
PR #9041: Backport 0.14.1
PR #9046: Forward port
PR #9059: TST: Ensure value is float
PR #9078: ENH: Add compatability with Cython 3
PR #9082: DOC: fix typo
PR #9083: CI: Ensure non-zero exit fails
PR #9086: Bump actions/setup-python from 4 to 5
PR #9087: MAINT: Use RandomState in-place of np.random.seed
PR #9088: MAINT: Protect against future pandas changes to merge/sorting
PR #9089: MAINT: Use modern freq names
PR #9092: Backport 0.14.1
PR #9098: Bump github/codeql-action from 2 to 3
PR #9101: refactor code to drop constant columns
PR #9106: MAINT: Explore NumPy 2 compatability
PR #9110: BLD: Update minimums
PR #9111: MAINT: Fix future issues in pandas
PR #9112: Update mins v2
PR #9113: MAINT: Remove conditions producing warnings
PR #9115: MAINT: Clean up and silence some warnings
PR #9116: CI: Update pip pre to 3.12
PR #9117: edited requirements.txt
PR #9124: MAINT: Fix future issues due to array shapes
PR #9126: MAINT: Fixes for pre-release testing
PR #9130: ENH: GLM models now save the names of input Pandas Series
PR #9142: Fix linting error
PR #9143: Fix string formatting
PR #9144: MAINT: Replace quarterly string identified
PR #9149: Bump ts-graphviz/setup-graphviz from 1 to 2
PR #9150: MAINT: Fixes for future changes
PR #9158: DOC: Fix broken in linear_regression_diagnostics_plots
PR #9165: BUG: Ensure ARIMA simulation is reproducable
PR #9186: ENH: robust: tools and more norms
PR #9192: DOC: fixed boxpierece typos
PR #9195: MAINT: Make compatability with NumPy 2
PR #9200: Cherry pick commits from 0.15 for 0.14.3
PR #9203: DOC: Add release note
PR #9208: DOC: fixed typos init_training_endog
PR #9210: BUG/ENH: fix scale.Huber and add robust MScale
PR #9212: DOC: Final docs for 0.14.2
PR #9213: DOC: Final docs for 0.14.2
PR #9216: DOC: Fix interactions notebook
PR #9218: DOC: Fix multiple issues in notebooks
PR #9226: DOC: Update pvalue description in weightstats.py of ztest and ztest_mean
PR #9227: ENH: add CovDetMCD and det for regression
PR #9230: DOC: Improve docs of regression_diagnostics.html, stats.html, summary
PR #9240: BUG: Correct cov_kwargs -> cov_kwds
PR #9245: MAINT: Fix issues with pandas 3
PR #9247: MAINT: Additional fixes for pandas 3
PR #9249: added “one-sided” alternative for proportion_confint
PR #9255: ENH: add alternative option to confint_poisson
PR #9262: MAINT: Change future keyword argument
PR #9270: Add Pyodide support and CI jobs for statsmodels
PR #9280: ENH: Add optional parameters for summary_col to indicate FEs (rebased)
PR #9285: DOC: Replace postive by positive
PR #9291: REF: Remove numpy testing import from test runner
PR #9292: MAINT: Update requirements
PR #9296: Avoid random ordering in include_dirs lists
PR #9299: DOC: Generate docs for plot_ccf and plot_accf_grid
PR #9309: DOC: Add explanation of typ I II III of anova_lm
PR #9310: DOC: Fix documentation of statsmodels.tsa.ar_model.AutoReg
PR #9311: BUG: Ensure ZA does not overwrite
PR #9312: MAINT: Remove oldest-supported-numpy
PR #9334: ENH/BUG: Ensure array is owned
PR #9336: MAINT: Change how indices are compared
PR #9341: Bump actions/setup-node from 4.0.2 to 4.0.3
PR #9343: Fix OpenBLAS pow_dd unresolved symbol error, update Emscripten CI testing
PR #9346: DOC: Add citation file
PR #9348: DOC: Improve documentation of acf and plot_acf
PR #9351: STY: Accept 88 characters in linting
PR #9354: MAINT: Simplify and standardize setup
PR #9356: MAINT: Backport changes needed for 0.14.3 release
PR #9358: TST: Relax tolerance on test that fails for dynamic factor
PR #9359: MAINT: Run pyupgrade on 0.14 branch
PR #9360: MAINT: Run pyupgrade on main branch
PR #9361: adjusting notation of error term in regression docs
PR #9363: DOC: Add release note for 0.14.3
PR #9364: DOC: Spelling
PR #9365: Backport of #9270: add Pyodide support and CI jobs for v0.14.x
PR #9370: Bump actions/setup-node from 4.0.3 to 4.0.4
PR #9372: Fix docstring formula display in SVAR class
PR #9377: DOC: Add release note for 0.14.4
PR #9379: DOC: Fix version number
PR #9385: BUG: Avoid modification in place
PR #9386: MAINT: Fix scalar assignment
PR #9388: ENH: changed np.round(mean_dff,2) -> mean_diff:.3g
PR #9389: feature/wilcoxon mann whitney sample size
PR #9390: BUG: Corect resid from UECM
PR #9391: DOC: Imroves docs for exponentialsmoothing and other places
PR #9394: BUG: Correct x and y label location in qqplot_2sample
PR #9395: MAINT: Replace deprecated Pandas append with concat in dynamic_factor_mq
PR #9396: BUG: Remove method setting in summary2 of genmod
PR #9397: DOC: Fix typo in previous fix
PR #9398: BUG: Ensure hessian is skipped
PR #9399: ENH: Add leybourne-mccabe test
PR #9400: BUG: Correct LLF for ETSModel
PR #9401: Feature/wilcoxon mann whitney sample size squashed
PR #9407: ENH: more reliable casting of pandas data
PR #9411: Bump actions/setup-node from 4.0.4 to 4.1.0
PR #9413: BUG: Ensure VAR can forecast with 0 lags
PR #9422: DOC: updated mediation tutorial documentation
PR #9423: ENH: Abstract formula engine
PR #9424: TST: Make test more resiliant
PR #9439: Dependencies consistency
PR #9449: CI: Update permissions
PR #9453: ENH: Add ruff support
PR #9457: BUG: Correct DatetimeIndex use
PR #9458: TST: Restore skip when no x13 available
PR #9461: BUG: Correct handleing of PeriodIndex in seasonal_decompose
PR #9462: DOC: Corrected a typo in chi^2
PR #9467: Update conf.py year
PR #9468: BUG: svar, A,B dtype, one parameter score shape, closes #9302
PR #9470: MAINT: Bump formulaic to 1.1.0
PR #9471: Fix formula eval depth in select models
PR #9477: DOC: Corrected typos in the Hurdle Count Model example
PR #9483: DOC: remove empty cell in tsa_arma_0.ipyb file
PR #9484: DOC: fixed ETS simple exponential smoothing equations
PR #9487: BUG/ENH: Tukeyhsd, fix unused variance, add Games-Howell
PR #9492: Bump actions/setup-node from 4.1.0 to 4.2.0
PR #9498: Modify x13_arima_analysis to produce seasonality fit diagnostics
PR #9503: TST: Relax tolerance on overly tight test
PR #9510: fix doc for extrapolate_trend and allow period as well
PR #9518: [ENH] Allow ARDL model trend ‘ctt’
PR #9524: BUG: Fix bug in Runs.runs_test for the case of a single run yielding …
PR #9532: DOC: fix duplicate words in weightstats
PR #9535: Bump actions/setup-node from 4.2.0 to 4.3.0
PR #9541: BUG: Correct spelling of pytest fixture
PR #9543: MAINT: Remove _lazywhere in favor of apply_where
PR #9544: ENH: add plotkwargs for qqplot_2samples()
PR #9545: MAINT: Improve handeling of missing mvndst
PR #9546: STY: Remove unused import
PR #9547: CI: Fix flaky test and add 3.13 jobs
PR #9550: Add optional raw spec parameter for x13_arima_analysis()
PR #9551: DOC: Check, fix and format some notebooks
PR #9552: DOC: Check, fix and format some notebooks
PR #9553: DOC: Fix statespace local linear
PR #9554: DOC: Format and fix up notebooks
PR #9557: Bump actions/setup-node from 4.3.0 to 4.4.0
PR #9558: DOC: Fixed typo in VARResults Attribute docstring : params -> coefs.
PR #9561: Fix Broken Link to Citation Paper of 2010 Conference
PR #9568: MAINT: Convert decimal for float to avoid future issue
PR #9571: ENH: medcouple n log n (see #9570)
PR #9581: BUG: make Binomial family more robust to corner case mu=0 , endog=0
PR #9582: ENH: Support for array-like and pandas-like data
PR #9586: MAINT: Remove lazywhere
PR #9588: DOC: Update supported Python versions
PR #9591: Rls 0 14 5 notes
PR #9594: MAINT: Forward port changes to Holt-Winters
PR #9595: TST: Fix warning catching
PR #9596: Xfail regularized problems
PR #9597: STY: Fix linting fails
PR #9598: Future fixes
PR #9602: MAINT: Prepare for pandas 3 strings
PR #9607: Commit (statsmodels/statsmodels#9606)
PR #9615: MAINT: Wrap pandas deprecate_kwarg
PR #9616: Bump actions/checkout from 4 to 5
PR #9617: DOC: Fix minor issues in notebooks
PR #9618: Update pytest
PR #9621: DOC: Fix minor issues in notebooks and RST
PR #9622: Fix redundant heading in docs/README.md
PR #9624: Bump actions/setup-python from 5 to 6
PR #9625: Bump actions/setup-node from 4.4.0 to 5.0.0
PR #9626: DOC: Fix typo in maintainer_notes.rst (get → git)
PR #9630: MAINT: Fix for deprecation warnings
PR #9631: MAINT: Remove dependence on npymath
PR #9632: SETUP: Further clean up on setup
PR #9633: MAINT: Update for recent changes
PR #9634: BLD: Explore using meson
PR #9636: Fix ‘add_trend’ error message to correctly specify which columns are constant.
PR #9637: TST: Report xfail for flaky test
PR #9638: CI: Close figures at the end of tests
PR #9639: TST: Fix test that fails in prerelease testing
PR #9640: Assert rasies
PR #9641: MAINT: Remove unused import
PR #9642: CL:N: Add Stacklevel and other quality issues
PR #9643: CLN: Implement rules that are close to passing
PR #9644: CLN: Remove some additional formatting issues
PR #9646: Fix import error
PR #9647: CLN: Remove some additional formatting issues
PR #9648: MAINT: Remove panding deprecation matrix usage
PR #9649: MAINT: Remove panding deprecation matrix usage
PR #9650: CLN: Fix linting for bugbear
PR #9651: Ruff tests
PR #9652: Bump pypa/cibuildwheel from 3.1.4 to 3.2.0
PR #9656: CI: Add 3.14 in GH actions
PR #9660: DOC: Fix Gamma loglike_obs docstring and clarify weights parameteriza…
PR #9668: Bump github/codeql-action from 3 to 4
PR #9669: Bump pypa/cibuildwheel from 3.2.0 to 3.2.1
PR #9673: BUG: Fix conversion of 1-d arrays to scalars
PR #9683: DOC: Fix issues affecting notebooks
PR #9688: BUG/DOC: fix state space model transition timing
PR #9689: MAINT: Remove feature deprecated in Pandas 3
PR #9691: ENH: Add no cross terms option to White’s test for heteroscedasticity
PR #9692: Bump pypa/cibuildwheel from 3.2.1 to 3.3.0
PR #9698: Bump actions/checkout from 5 to 6
PR #9700: MAINT: Improve compatability with recent NumPy
PR #9701: DOC: Release note for 0.14.6
PR #9709: CI: add CPython 3.14t CI
PR #9710: STY: Use del obj.attr rather than delattr(obj, “attr”)
PR #9712: MAINT: Obscure cow changes
PR #9716: TST: run nonparametric tests in parallel on CI
PR #9717: BLD: generate free-threading compatible cython modules
PR #9718: DOC: fix typo in example notebook
PR #9720: PERF: Optimize VECM memory/speed by avoiding O(T^2) projection matrix
PR #9721: MAINT: remove obsolete statsmodels.interface package (empty)
PR #9722: MAINT: lazy_apply patsy/pandas compatibility
PR #9724: Fixed some spelling, grammar, and punctuation on the theta model example notebook
PR #9726: TST: Add marker for high memory tests
PR #9728: BUG: Pass alpha to plot_predict
PR #9729: FIX: incorrect length comparison in endpoint transformation logic
PR #9732: CLN: Removed unused _partial_regression function Fixes #9731 The _par…
PR #9735: Bump pypa/cibuildwheel from 3.3.0 to 3.3.1
PR #9736: TST: Xfail test on Windows due to SciPy changes
PR #9737: REF: Remove dependence on global RandomState
PR #9738: BUG: FIX compilation errors in statespace/meson.build #9733
PR #9739: BUG: Fix patsy eval_env handling in FormulaManager and add parametrized re…
PR #9742: TST: Enable thread safe tests
PR #9747: BUG: raise error for invalid endog input in emplike.DescStat
PR #9749: docs: fix broken academic reference in anova.py
PR #9750: ENH: Add missing attributes from AutoReg
PR #9755: DOC: fixed import statement in api-structure page
PR #9757: fix: add informative error message when Hessian inversion fails in fit_regularized
PR #9758: fix: replace 4 bare except clauses with except Exception
PR #9759: Bump pypa/cibuildwheel from 3.3.1 to 3.4.0
PR #9760: Relax overly tight test tol
PR #9761: TST: Xfail bad test
PR #9762: CI: Add jinja2 for testing
PR #9763: MAINT: fix compat.scipy.apply_where for scipy-internal change
PR #9764: TST: Remove valid cases from exception check
PR #9766: DOC: improve docstrings in robust.norms
PR #9767: MAINT: use get_lapack_funcs for low-level LAPACK functions
PR #9769: CLN: Fix lint issues
PR #9770: TST: Attempt to isolate OSX failure
PR #9771: STY: Fix flake8 error
PR #9772: MAINT: Check that returned eigenvalues are real
PR #9773: BUG: Treat empty docstrings as None in Docstring class
PR #9775: TST: Skip failing tests on Win ARM64
PR #9778: BLD: ensure the libm C math library gets linked for all targets
PR #9781: Bump pypa/cibuildwheel from 3.4.0 to 3.4.1
PR #9782: CI: Remove joblib from freethreaded run
PR #9783: CI: Use site packages for free threaded tests
PR #9784: DOC: Fix Python interpreter example backslash newlines that rendered improperly
PR #9786: MAINT: Refactor monkey patch for patsy
PR #9787: ENH Added Seasonal-Diagnostic Plot to graphics.tsaplots
PR #9788: DOC: Add seasonal diagnostic plot to docs
PR #9789: TST: Relax tolerance and problematic test
PR #9792: ENH: Add ARIMA tutorial notebook example
PR #9798: ENH: make tsa/statespace Cython usage compatible with SciPy ILP64 builds
PR #9800: BUG: fix use_boxcox control flow in ExponentialSmoothing.fit (fixes #9797)
PR #9802: ENH: Add partial cross-correlation function (pccf)
PR #9804: ENH: Add Polars DataFrame support (Issue #9744)
PR #9805: BUG: honor MixedLM summary title
PR #9809: Rename README_l1.txt to L1_ADDITION.txt
PR #9811: ENH: Allow seasonal-differencing-only models with non-seasonal estimators (Issue #6159)
PR #9812: {BUG} Fix Issue #9793: Override resid property in UECMResults
PR #9813: DOC: correct PredictionResults.conf_int docstring
PR #9814: fix: avoid division by zero in estimate_location
PR #9815: ENH: graphics: Add add_ellipse and support passing x, y arrays to add…
PR #9816: ENH: tsa/vector_ar: Allow passing pre-calculated error bands to IRF plots
PR #9819: Enh/hannan rissanen order validation
PR #9820: ENH: Vendor Appender and Substitution docstring helpers from pandas
PR #9822: Update test notes with virtual environment activation steps
PR #9823: BUG: L-BFGS-B optimizer ignores disp=False, prints output unconditionally
PR #9824: BUG: Fix scale attribute and resid_pearson for fixed scale cov_type (#8190)
PR #9825: MAINT: Remove iprint for SciPy 1.18+
PR #9826: BUG/CLN: remove dead assignment to cov_p in GLM fit
PR #9829: BUG: pass ax parameter through to dot_plot in CombineResults.plot_forest
PR #9830: Fix GLMInfluence.hat_matrix_diag method name
PR #9831: ENH: Vendor cache_readonly and deprecate_kwarg from pandas private API
PR #9832: MAINT: drop removed scipy interp2d from TableDist (closes #8909)
PR #9833: MAINT: Future fixes
PR #9834: MAINT: Reduce future warnings
PR #9835: BUG: Fix VIF numerical instability by standardizing design matrix
PR #9836: DOC: Improve docstrings
PR #9837: MAINt: Update CIBW to 4.1.0
PR #9838: DOC: fix incorrect parameter names in deconvolve, powerdiscrepancy and VECMResults.predict docstrings
PR #9839: DOC: fix freeman_tukey formula rendering in powerdiscrepancy docstring
PR #9840: Improve text formatting for macOS
PR #9842: TST: ATtempt to avoid rare failures in thread-safe
PR #9843: CI : Pin github actions to full commit sha
PR #9844: BUG: skip summary diagnostics when slim=True
PR #9845: ENH: add fixed_params support to innovations_mle (Issue#6159)
PR #9848: DOC: fix typo
PR #9849: TST: Mark test as unsafe
PR #9850: DOC: fix typos
PR #9852: FIX: anova_lm silently returns NaN p-values when models are passed in reverse order
PR #9853: BUG: set k_exog_user on SVARResults so summary() works (GH#8025)
PR #9854: Improve test_family documentation
PR #9855: MAINT: run isort on codebase
PR #9857: TST: Relax tol on test that frequenctly fails
PR #9858: CI: Reduce the number of runs to improve performance in CI
PR #9859: Bump actions/checkout from 6 to 7
PR #9861: DOC: Change to pydata theme
PR #9862: BUG: fix Binomial.deriv() to return 1 - 2*mu/n (missing division by n)
PR #9863: DOC: Shorten word in title
PR #9864: DOC: Fix URL and notebooks
PR #9865: DOC: Fix origin in conf
PR #9866: BUG: record robust scale in RLM fit_history
PR #9867: MAINT: fix import sorting in test_weights
PR #9870: MAINT: link validation logic in Family._setlink
PR #9873: Fix typos in test_chisquare_prob docstring
PR #9874: [ENH] Add Jonckheere-Terpstra ordered trend test
PR #9876: DOC: improve math formulas in robust.norms docstrings
PR #9877: BUG: fix NegativeBinomial check for optional alpha
PR #9878: MAINT: Reduce direct use of np.random.func
PR #9879: MAINT: Remove direct use of np.random
PR #9881: [codex] DOC: document GLS other_results
PR #9883: MAINT: adapt to upcoming change in pd.freq
PR #9884: BUG: return nan from Power.solve_power when it fails to converge
PR #9885: ENH: report the last root-finder value in the solve_power ConvergenceWarning
PR #9886: fix: correct parameter names in docstrings (prob_infl, bin_edges, pred_kwds, param_nums, mu1_low)
PR #9887: fix DiscreteResults crash with full_output=0
PR #9888: BUG: Fix ccovf shape mismatch for different length arrays
PR #9890: DOC: fix Negative Binomial cumulant function in GLM families table
PR #9892: DOC: Following NumPy-style doc for Gamma log-likelihood
PR #9893: DOC: fix Gamma distribution notation in GLM families table
PR #9894: MAINT: fix typos in docstrings and comments
PR #9895: ENH: raise informative error for impossible one-sided solve_power cases
PR #9896: DOC: Fix failure in docs due to warning
PR #9898: ENH/BUG: add min_diag option to cov_nearest for zero or negative diagonal
PR #9899: BUG: describe/Description handles 0-row (empty) input gracefully (#9891)
PR #9901: Fix up random generation
PR #9902: BUG: Attach mlefit attributes to the results instance so they appear in dir()
PR #9903: BUG: Use exog centroid as center in rainbow test use_distance (#9103)
PR #9904: TST: Improve tests for thread safety
PR #9905: Fix a small issue in statsmodels (#9869)
PR #9906: BUG: filter unsupported kwargs in MixedLM.fit to prevent AttributeError
PR #9907: BUG: use rank-adjusted df in wald_test_terms for rank-deficient models
PR #9908: BUG: Do not pass hess to L-BFGS-B and TNC in _fit_minimize
PR #9909: BUG: Fix sison-glaz confint failure for small or sparse counts
PR #9910: TST: Improve thread safety of tests
PR #9912: CLN: Fix CodeQL detected minor issues
PR #9913: CI: Drop support for Python 3.9 in CI
PR #9914: DOC: add missing PoissonResults and NegativeBinomialPResults to discretemod autosummary (closes #9022)
PR #9915: BUG: ARDLResults.apply/append loses exog lag order
PR #9916: BUG: divide adjusted ccovf by the overlapping count, not len(x) - k
PR #9919: BUG: read the entropy integration limits from the kernel
PR #9920: BUG: populate _retain_cols in out_of_sample without a prior in_sample call
PR #9923: TST: Fix threaded failing test
PR #9924: BUG: Correct test to not use the singleton
PR #9925: BUG: Fix import when MPL not installed
PR #9926: Bump r-lib/actions/setup-pandoc from 2.12.0 to 2.12.1
PR #9927: Bump actions/setup-python from 6.2.0 to 7.0.0
PR #9928: Bump pypa/cibuildwheel from a0a973acdc9e7b7f8b04ac5c80e6883a5a102615 to 294735312765b09d24a2fbec22660ce817587d55
PR #9929: DOC: Fix many docstring issues in discrete
PR #9930: DOC: Fix many docstring issues in genmod
PR #9931: DOC: Fix many docstring issues in stats
PR #9932: CLN: Fix import order using isort
PR #9933: fix(grouputils): unify group_sums orientation and fix group_demean
PR #9934: DOC: Improve tsa docstrings ex. statespace
PR #9935: DOC: Improve base, compat and dataset docstrings
PR #9936: MAINT: Remove deprecations
PR #9937: DOC: Improve graphics docstrings
PR #9938: DOC: Improve imputation, multivariate and non-parametric docstrings
PR #9939: DOC: Update notebooks for deprecations
PR #9940: DOC Improve docstrings othermode, regression and robust
PR #9941: DOC: fix typos in docstrings, comments, and messages
PR #9942: DOC: Fix small issues found in docbuild
PR #9943: DOC: Fix emplike and duration
PR #9944: DOC: Fix treatment and gam docstrings
PR #9945: DOC: Fix docstring issues in tools
PR #9946: DOC: Fix some issues in statespace docstrings
PR #9947: REF: Move from random_state to rng
PR #9948: TST: Add marker for joblib
PR #9949: CI: Improve doc build reqs
PR #9950: ENH: Consistently use rng to move towards SPEC-007
PR #9951: DOC: Start release note for 0.15.0
PR #9952: DOC: SMall fixes for docs
PR #9953: MAINT: Bump to the actual minimum of 3.10
PR #9954: DOC: Final pass at doc fixes
PR #9955: DOC: Fix notebook and allow all to run
PR #9957: ENH: Add Hamilton filter (continued from 9872)
PR #9958: BUG: Fix removal of compat lstsq
PR #9959: CLN: Fix small lint issue in test
PR #9960: More doc fixes
PR #9961: DOC: Small doc fixes
PR #9962: DOC: Fix NegativeBinomialP.fit docstring
PR #9963: DOC: Fix title level in notebook and move ref
PR #9967: DOC: document that exog is matched by position for non-formula models
PR #9969: DOC: Remove sections from docstrings that do not render correctly
PR #9972: REF: Reduce mutability of models fit() methods
PR #9973: REF: Reduce genmod use of del
PR #9974: BUG: raise on non-2x2 tables in stats.mcnemar (#9485)
PR #9976: BUG: respect caller warning filters in discrete l1 fit_regularized (#9179)
PR #9977: REF: Remvoe anti-patterns in multivariate and robust
PR #9978: REF: Remove anti-patterns in tsa
PR #9980: REF: Remove anti-pattern use in stats and tools
PR #9981: MAINT: Move from isort to ruff
PR #9982: Bump actions/checkout from 7.0.0 to 7.0.1
PR #9983: Bump pypa/cibuildwheel from 4.1.0 to 4.1.1
PR #9984: REF: Extend the best practices to additional files
PR #9985: BUG: Reject None in string_like unless optional is True
PR #9987: BUG: Reject None in array_like unless optional is True
PR #9988: REF: Make use of pathlib
PR #9989: CLN: Clean examples
PR #9990: ENH: Improve nbgeneration
PR #9991: DOC: Add plot for hamilton_filter
PR #9992: BUG: Don’t validate the specification when extending SARIMAX results
PR #9993: BUG: Fix score_test to return HolderTuple instead of plain tuple #9785
PR #9994: BUG: Select the correct axis in drop_missing
PR #9995: MAINT: Improve formula engine specification
PR #9996: docs: use HTTPS for MixedLM reference
PR #9997: DOC clarify add_constant prepend default
PR #9998: DOC clarify GLMGam out-of-sample prediction
PR #9999: DOC fix ANOVA example link
PR #10000: DOC list all GEE covariance structures
PR #10001: ENH: Add block jackknife estimator (addresses #9752)
PR #10002: BUG: Ensure AutoReg summary can run after calling remove data
PR #10003: TST: Add tests for summary-remove-data pattern
PR #10005: BUG: Report the correct accepted types in dict_like
PR #10006: DOC: Correct the recipr0 summary line
PR #10007: TST: Add tests for summary-remove-data pattern in regression
PR #10008: TST: Add tests for summary-remove-data pattern
PR #10009: Statespace summary remove data
PR #10010: BUG: clip wilson proportion_confint bounds to [0, 1]
PR #10011: DOC: fix discrete results parameters
PR #10012: BUG: sign_test raises an opaque error when all observations tie with mu0
PR #10013: BUG: multipletests raises ZeroDivisionError on an empty p-value array
PR #10014: BUG: maxabs and iqr raise on an empty input, unlike the other eval_measures
PR #10015: MAINT: Remove Deprecations and outdated code
PR #10016: ENH: Allow list of lags additional to maxlag
PR #10017: BUG: use the non-missing sample size for acf confint/qstat when NaNs are handled
PR #10018: MAINT: Remove debug code
PR #10019: MAINT: Archive unused statsmodels.sandbox files
PR #10020: BUG: Avoid divide by 0 in acf/acovf with explicit error
PR #10021: TST: Add test run for x13
PR #10022: MAINT: COrrect test on older SciPy
PR #10023: CLN: Remove unproductive __name__ == “__main__” code
PR #10025: ENH: Reduce variable output returns
PR #10026: MAINT: Address deprecations
PR #10027: More named tuple
PR #10028: DOC: Remove five documented parameters that are not in the signature
PR #10029: REF: Move variable return to NamedTuple
PR #10030: ENH: Add NamedTuples to remaining fixed-arity tsa.stattools functions
PR #10031: DOC: Add numpydoc parameters sections to NamedTuple result classes
PR #10032: MAINT: Small jobs prior to release
PR #10033: DOC: Improve docstrings and css
PR #10034: DOC: Update release note
PR #10035: ENH: More use of NamedTuple
PR #10036: DOC: Fix rst errors and update notebooks
PR #10037: DOC: General fixes
PR #10038: DOC: Fix minor typo (“Destribution” -> “Distribution”)
PR #10039: TST: rename misleading WLS equivalence tests
PR #10040: DOC: General fixes
PR #10041: DOC: fix two defaults that the code does not have
PR #10042: Use self._ntop instead of literal 5 for categorical frequencies in Description
PR #10043: Fix smal bugs
PR #10044: Fix more small bugs
PR #10045: DOC: Add AI policy
PR #10046: DOC: fix typo in GLS example
PR #10047: DOC: clarify GLSAR rho argument
PR #10048: CI: Switch build that tests x13 to have coverage
PR #10049: ENH/TST: Deprecate parameter and test edge cases
PR #10050: MAINT: Improve issue and PR templates
PR #10051: CI: Change x13 binary installation
PR #10052: CI: Improve documentation generation
PR #10053: DOC: Add newly introduced functions to docs
PR #10054: CLN: Move to read_csv from genfromtxt
PR #10055: [ENH] Add Pesaran-Timmermann directional accuracy test
PR #10056: Fixups
PR #10057: DOC: add AR(p) notation to GLSAR.whiten
PR #10058: MAINT: Protect against pandas 4 changes
PR #10060: MAINT: Update PR template
PR #10061: DOC: Updates for recent robust norm docstrings
PR #10062: CLN: Remove whitespace
PR #10063: DOC: Standardized docstring changes
PR #10064: CI: Add lint-only GitHub workflow (ruff + flake8, Linux, Python 3.14)
PR #10065: More pandas 4 fixes
PR #10066: ENH: implementation of DM test
PR #10067: CLN: Fix small issues in jonckheere-terpstra
PR #10068: CLN: Fix lint issues
PR #10069: ENH: add p-value adjustments based on local false discovery rate
PR #10070: Bump actions/github-script from d746ffe35508b1917358783b479e04febd2b8f71 to 3a2844b7e9c422d3c10d287c895573f7108da1b3
PR #10071: Bump pypa/cibuildwheel from 4.1.1 to 4.2.0
PR #10072: MAINT/CLN: Remove Holder/HolderTuple in favor of documented classes
PR #10074: DOC: Remove warning from docs
PR #10075: BUG: Fix Jonckheere-Terpstra on Pyodide by casting np.repeat arg to intp size
PR #10077: MAINT: remove reduntant method validation in yule_walker
PR #10078: DOC: Add AGENTS.md and update CONTRIBUTING
PR #10079: Move README
PR #10080: DOC: Remove coveralls
PR #10081: BUG: Finish move from README.rst to README.md
PR #10082: CLN: Fix lint issues
PR #9956: docs(stats): clarify TukeyHSD reject and pvalues access
PR #10076: DOC: Improve documentation for yule_walker
PR #10083: TST: Test remaining edge cases in jonckheere_terpstra
PR #10084: BUG: Correct edge cases in n log n medcouple path
PR #10085: DOC: Update release note
PR #10087: ENH: Also check binaries with .exe
PR #10088: BUG: Check for positivity of eigval in condition number
PR #10089: BUG: fix MNLogit resid_response raising ValueError (closes #7096)
PR #10090: ENH: Make ndim more orthogonal to maxdim
PR #10091: Add LocalProjections estimator for impulse response functions (Jordà…)
PR #10092: ENH: Modify the approach to use dataclasses to limit unpack
PR #10093: REF: Move away from limited iter NamedTuple
PR #10094: MAINT: Restore accidental behavior change
PR #10095: TST: Add tests for limited iteration superclass
PR #10096: CLN: Standardize names in new objects
PR #10097: DOC: Reduce reference noise in sphinx
PR #10098: CLN/DOC: Simplify NamedTuple and dataclasses
PR #10099: DOC: Fix typo in WLS example notebook row labels
PR #10100: REF: Remove unused scipy import and cell from wls.ipynb
PR #10101: ENH: Implement L1 solver for GLM Extended #9430
PR #10102: PERF: Improve import performan in some cases
PR #10103: ENH: add crv3 cluster robust inference via the cluster jackknife for OLS/WLS
PR #10104: Docstring types regression
PR #10105: BUG: Forward missing kwarg from MixedLM.from_formula to superclass
PR #10106: BUG: Pivot the QR factorization in tools.matrix_rank
PR #10107: DOC: Standardized docstrings in tools
PR #10108: DOC: Standardized docstrings in robust
PR #10110: DOC: Standardized docstrings in stats
PR #10111: DOC: Standardized docstrings in othermod, treatment and multivariate
PR #10112: DOC: Standardized docstrings in base, datasets and compat
PR #10113: BUG: Fix numerous small bugs
PR #10114: DOC: Fix small remaining issues in regression
PR #10115: DOC: Fix small remaining issues around use of np and pd
PR #10116: DOC: Documentation cleaning pass for formula, graphics and imputation
PR #10117: DOC: Documentation cleaning pass core routines in tsa
PR #10118: DOC: Fix UECM
PR #10119: DOC: Clean docstrings in discrete, duration gam and genmod
PR #10120: BUG: Add missing self to update
PR #10121: DOC: Docstring clean in dist, emplike, iolib and mismodel
PR #10122: DOC: Replace broken OECD glossary links in endog_exog docs
PR #10123: DOC: Docstring clean in nonparametric
PR #10124: DOC: Docstring clean in vector_ar
PR #10125: DOC: Update agents to improve docstrings
PR #10127: DOC: Clean docstrings in statespace
PR #10128: DOC: Improve dataset docstrings
PR #10129: BUG: Rename variable to SUNACTIVITY
PR #10130: BUG: Correct distargs usage in scale_trimmed
PR #10131: BUG: Fix bug in line-style application
PR #10132: BUG: Enable percentile in _select_sigma
PR #10133: BUG: Fix factor reverse intent
PR #10134: BUG: Only initialize trend when required
PR #10135: BUG: Correct hess choice in betareg
PR #10136: BUG: Ensure gap size is correct in mosaic_plot
PR #10137: BUG: Ensure not implemented options raise
PR #10138: TST: Re-enable test
PR #10139: BUG: Fix bugs found in full scan
PR #10141: BUG: Fix small bugs
PR #10142: TST: Change warning class on fit_collinear
PR #10143: BUG: Correct size of cancorr returns
PR #10144: TST: Change warning on WASM
PR #10145: DOC: Standard docstrings for rng
PR #10146: TST: Silence singular warnings
PR #10147: TST: Add tests for rng selector
PR #10150: TST: Cover results-class surface gaps
PR #10151: TST: Cover dead computational methods on live estimators
PR #10152: BUG: Fix OLSInfluence._ols_xnoti crashing on every call
PR #10153: TST: Cover margins and diagnostics gaps
PR #10154: BUG: Fix RLMDetSMM.fit crashing with its documented h=None default
PR #10155: TST: Verify NewsResults summary content, not just non-emptiness (Phase…)
PR #10156: MAINT: Deprecate estimator classes with no callers and no test coverage
PR #10158: CI: Disable failing conda run
PR #10160: CI: Re-enable conda with different cython
PR #10161: ENH: Enforce string like validation
PR #10162: CI: Revery cython for legacy conda test
PR #10163: BUG: Fix MICEData using observed-row index for predict_miss_kwds
PR #10164: BUG: Fix TreatmentEffectResults mislabeling every method as IPW
PR #10165: BUG: Guard against None zero_kwds in effectsize_2proportions
PR #10166: TST: Add marker for matplotlib tests
PR #10167: ENH: Add validation to from_string methods
PR #10168: CLN: Move non-core code our of package
PR #10169: DOC: Improve docstring for pacf
PR #10170: ENH: Simplify aliases
PR #10171: REF: Delegate ETS breakvar test to the shared implementation
PR #10172: BUG: fix SARIMAX time-varying regression with differencing in the state vector
PR #10173: ENH: Improve string checking
PR #10174: BUG: Add array_like for offset
PR #10175: BUG: Remove cache_readonly the presented parameter
PR #10176: BUG: Ensure array_like covnull is coerced
PR #10177: BUG: Correct bug in knot centereing
PR #10178: BUG: Ensure linepred is always available
PR #7327: BUG: Fix libsturng issue #6541
PR #9297: Update model.py –corrected wald test error for RegimeSwitchingmodels
PR #9695: Fix: cov_type in MixedLM.fit
PR #9794: fix: use normalized_cov_params as fallback when hessian inversion fails in GLM.fit
PR #9979: BUG: back-transform the univariate smoothed measurement disturbance
PR #10179: ENH/BUG: Use scipy.special.log_wright_bessel for the Tweedie log-likelihood
PR #10180: ENH: Add explicit target for removal of string aliases
PR #10181: CI: Reduce Linux jobs to speed up completion
PR #10182: ENH: Allow string type for groups in NominalGEE
PR #10183: DOC: Update the release notes
PR #10184: MAINT: Fix the sign when using Newton’s method
PR #10185: BUG: Fix MNLogit score_test crash with exog_extra (GH#9273)
PR #10186: MAINT: Add scipy version check
PR #10187: BUG: pass transformed through to MarkovSwitching.hessian
PR #10188: TST: Avoid test where log_wright_bessel is not available
PR #10189: MAINT: Add coverage analysis tooling for the estimation API
PR #10190: BUG: Fix bad merge
PR #10191: BUG: support model-aware RLM scale callbacks
PR #10192: MAINT: Standardize on ruff
PR #10193: MAINT: Increase rule use from ruff
PR #10194: TST: Cover public API coverage gaps (batch: tools/stats/base/iolib)
PR #10195: BUG: Fix _BayesMixedGLM.fit silently returning None
PR #10196: BUG: Fix GLS.hessian_factor for 1d (heteroskedastic) sigma
PR #10197: BUG: Fix emplikeAFT.predict using endog instead of exog
PR #10198: BUG: Fix rvs_kernel ignoring rng for the Beta-kernel draws
PR #10199: TST: Add coverage for VARProcess/VARResults acorr methods
PR #10200: BUG: Fix Representation.initialize_components missing k_states arg
PR #10201: BUG: Fix miso_lfilter column selection for nvars != 2, 3
PR #10202: TST: Add skip on WASM for linalg error
PR #10203: BUG: Return NotImplementedError rather than wrong result in GLS.hessian_factor
PR #10204: ENH: Add fit_regularized to HurdleCountModel
PR #10205: BUG: Split start_params across HurdleCountModel.fit’s two components
PR #10206: MAINT: Address future changes in pandas
PR #10207: BUG: Validate exog before reconstructing the model in ARDLResults.apply
PR #10208: DOC: Update release notes
PR #10209: DOC: clarify VARResults.df_model counts parameters per equation
PR #10210: ENH: make MICEData iterable, yielding successive imputed datasets
PR #8712: STY: change nobs2 to nobs0 for consistency/style