| pandas | columna |
|---|---|
df[cols] |
df.select(...cols) |
df.query("age > 18") |
df.filter(col('age').gt(18)) |
df.assign(x=...) |
df.withColumn('x', expr) |
df.sort_values('a') |
df.sort('a') / df.sort(col('a').desc()) |
df.head(5) |
df.head(5) |
df.groupby('c').agg(...) |
df.groupBy('c').agg({ ... }) |
df.merge(other, on=...) |
df.join(other, { on }) / leftJoin / innerJoin |
df.fillna(0) |
df.fillNull(0) |
df.dropna() |
df.dropNull() |
pd.melt |
df.melt({ idVars, valueVars }) |
df.pivot_table |
df.pivot({ index, columns, values }) |
pd.concat |
LazyFrame.concat([a, b]) |
df.describe() |
df.describe() — df.describe({ quantileMethod: 'minitab' }) for Minitab's quartiles |
df.x.quantile(0.25) (interpolation='linear') |
col('x').quantile(0.25) — type 7, position (n − 1)q |
np.percentile(x, 25, method='weibull') / Minitab / SPSS / R type = 6 |
col('x').quantile(0.25, 'minitab'), col('x').median('minitab') — position q(n + 1), clamped; also quantile(x, p) from columna/advanced (Minitab by default, { method: 'linear' } for pandas) |
df.corr() / df.corr(method="spearman") |
df.corr() / df.corr({ method: 'spearman' }) — колонка column + матрица |
df.cov() |
df.cov() |
df['c'].value_counts() |
df.valueCounts('c') |
df.drop_duplicates() |
df.unique() |
df.rolling(3).mean() |
df.rolling('out', 'col', 3, 'mean') |
df['x'].rank(method='average') |
df.withWindow('r', 'rank', { orderBy: ['x'], method: 'average' | 'min' | 'max' | 'dense' | 'ordinal' }) |
df['x'].shift(1) / lead |
df.withWindow('prev', 'lag' | 'lead', { expr: col('x'), offset: 1 }) |
df.iloc[a:b] |
df.slice(a, b) |
df.iloc[[i,j]] |
df.take([i, j]) |
pd.read_csv |
DataFrame.fromCSV(text) / fromCSVUrl |
pd.read_json |
DataFrame.fromJSON(...) |
Notes:
.collect() (or .toArray()) to execute.col / lit expressions so WASM/WebGPU can accelerate..engine('webgpu' | 'wasm' | 'cpu')..explain().Broadcast aggregates (scalar context):
| pandas | columna |
|---|---|
(df.x - df.x.mean()) / df.x.std() |
col('x').sub(col('x').mean()).div(col('x').std()) |
df.x / df.x.sum() |
col('x').div(col('x').sum()) |
df[df.x > df.x.median()] |
df.filter(col('x').gt(col('x').median())) |
Window aggregates (pandas transform):
| pandas | columna |
|---|---|
df.groupby('g').x.transform('mean') |
col('x').mean().over('g') |
df.x - df.groupby('g').x.transform('mean') |
col('x').sub(col('x').mean()).over('g') |
df.x / df.groupby(['g','h']).x.transform('sum') |
col('x').div(col('x').sum().over(['g', 'h'])) |
df[df.x > df.groupby('g').x.transform('mean')] |
df.filter(col('x').gt(col('x').mean().over('g'))) |
df.sort_values('t').groupby('g').x.cumsum() (back in original order) |
col('x').sum().over('g', { orderBy: 't' }) |
df.sort_values('t').groupby('g').x.expanding().mean() |
col('x').mean().over('g', { orderBy: 't' }) |
df.sort_values('t').x.cumsum() |
col('x').sum().over([], { orderBy: 't' }) |
Math (element-wise, numeric):
| pandas / numpy | columna |
|---|---|
np.sqrt(df.x) / np.log(df.x) / np.exp(df.x) |
col('x').sqrt() / .log() / .exp() |
np.log10(df.x), np.log2, np.log(x)/np.log(b) |
col('x').log10(), .log2(), .log(b) |
df.x ** 2, np.power(a, b) |
col('x').pow(2), col('a').pow(col('b')) |
df.x.round(2) (half-to-even) |
col('x').round(2) (half away from zero, as Minitab / Excel) |
np.floor / np.ceil / np.sign |
.floor() / .ceil() / .sign() |
df.a + ' ' + df.b, df.a.str.cat(df.b, sep) |
col('a').str.concat(col('b'), ' ') |
df.s.str.zfill(4) / .str.pad(6, side='right') |
col('s').str.padStart(4, '0') / .str.padEnd(6) |
Everything below this line is in columna/advanced (import … from 'columna/advanced').
Distributions (scipy.stats):
| scipy | columna |
|---|---|
norm(mu, sd).cdf(x) / .sf / .ppf / .isf / .pdf |
dist.normal(mu, sd).cdf(x) … |
t(df), chi2(k), f(d1, d2) |
dist.t(df), dist.chi2(k), dist.f(d1, d2) |
binom(n, p).pmf/cdf/ppf, poisson(mu), hypergeom.pmf |
dist.binomial(n, p), dist.poisson(mu), hypergeomPmf(k, N, K, n) |
nct.cdf(x, df, nc), ncf.cdf, ncx2.cdf |
nctCdf(x, df, nc), ncfCdf(x, d1, d2, nc), ncChi2Cdf(x, k, nc) |
scipy.special.gammaln / gammainc / betainc / erf |
lgamma / gammainc / betainc / erf |
Hypothesis tests (scipy.stats):
| scipy | columna |
|---|---|
ttest_1samp(x, mu) |
ttest1(x, { mu }) / df.ttest('x', { mu }) |
ttest_ind(a, b, equal_var=False) |
ttest2(a, b) / df.ttest('x', { by: 'g' }) (Welch default; equalVar: true pools) |
ttest_rel(a, b) |
ttestPaired(a, b) / df.ttest('a', { paired: 'b' }) |
f_oneway(*groups) |
anova({ g1, g2, … }) / df.anova('x', 'g') |
tukey_hsd(*groups) |
tukeyHSD({ g1, g2, … }) / df.tukey('x', 'g') — plus Minitab grouping letters |
dunnett(*samples, control=…, alternative) |
dunnett(groups, { control, alternative }) / df.dunnett('x', 'g', { control }) |
— (statsmodels pairwise_tukeyhsd has no LSD) |
fisherLSD(groups) / df.fisher('x', 'g') |
| — (Minitab only) | hsuMCB(groups, { best }) / df.hsu('x', 'g') |
levene(*groups, center='median') / bartlett(*groups) |
levene(groups) / bartlett(groups) / bonett(groups) / df.equalVariances('x', 'g', method) |
| — (Minitab 2 Variances, Bonett) | bonett2(a, b) |
studentized_range.cdf(q, k, df) / .ppf |
ptukey(q, k, df) / qtukey(p, k, df) |
chi2_contingency(table, correction=False) |
chi2test(table) / df.chi2test('a', 'b') |
chisquare(obs, f_exp, ddof) |
chi2gof(obs, expected, { ddof }) |
pd.crosstab(a, b) |
crosstab(a, b) |
mannwhitneyu(a, b, alternative, method) |
mannWhitney(a, b, { alternative, method }) / df.mannWhitney('x', 'g') — plus Hodges–Lehmann estimate and CI |
kruskal(*groups) |
kruskal(groups) / df.kruskal('x', 'g') — plus per-group medians, average ranks, z |
shapiro(x) |
shapiroWilk(x) / df.normalityTest('x', 'shapiro-wilk') |
anderson(x, 'norm') (statistic only) |
andersonDarling(x) / df.normalityTest('x') — with Minitab's p-value |
kstest(x, 'norm', args=(mean, sd)) statistic; statsmodels lilliefors p |
kolmogorovSmirnov(x) / df.normalityTest('x', 'kolmogorov-smirnov') |
| — (Minitab only) | ryanJoiner(x) / df.normalityTest('x', 'ryan-joiner') |
statsmodels ztest(x, value=mu) |
ztest1(x, { sigma, mu }) / df.ztest('x', { sigma, mu }) |
binomtest(k, n, p).pvalue + .proportion_ci(method='exact') |
propTest1(k, n, { p0 }) (exact + Clopper–Pearson; method: 'normal' Wald) |
statsmodels proportions_ztest / fisher_exact(table) |
propTest2(e1, n1, e2, n2) / { method: 'fisher' } |
poisson.cdf by hand / statsmodels test_poisson |
poissonRateTest1(events, exposure, { lambda0 }), poissonRateTest2(...) |
chi2 by hand (1 variance) |
varTest1(x, { sigma0 }) / df.varTest; { method: 'bonett' } for non-normal data |
pearsonr(a, b) + .confidence_interval(), spearmanr(a, b) |
corrTest(a, b) / df.corrTest('a', 'b', { method }) |
outliers::grubbs.test / dixon.test (R) |
grubbs(x), dixon(x) / df.outlierTest('x', { method }) |
binomtest(above, above+below) (sign) |
signTest(x, { median }) / df.signTest — plus Minitab's interpolated CI |
wilcoxon(x - mu, method, zero_method='wilcox') |
wilcoxonSigned(x, { median, method }) / df.wilcoxon — plus Walsh-average estimate and CI |
median_test(*groups, ties='below', correction=False) |
moodMedian(groups) / df.mood('x', 'g') |
friedmanchisquare(*columns) |
friedman(table) / df.friedman('y', 'treatment', 'block') |
statsmodels runstest_1samp(x, cutoff='mean') |
runsTest(x, { k, correction }) / df.runsTest('x') |
statsmodels ttost_paired / ttost_ind |
tost1, tost2, tostPaired / `df.equivalence('y', { limits, by |
statsmodels TTestPower().solve_power, NormalIndPower, FTestAnovaPower |
power({ test, effect, n, power, alpha, alternative }) |
Regression and models (statsmodels / sklearn / scipy):
| Python | columna |
|---|---|
sm.OLS(y, sm.add_constant(X)).fit() + .summary(), OLSInfluence |
ols(y, X) / df.regress('y', [...]) — coefficients, ANOVA, VIF, leverage, Cook's D, DFFITS, studentized residuals, unusual observations |
np.polyfit(x, y, deg) |
fittedLine(x, y, { degree }) / df.fittedLine('x', 'y') |
sm.WLS |
ols(y, X, { weights }) |
.get_prediction(Xnew).summary_frame() |
result.predict(xNew) → fit, se, ci, pi |
statsmodels stepwise recipes / R leaps::regsubsets |
stepwise(y, X, { method, alphaIn, alphaOut }), bestSubsets(y, X) |
sm.Logit(y, X).fit(), sm.GLM(family=Binomial()) |
logit(y, X) / df.logistic('y', [...]); { trials } for events / trials, link: 'probit' | 'cloglog' |
sm.GLM(y, X, family=Poisson(), offset=np.log(t)) |
poissonRegression(y, X, { offset }) / df.glm('y', [...], { family: 'poisson', offset }) |
OrderedModel(y, X, distr='logit') (note: opposite sign convention) |
ologit(y, X) / df.ologit('y', [...]) — Minitab's logit P(Y ≤ k) = θ_k + x'β |
sm.MNLogit(y, X) |
mlogit(y, X, { reference }) / df.mlogit |
smf.ols('y ~ C(a)*C(b) + x').fit() + anova_lm(typ=3) (with sum contrasts) |
linearModel(data, 'y ~ a*b + x') / df.linearModel('y ~ a*b + x') |
scipy.optimize.curve_fit(f, x, y, p0) |
nls(f, x, y, { start }) / df.nls(f, 'x', 'y', { start }) — plus t / p / CI, correlation matrix, history, predict() |
scipy.odr with sx, sy |
orthogonalRegression(x, y, { errorVarianceRatio }) |
sklearn.cross_decomposition.PLSRegression(n_components) |
pls(y, X, { components, standardize }) — plus R²X / R²Y per component and LOO predicted R² |
Quality tools / SPC (qcc, SixSigma, AIAG MSA):
| Python / R | columna |
|---|---|
| ASTM / Minitab chart constants | spcConstants(n) → A2, A3, B3, B4, D3, D4, d2, c4 |
qcc::qcc (xbar.one / xbar / R / S / p / np / c / u) |
controlChart(x, { type, subgroup, sizes }) / df.controlChart — Nelson rules 1–8 |
qcc::ewma, qcc::cusum |
ewma({ lambda, L }), cusum({ h, k }), movingAverage({ span }) |
qcc::process.capability / SixSigma |
capability(x, { lsl, usl, subgroup, target }) / df.capability — Cp, Cpk, Pp, Ppk, Cpm, PPM, Z.Bench |
scipy.stats.boxcox, weibull_min.fit |
boxCoxLambda, johnsonFit, weibullFit |
R tolerance |
toleranceInterval(x, { coverage, confidence, method }) |
| AIAG / Minitab Gage R&R | gageRR({ part, operator, measurement }), gageLinearity, gageType1 |
statsmodels.stats.inter_rater |
attributeAgreement — Cohen / Fleiss κ, Kendall W / τ |
| ANSI Z1.4 OC | acceptanceSampling({ type, n, c | k }) — Pa, AOQ, ATI |
| Pareto / run chart / IDI | pareto, runChart, multiVari, symmetryTest, individualDistributionID |
Time series / DOE / reliability / multivariate / predictive:
| Python / R | columna |
|---|---|
np.polyfit / Minitab Trend Analysis |
trendAnalysis(y, { model: 'linear'|'quadratic'|'exponential'|'s-curve' }) |
statsmodels.tsa.seasonal_decompose |
decompose(y, { seasonLength }) |
statsmodels.tsa.seasonal.STL |
stl(y, { seasonLength, robust? }) |
ExponentialSmoothing / Holt–Winters |
ets(y, { method: 'ses'|'des'|'winters-add'|'winters-mul' }) — forecastLower/forecastUpper |
acf / pacf / ccf, acorr_ljungbox |
acf, pacf, ccf, ljungBox |
ARIMA / SARIMA / ARIMAX / auto_arima |
arima(...), autoArima (stepwise AIC/BIC; orders ≤5) |
pyDOE2 / Minitab DOE + Taguchi S/N |
fullFactorial…taguchi (L4–L36), definitiveScreening, mixtureDesign/analyzeMixture, responseOptimizer, analyzeTaguchi |
lifelines / weibull_min.fit (censored) |
reliabilityFit (MLE SE/CI), kaplanMeier, probabilityPlot, warrantyPrediction |
lifelines.statistics.logrank_test / survdiff / CoxPHFitter |
logRank(..., { weight, strata }), coxPH (strata, frailty, counting-process) |
statsmodels.MixedLM / lme4 / glmer |
mixedModel (RI+RS), glmm (binomial/Poisson PQL) |
sklearn.decomposition.PCA, FactorAnalysis |
pca, factorAnalysis (method: 'pca'|'ml' + varimax) |
KMeans, hierarchical, LDA/QDA |
kmeans, hclust, discriminant |
sklearn.tree / RandomForest / GBM / GradientBoostingClassifier / py-earth |
cart, randomForest, treeNet (task: 'regression'|'classification'), mars (GCV prune) |
sklearn.model_selection.cross_val_score, AutoML |
crossValidate(X, y, { model, folds }), autoModel(X, y) |
Remaining Minitab menu items:
| Python / R | columna |
|---|---|
df.describe() + scipy.stats.describe / Minitab Display Descriptive Statistics |
descriptiveStats(x | { a, b }, { by }) — Minitab's full table; graphicalSummary(x) |
scipy.stats.chisquare on Poisson expected counts |
poissonGof(counts) (tail pooling, df = k − 2) |
np.percentile(method='weibull'), plt.boxplot stats |
boxplotStats, dotplot, ecdf, intervalPlot, mainEffectsPlot, interactionPlot |
ICH Q1E shelf-life (R stability) |
stabilityStudy(y, time, batch, { lsl, usl }) |
qcc g / t charts; MSQC::mult.chart (T², MEWMA) |
gChart, tChart, t2Chart, mewma, generalizedVarianceChart |
scipy.signal.periodogram, spec.pgram (R), cpgram |
periodogram(x, { spans, taper, detrend }), cumulativePeriodogram |
FrF2::aliases (R) |
aliasStructure(k, generators) |
survreg (R) / lifelines.WeibullAFTFitter |
lifeRegression(time, X, { distribution, censor, time2 }) |
ALTA / survreg with Arrhenius |
altRegression(time, stress, { relation, useStress }) |
| Minitab Test Plans | demonstrationTestPlan, estimationTestPlan |
reliability::crow_amsaa / Crow–AMSAA |
powerLawNHPP(times, { endTime }) |
R MASS::dose.p / Minitab Probit Analysis |
probitAnalysis(events, trials, stress, { distribution, naturalResponse }) |
scipy.cluster.hierarchy.linkage(1 − r) |
clusterVariables(data, { method, distance, nClusters }) |
prince.MCA / FactoMineR::MCA |
multipleCorrespondence(data, { method }) |
pingouin.cronbach_alpha / psych::alpha |
itemAnalysis(items) |
psych::promax |
promax(loadings, { power }) |
statsmodels.multivariate.manova.MANOVA |
manovaModel(data, responses, 'a*b + x') |
np.random.default_rng(seed) |
random(seed).normal(n, mean, sd) … (16 distributions), patterned(from, to) |
scipy.stats.weibull_min / gamma / beta / lognorm / logistic / gumbel_l |
dist.weibull / gamma / beta / lognormal / logistic / smallestExtremeValue |