将公式应用于需要最后输出的列的最快方法

2024-04-26 21:38:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据集,我正在计算以下公式定义的“危险率”:

if t = 1:
     hr_t  = pd_t

else:
     hr_t = (pd_t * (t - (t-1)) + hr_(t-1) * (t-1)) / t

其中t代表时间(以年表示)

最简单的方法是遍历表中的每一行。然而,这也是最慢的。有没有一种有效的方法可以根据数据帧中的条件来计算上述两个公式?你知道吗

#Create the year and PD values
data = {'Year':[1,2,3,4,5],
        'PD': [0.1, 0.23, 0.22, 0.19, 0.10]}
data

#Create a dataframe
df = pd.DataFrame(data)
df

使用上述两个函数中的一个计算每个时间段(每行所示的t)的危险率。随着年份的增加,危险率参考同一行,但是前一年的函数

输出示例:

Year    PD    Hazard_rate
1       0.1   0.1
2       0.23  0.165
3       0.22  0.226667
4       0.19  0.2125
5       0.10  0.172

第2年的危险率按以下方式计算:

PD      Year-(Year-Year-1)+hazard_rate_(Year-1) * (Year - 1) / (Year)
0.23 * (2 - (2 - 1)) + 0.1 * (2 - 1) / 2 = 0.165

Tags: 数据方法函数dfdataif定义rate
2条回答

我不确定如何得到t和HR,因为它们不在df中,但这适用于常量,如果它们是列,那么只需将计算函数中的常量替换为行['t'],并从函数的参数中删除HR和t

data = {'Year':[1,2,3,4,5], 'PD': [0.1, 0.23, 0.22, 0.19, 0.10]}
df = pd.DataFrame(data)

t=1
HR=1

def calculation(row,t_input,HR_input):
    if t_input == 1:
        return row['PD']
    else:
        return (row['PD'] * (t_input - (t_input-1)) + HR_input(t_input-1) * (t_input-1)) / t_input
df['HR_t'] = df.apply(lambda row: calculation(row,t,HR),axis=1)
df.head()

输出:

 PD Year HR_t
0 0.10 1 0.10 
1 0.23 2 0.23 
2 0.22 3 0.22 
3 0.19 4 0.19 
4 0.10 5 0.10 
#Create the year and PD values
data = {'Year':[1,2,3,4,5],
        'PD': [0.1, 0.23, 0.22, 0.19, 0.10]}
data

#Create a dataframe
df = pd.DataFrame(data)
df

# initialize the series
df['Hazard_rate'] = 0

# iterate over the data frame rows (you need to loop since subsequent
# calculations are depending on prior ones, pandas.DataFrame.apply() is
# just going to implement a loop under the hood anyway
# ASSUMPTIONS: hr_(t-1) is the hazard rate value for the prior year
#              all other "t" is just the row's Year value
for index, row in df.iterrows():
    if row.Year == 1:
        df.loc[index, 'Hazard_rate'] = row.PD
    else:
        hr = (row.PD * (row.Year - (row.Year - 1)) + df.loc[df.Year == (row.Year-1), 'Hazard_rate'] * (row.Year - 1)) / row.Year
        df.loc[index, 'Hazard_rate'] = hr

编辑:用户得到一个bug/错误,所以这个列表实现应该可以工作(与上面的假设相同)。你知道吗

#Create the year and PD values
data = {'Year':[1,2,3,4,5],
        'PD': [0.1, 0.23, 0.22, 0.19, 0.10]}

#Create a dataframe
df = pd.DataFrame(data)

hazard_rates = [0] * len(df.index)
for index, row in df.iterrows():
    if row.Year == 1:
        hazard_rates[index] = row.PD
    else:
        hr = (row.PD * (row.Year - (row.Year - 1)) + df.loc[df.Year == (row.Year-1), 'Hazard_rate'] * (row.Year - 1)) / row.Year
        hazard_rates[index] = float(hr)

df['Hazard_rates'] = hazard_rates

相关问题 更多 >