Коротко
mean— среднее,median— медиана (устойчива к выбросам).stdиvarпо умолчанию делят наn(ddof=0). Выборочная оценка —ddof=1; так по умолчанию считает pandas.percentile(a, q)— перцентили в процентах (0–100),quantile(a, q)— то же в долях (0–1). Способ интерполяции задаётmethod.average(a, weights=w)— взвешенное среднее.corrcoef(x, y)возвращает матрицу 2 × 2; сам коэффициент — элемент[0, 1]. Ковариация —cov.- Все функции принимают
axis; с пропусками —nanmean,nanmedian,nanpercentile…
Синтаксис
np.mean(a, axis=None), np.median(a, axis=None)
np.std(a, axis=None, ddof=0), np.var(a, ddof=0)
np.percentile(a, q, axis=None, method="linear") # q в 0–100
np.quantile(a, q, method="linear") # q в 0–1
np.average(a, weights=None)
np.corrcoef(x, y)[0, 1]Параметры
ПараметрЧто делаетПо умолчанию
ddofпоправка в знаменателе: делится на n − ddof0qуровень: число или список; 0–100 в percentile, 0–1 в quantileобязательныйmethodспособ взять значение между точками: 'linear', 'lower', 'higher', 'nearest', 'midpoint'…'linear'weightsвеса для average той же формы, что данныеNoneПримеры
salaries = np.array([52, 48, 61, 55, 300, 58, 50]) # тыс. руб.; один руководительprint(np.mean(salaries)) # выброс сильно тянет среднее
np.median(salaries) # медиана устойчива к выбросамВывод
89.14285714285714 np.float64(55.0)
print(np.percentile(salaries, [25, 50, 75]))
np.quantile(salaries, 0.9) # то же, но в доляхВывод
[51. 55. 59.5] np.float64(156.60000000000008)
data = np.array([1, 2, 3, 4])
print(np.percentile(data, 50)) # linear: между 2 и 3
np.percentile(data, 50, method="lower") # ближайшее снизу из данныхВывод
2.5 np.int64(2)
grades = np.array([5, 4, 3])
weights = np.array([2, 1, 1]) # вес оценки
np.average(grades, weights=weights)Вывод
np.float64(4.25)
hours = np.array([1, 2, 3, 4, 5])
score = np.array([52, 55, 61, 70, 74])
print(np.corrcoef(hours, score).round(3)) # матрица 2 × 2
np.cov(hours, score)Вывод
[[1. 0.987]
[0.987 1. ]]
array([[ 2.5 , 14.75],
[14.75, 89.3 ]])Подводные камни
std в NumPy и pandas отличается
np.std по умолчанию ddof=0, а Series.std() в pandas — ddof=1. На маленьких выборках разница заметна.
print(np.std(salaries)) # ddof=0 — по генеральной совокупности
np.std(salaries, ddof=1) # ddof=1 — выборочное, как в pandasВывод
86.18324094862159 np.float64(93.08853952273712)
Параметр interpolation удалён
np.percentile(salaries, 50, interpolation="lower")Ошибка
TypeError: percentile() got an unexpected keyword argument 'interpolation'