我正在查看 Pandas 数据框中的每个日期,并根据每个日期的另一列的条件调整一列(权重)

I am looking at each individual date in a Pandas dataframe and adjusting one column (weight), based on condition on another column for each date

我有一个包含 10 列的数据框 (df)。该索引有许多不同的日期,但是有多个相同的日期(并且按日期排序)。此外,此问题的重要列是 df['Weight'] 和 df['Price'].

这是一个只有 1 个索引值 (1/21/2017) 的 2 列数据示例,实际上有多个日期具有多个权重等。

          Weight    Price
1/21/2017   0.1     12
1/21/2017   0.04    21
1/21/2017   0.03    13
1/21/2017   0.02    22
1/21/2017   0.2     27
1/21/2017   0.001   30
1/21/2017   0.1     34
1/21/2017   0.21    21
1/21/2017   0.003   12
1/21/2017   0.01    32
1/21/2017   0.04    21
1/21/2017   0.005   12
1/21/2017   0.05    10
1/21/2017   0.1      3
1/21/2017   0.091   24

特定索引的权重加起来为 1,对于索引的每个唯一日期都是如此。

现在我正在尝试创建一个 df['adjusted weight'] 列,它将基于特定日期每个价格值的百分比排名。

特定日期相对于其他价格的中间 80% 的价格,df['adjusted weight'] 将等于 df['Weight'].

对于特定日期最低 10% 的价格,df['Adjusted weight'] 将为 df['Weight'] / 2 。

对于任何日期前 10% 的价格,我们需要调整调整后的权重,以便该日期的新 df[调整后的权重'] 现在等于 1。

这将通过将某个日期价格在前 10% 的所有权重除以前 10% 价格的当前权重总和,然后乘以该数字本身 + 总和来完成从底部砍掉的重量的 10%,使它再次成为 1。

这是我想要的输出:

          Weight    Price   Percent rank    Adjusted Weight
1/21/2017   0.1     12  0.142   0.1
1/21/2017   0.04    21  0.428   0.04
1/21/2017   0.03    13  0.357   0.03
1/21/2017   0.02    22  0.642   0.02
1/21/2017   0.2     27  0.785   0.2
1/21/2017   0.001   30  0.857   0.001
1/21/2017   0.1     34  1       **0.168181818**
1/21/2017   0.21    21  0.428   0.21
1/21/2017   0.003   12  0.142   0.003
1/21/2017   0.01    32  0.928   **0.016818182**
1/21/2017   0.04    21  0.428   0.04
1/21/2017   0.005   12  0.142   0.005
1/21/2017   0.05    10  0.071   **0.025**
1/21/2017   0.1     3   0       **0.05**
1/21/2017   0.091   24  0.714   0.091

我已将 ** 放在已更改的值周围,巧合的是,有 2 个值位于底部 10% pct 等级,2 个值位于顶部 10% 等级。对于底部的 2 个值,它只是 weight/2 ,对于顶部的 2 个值,我在 excel, =E8/(E11+E8)*(E11+E8+E15+E14-(H15+ H14)) 其中 tha table 从 D1 跨越到 H16。

这是一个非常棘手的问题,但我希望以合理的方式提出。如果有人可以提供建议和帮助,我将不胜感激。感谢您阅读并喜欢听听我的想法。此外,数据集很大,所以我不确定需要多长时间,因为它需要为每个日期做同样的工作。

我希望调整后的权重成为与原始权重并存的新列。此外,可以与其他列一起使用的东西以及价格会很棒。

非常感谢大家的帮助和支持。

祝福。

def adjust(df):
    df = df.copy()
    b, t = df.Price.quantile([.1, .9])
    ltb = df.Price.lt(b)
    get = df.Price.ge(t)
    bsum = df.Weight[ltb].sum()
    tsum = df.Weight[get].sum()
    df.loc[ltb, 'Weight'] /= 2
    df.loc[get, 'Weight'] *= (bsum / 2 + tsum) / tsum
    return df

df.groupby(level=0).apply(adjust).reset_index(0, drop=True)

              Weight  Price
2017-01-21  0.100000     12
2017-01-21  0.040000     21
2017-01-21  0.030000     13
2017-01-21  0.020000     22
2017-01-21  0.200000     27
2017-01-21  0.001000     30
2017-01-21  0.168182     34
2017-01-21  0.210000     21
2017-01-21  0.003000     12
2017-01-21  0.016818     32
2017-01-21  0.040000     21
2017-01-21  0.005000     12
2017-01-21  0.025000     10
2017-01-21  0.050000      3
2017-01-21  0.091000     24