2024-05-13 07:56:50 发布
网友
我正试图从python中已有的流量数据框中创建损失率表(见下文)。如果有人能帮我写代码,我将不胜感激。我复制了下面的excel公式,但如果您需要更多信息,请告诉我
损失率表B8单元格中的excel公式为=PRODUCT(B2:$H$2)。此公式已应用于整个表,例如在单元格C3中,我使用了=PRODUCT(C3:$H$3)
=PRODUCT(B2:$H$2)
=PRODUCT(C3:$H$3)
最后,第13行公式中的平均值是计算损失率后各列的简单平均值。i、 e.B13中的公式为=AVERAGE(B8:B12)
=AVERAGE(B8:B12)
提前感谢您的帮助
您可以使用iloc仅获取数据帧的数字部分,然后使用apply函数,在水平轴(cumprod)上按相反顺序(axis=1)使用x[::-1],从右到左计算数据上的累积乘积。这将产生损失率表中描述的预期输出。要添加最后一行(average),请计算mean并将结果序列转换为转置数据帧。然后将该数据帧连接到df_loss以获得预期结果。如果需要,可以使用原始的month名称创建新的index,并使用pd.Index将Average添加到其中
iloc
apply
cumprod
axis=1
x[::-1]
average
mean
df_loss
month
index
pd.Index
Average
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_损耗
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
您可以使用
iloc
仅获取数据帧的数字部分,然后使用apply
函数,在水平轴(cumprod
)上按相反顺序(axis=1
)使用x[::-1]
,从右到左计算数据上的累积乘积。这将产生损失率表中描述的预期输出。要添加最后一行(average
),请计算mean
并将结果序列转换为转置数据帧。然后将该数据帧连接到df_loss
以获得预期结果。如果需要,可以使用原始的month
名称创建新的index
,并使用pd.Index
将Average
添加到其中df_损耗
相关问题 更多 >
编程相关推荐