Python:对每一行进行排序并累加权重

Python: Sort every row and accumulate weights

我有以下数据框:

df1 = pd.DataFrame(
{
"A_price": [10, 12, 15],
"B_price": [20, 19, 29],
"C_price": [23, 21, 4],
"D_price": [45, 47, 44],
},
index = ['01-01-2020', '01-02-2020', '01-03-2020']
)

df2 = pd.DataFrame(
{
"A_weight": [0.1, 0.2, 0.4],
"B_weight": [0.2, 0.5, 0.1],
"C_weight": [0.3, 0.2, 0.1],
"D_weight": [0.4, 0.1, 0.4],
},
index = ['01-01-2020', '01-02-2020', '01-03-2020']
)

out = pd.merge(df1, df2, left_index=True, right_index=True)
out.columns = out.columns.str.split('_', expand=True)
out = out.sort_index(axis=1)
out:
            A               B               C               D
            price   weight  price   weight  price   weight  price   weight
01-01-2020  10      0.1     20      0.2     23      0.3     45      0.4
01-02-2020  12      0.2     19      0.5     21      0.2     47      0.1
01-03-2020  15      0.4     29      0.1     4       0.1     44      0.4

我想做的是计算加权中位数,它是通过按价格对(重量,价格)对进行排序然后累加权重直到跨越两个价格找到50%的累积权重点。

然后我们在这两个(重量,价格)对之间进行插值以找到累积重量为 50% 的价格,然后将该价格放入新的 DataFrame。

更新:我更改了我的数据框,因此它更能反映我目前拥有的内容。

我想要的输出是每行的加权中位数。意思是,对于索引“01-01-2020”的行,我希望中位数是 price = 23 的插值,因为当您在该行中添加权重时,我们有 0.1+0.2+0.3 > 0.5。所以我会得到一个价格数据框,如下所示:

df_prices:
             Price
01-01-2020   23
01-02-2020   19
01-03-2020   29

IIUC:

def wmedian(sr):
    df = sr.unstack().sort_values('price')
    return df.loc[df['weight'].cumsum() > 0.5, 'price'].iloc[0]

out2 = out.apply(wmedian, axis=1)
print(out2)

# Output:
01-01-2020    23.0
01-02-2020    19.0
01-03-2020    29.0
dtype: float64

https://en.wikipedia.org/wiki/Weighted_median