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
我有以下数据框:
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