Я пытаюсь проанализировать некоторые данные о позиции.
Вот значительно упрощенный пример:
df = pd.DataFrame({
'quantity':[3,4,1],
'unit_cost':[50,80,60]
})
df
quantity unit_cost
0 3 50
1 4 80
2 1 60
Я хочу рассчитать статистику на единицу, включая медиану. В этом примере медиана будет равна 70.
Есть ли способ сделать это без предварительного дезагрегирования количества?
Я попытался дезагрегировать каждую строку, как показано ниже, но с реальными данными требования к ресурсам были значительными.
disagDf
quantity unit_cost
0 1 50
0 1 50
0 1 50
1 1 80
1 1 80
1 1 80
1 1 80
2 1 60
IIUC вы можете сделать:
# https://stackoverflow.com/a/73905572/10035985
def weighted_quantiles_interpolate(values, weights, quantiles=0.5):
i = np.argsort(values)
c = np.cumsum(weights[i])
q = np.searchsorted(c, quantiles * c[-1])
return np.where(
c[q] / c[-1] == quantiles, 0.5 * (values[i[q]] + values[i[q + 1]]), values[i[q]]
)
df = pd.DataFrame({"quantity": [3, 4, 1], "unit_cost": [50, 80, 60]})
print(
weighted_quantiles_interpolate(
df["unit_cost"].values, weights=df["quantity"].values
)
)
Распечатки:
70.0