Как быстро расчитать среднее арифметическое, геометрическое и гармоническое для разности остортированных элементов каждой строки в таблице?
Как быстро и эффективно расчитать среднее арифметическое, геометрическое и гармоническое для разности остортированных элементов каждой строки в таблице с 100 миллионами строк?
В случае если разность двух элементов одной строки равна нулю, то ноль нужно заменить на 1 для подсчета среднего.
Ниже приведен код. Работает только подсчет ndf['r1'] но и он очень медленный из-за apply. Не знаю, как также быстро подсчитать среднее геомитрическое и гармоническое.
import pandas as pd
import math
lst = [[1,23,45],[20,30,10],[60,15,2]]
df = pd.DataFrame(lst, columns = ['col1', 'col2', 'col3'])
print(df)
ndf = pd.DataFrame()
ndf['r1'] = df.apply(lambda x: pd.Series(list(x.sort_values())),axis=1).diff(axis=1).iloc[:,1:].mean(axis=1)
#ndf['r2'] = (10 ** df.apply(lambda x: x.sort_values(),axis=1).diff(axis=1).iloc[:,1:].applymap(math.log10).sum(axis=1)) ** (1/len(columns))
#ndf['r3'] = len(df.columns)/( (1/df.diff(axis=1).iloc[:,1:]).sum(axis=1) )
print(ndf)
Ответы (1 шт):
Автор решения: MaxU
→ Ссылка
Пример данных:
from scipy.stats import gmean, hmean
df = pd.DataFrame([[1,23,45],[20,30,10],[60,15,2],[45,1,1]])
In [91]: df
Out[91]:
0 1 2
0 1 23 45
1 20 30 10
2 60 15 2
3 45 1 1 # <--- пример строки, где разность двух элементов одной строки равна нулю
векторизированное решение с использованием Numpy и SciPy:
# матрица разностей остортированных элементов каждой строки в таблице
a = np.diff(np.sort(df, axis=1), axis=1)
# замена 0 --> 1
a[a==0] = 1
res = pd.DataFrame({
"mean": np.mean(a, axis=1),
"gmean": gmean(a, axis=1),
"hmean": hmean(a, axis=1)
}, index=df.index)
результат:
In [92]: res
Out[92]:
mean gmean hmean
0 22.0 22.000000 22.000000
1 10.0 10.000000 10.000000
2 29.0 24.186773 20.172414
3 22.5 6.633250 1.955556