在python中使用乘积和平均公式创建损失率表

Posted

技术标签:

【中文标题】在python中使用乘积和平均公式创建损失率表【英文标题】:Using product and average formula in python to create a loss rate table 【发布时间】:2021-04-26 16:31:16 【问题描述】:

我正在尝试根据我在 python 中已有的流量数据框创建损失率表(见下文)。感谢有人可以帮助我编写代码。我在下面复制了 excel 公式,但如果您需要更多信息,请告诉我。

损失率表B8单元格中的excel公式为=PRODUCT(B2:$H$2)。此公式已应用于整个表格,例如在单元格 C3 中我使用了=PRODUCT(C3:$H$3)

最后,第13行公式中的平均值是计算损失率后的列的简单平均值。即B13中的公式是=AVERAGE(B8:B12)

提前感谢您的帮助!

Flow Rate
A B C D E F G H
1 Month NYD DPD30 DPD60 DPD90 DPD120 DPD150 Loss
2 Feb 0.40 0.70 0.63 0.50 0.90 0.30 1.00
3 Mar 0.74 0.63 0.57 0.72 0.80 0.56 1.00
4 Apr 0.67 0.73 0.76 0.63 0.83 0.67 1.00
5 May 0.57 0.67 0.69 0.66 0.64 0.60 1.00
6 June 0.50 0.67 0.64 0.72 0.72 0.94 1.00
Loss rate
A B C D E F G H
7 Month NYD DPD30 DPD60 DPD90 DPD120 DPD150 Loss
8 Feb 0.02 0.06 0.08 0.14 0.27 0.30 1.00
9 Mar 0.08 0.11 0.18 0.32 0.44 0.56 1.00
10 Apr 0.13 0.19 0.26 0.35 0.56 0.67 1.00
11 May 0.07 0.12 0.17 0.25 0.38 0.60 1.00
12 June 0.10 0.21 0.31 0.49 0.68 0.94 1.00
13 Average 0.08 0.14 0.20 0.31 0.47 0.61 1.00

【问题讨论】:

您的数据在数据框中是如何排列的?你能给出你期望的数据框输出和你期望的输出吗? 我尝试在此处复制 df,但无法以可读形式复制粘贴。 【参考方案1】:

您可以使用iloc 仅获取数据框的数字部分,然后使用apply 函数和cumprod 在水平轴上以相反的顺序(axis=1) (x[::-1]),评估数据从右到左的累积乘积。这将产生损失率表中描述的预期输出。要添加最后一行 (average),请计算 mean 并将结果系列转换为转置数据框。然后将这个数据框连接到df_loss 以达到预期的结果。如果需要,您可以使用原始 month 名称创建新的 index,并使用 pd.IndexAverage 添加到其中。

import pandas as pd

d = 
'Month': 0: 'Feb ', 1: 'Mar ', 2: 'Apr ', 3: 'May ', 4: 'June ',
'NYD': 0: 0.4, 1: 0.74, 2: 0.67, 3: 0.57, 4: 0.5,
'DPD30': 0: 0.7, 1: 0.63, 2: 0.73, 3: 0.67, 4: 0.67,
'DPD60': 0: 0.63, 1: 0.57, 2: 0.76, 3: 0.69, 4: 0.64,
'DPD90': 0: 0.5, 1: 0.72, 2: 0.63, 3: 0.66, 4: 0.72,
'DPD120': 0: 0.9, 1: 0.8, 2: 0.83, 3: 0.64, 4: 0.72,
'DPD150': 0: 0.3, 1: 0.56, 2: 0.67, 3: 0.6, 4: 0.94,
'Loss': 0: 1.0, 1: 1.0, 2: 1.0, 3: 1.0, 4: 1.0

df = pd.DataFrame(d)
print(df)

df_loss = df.iloc[:, 1:].apply(lambda x: x[::-1].cumprod(), axis=1)
df_loss = df_loss[df.columns[1:]] # fix presentation order

dmean = pd.DataFrame(df_loss.mean()).T
df_loss = pd.concat([df_loss, dmean])

df_loss.index = pd.Index([*df.Month, "Average"], name="Month")

print(df_loss.round(3))

df_loss的输出

           NYD  DPD30  DPD60  DPD90  DPD120  DPD150  Loss
Month
Feb      0.024  0.060  0.085  0.135   0.270   0.300   1.0
Mar      0.086  0.116  0.184  0.323   0.448   0.560   1.0
Apr      0.130  0.194  0.266  0.350   0.556   0.670   1.0
May      0.067  0.117  0.175  0.253   0.384   0.600   1.0
June     0.104  0.209  0.312  0.487   0.677   0.940   1.0
Average  0.082  0.139  0.204  0.310   0.467   0.614   1.0

【讨论】:

以上是关于在python中使用乘积和平均公式创建损失率表的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 python 公式的 Databricks 数据框创建一个新的计算字段写回 sql 表

HR必备 的 100个常用算法大全

关于莱布尼茨函数乘积的求导公式

04 解链式法则和乘积法则

报告训练数据集中特定样本的训练损失,而不是训练过程中的平均损失 (TensorFlow)

添加值时不会自动显示平均值