我正在查看 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
我有一个包含 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