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

问题描述 投票:1回答:3

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

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

第二年的危险率是通过以下方式计算的:

PD      Year-(Year-Year-1)+hazard_rate_(Year-1) * (Year - 1) / (Year)
0.23 * (2 - (2 - 1)) + 0.1 * (2 - 1) / 2 = 0.165
python pandas loops dataframe lag
3个回答
1
投票
#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

0
投票

我不确定您如何获得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 

0
投票

您还可以探索您正在使用的数学对象,并且如果我没有记错记号(在这种情况下,请告诉我,我将删除此答案,因为这显然是错误的):

t-(t-1) = 1 #first simplification 

然后:

if t = 1:
 HR_t  = PD_t

其他:HR_t = PD_t / t + HR_(t-1)*((t-1)/ t)

如果重新注入步骤t-1:

HR_t = PD_t/t + PD_(t-1)/t + HR_(t-2)*((t-2/t))

简单地进行1次递归即可直接进行演算。...无需两列。危害是去年所有年份的平均值。

© www.soinside.com 2019 - 2024. All rights reserved.