我是一名前Excel高级用户,为自己的罪过而pent悔。我需要帮助为我重新创建通用计算。
我正在尝试计算贷款组合的绩效。在分子中,我正在计算累计损失总额。在分母中,我需要包含在累计总额中的贷款的原始余额。
我无法弄清楚如何在Pandas中进行条件分组。这在Excel中非常简单,因此我希望自己对此有所考虑。
我在StackOverflow上找不到太多有关此问题的信息,但这是最近的:python pandas conditional cumulative sum
我无法弄清楚的是我的条件是基于索引中的值并且包含在列中的
以下是我的数据:
| Loan | Origination | Balance | NCO Date | NCO | As of Date | Age (Months) | NCO Age (Months) |
|---------|-------------|---------|-----------|-----|------------|--------------|------------------|
| Loan 1 | 1/31/2011 | 1000 | 1/31/2018 | 25 | 5/31/2019 | 100 | 84 |
| Loan 2 | 3/31/2011 | 2500 | | 0 | 5/31/2019 | 98 | |
| Loan 3 | 5/31/2011 | 3000 | 1/31/2019 | 15 | 5/31/2019 | 96 | 92 |
| Loan 4 | 7/31/2011 | 2500 | | 0 | 5/31/2019 | 94 | |
| Loan 5 | 9/30/2011 | 1500 | 3/31/2019 | 35 | 5/31/2019 | 92 | 90 |
| Loan 6 | 11/30/2011 | 2500 | | 0 | 5/31/2019 | 90 | |
| Loan 7 | 1/31/2012 | 1000 | 5/31/2019 | 5 | 5/31/2019 | 88 | 88 |
| Loan 8 | 3/31/2012 | 2500 | | 0 | 5/31/2019 | 86 | |
| Loan 9 | 5/31/2012 | 1000 | | 0 | 5/31/2019 | 84 | |
| Loan 10 | 7/31/2012 | 1250 | | 0 | 5/31/2019 | 82 | |
在Excel中,我将使用以下公式计算此总计:
未结余额行:=SUMIFS(Balance,Age (Months),Reference Age)
Cumulative NCO: =SUMIFS(NCO,Age (Months),>=Reference Age,NCO Age (Months),<=&Reference Age)
数据:
| Reference Age | 85 | 90 | 95 | 100
|---------------------|-------|-------|------|------
| Outstanding Balance | 16500 | 13000 | 6500 | 1000
| Cumulative NCO | 25 | 60 | 40 | 25
这里的目标是包括未偿还余额中已足够观察NCO的事物。 NCO是截至该点为止这些未偿还贷款的总金额。
编辑:
我已经用这种方式进行了计算。但这是最有效的吗?
age_bins = list(np.arange(85, 101, 5))
final_df = pd.DataFrame()
df.fillna(value=0, inplace=True)
df["NCO Age (Months)"] = df["NCO Age (Months)"].astype(int)
for x in age_bins:
age = x
nco = df.loc[(df["Age (Months)"] >= x) & (df["NCO Age (Months)"] <= x), "NCO"].sum()
bal = df.loc[(df["Age (Months)"] >= x), "Balance"].sum()
temp_df = pd.DataFrame(
data=[[age, nco, bal]],
columns=["Age", "Cumulative NCO", "Outstanding Balance"],
index=[age],
)
final_df = final_df.append(temp_df, sort=True)
答案 0 :(得分:1)
您根据变量使用复杂的条件。对于简单的累加总和,很容易找到矢量化的方法,但是我无法想象对于累积NCO的好方法。
所以我将恢复为Python理解:
isfile()
它产生:
data = [
{ 'Reference Age': ref,
'Outstanding Balance': df.loc[df.iloc[:,6]>=ref,'Balance'].sum(),
'Cumulative NCO': df.loc[(df.iloc[:,6]>=ref)&(df.iloc[:,7]<=ref),
'NCO'].sum() }
for ref in [85, 90, 95, 100]]
result = pd.DataFrame(data).set_index('Reference Age').T
答案 1 :(得分:0)
您可以尝试使用pd.cut建立给定年龄范围内的贷款组,然后再使用groupby。像这样:
import pandas as pd
df = pd.DataFrame([[1, 2, 3, 4, 5], [7, 8, 9, 10, 11]], index=['age', 'value']).T
df['groups'] = pd.cut(df.age, [0, 1, 3, 5]) # define bins (0,1], (1,3], (3,5]
df.groupby('groups')['value'].sum()
答案 2 :(得分:0)
不确定我是否完全遵循您要遵循的逻辑,但是您可以结合使用熊猫<h1>{this.props.name}</h1>
和query
来完成总结。
groupby
import pandas as pd
import numpy as np
age = np.random.randint(85, 100, 50)
balance = np.random.randint(1000, 2500, 50)
nco = np.random.randint(85, 100, 50)
df = pd.DataFrame({'age': age, 'balance': balance, 'nco':nco})
df['reference_age'] = df['age'].apply(lambda x: 5 * round(float(x)/5))
outstanding_balance = (
df
.query('age >= reference_age')
.groupby('reference_age')
[['balance']]
.sum()
.rename(columns={'balance': 'Outstanding Balance'}
)
cumulative_nco = (
df
.query('age < reference_age')
.groupby('reference_age')
[['nco']]
.sum()
.rename(columns={'nco': 'cumulative nco'})
.cumsum()
)
result = outstanding_balance.join(cumulative_sum).T