【问题标题】: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我正在查看 Pandas 数据框中的每个单独日期,并根据每个日期另一列的条件调整一列(权重)
【发布时间】:2017-06-06 10:42:18
【问题描述】:

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

这是一个只有 1 个索引值(2017 年 1 月 21 日)的 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。

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

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

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

最好的祝愿。

【问题讨论】:

    标签: python pandas indexing dataframe indices


    【解决方案1】:
    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
    

    【讨论】:

    • 谢谢。我已经使用了这段代码,但我想问,当我挣扎时,我将如何将它添加为另一列而不是替换我现有的权重表,并且我尝试将该函数用于其他列以及价格,但出于某种原因,这些值出来一样。非常感谢您的回答——
    猜你喜欢
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 2022-12-19
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多