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

Quickest way to apply a formula to a column which requires the last output

我有一个数据集,我正在为其计算由以下公式定义的 "Hazard rate":

if t = 1:
     hr_t  = pd_t

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

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

执行此操作的最简单方法是遍历 table 中的每一行。但是,这也将是最慢的。有没有一种有效的方法可以根据 pandas 数据帧中的条件计算上述两个公式?

#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

我不确定你是怎么得到 t 和 HR 的,因为它们不在 df 中,但这适用于常量,如果它们是列,那么只需将计算函数中的常量替换为 row['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/error,所以这个列表实现应该可以工作(与上面相同的假设)。

#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