我有一個如下所示的資料框:
cusip fmcSecType effectiveMaturity weightedAverageMaturity
683244AM9 OABS 11/26/2029 3/23/2026
975014AC5 OABS 11/20/2040 3/31/2033
44107EAA7 OABS 1/31/2045 12/27/2035
140006AA5 OABS 3/31/2046 5/21/2036
35086RAA1 OABS 6/23/2045 12/26/2031
00287XAA9 AABS 12/31/2043 9/28/2034
004331AA2 OABS 8/31/2039 2/12/2032
00433JAA3 OABS 9/30/2037 12/24/2030
00434CAC3 OABS 12/31/2042 1/28/2035
09852URA3 NPTB 4/1/2022 NaN
0985ZUMQ7 NPTB 12/23/2021 NaN
74800JY41 NPTB 11/4/2021 NaN
44051F10 J EETF 5/6/2031 NaN
44051H10 J EETF 1/16/2023 NaN
SF00000132 BSNS 7/5/2022 NaN
SV00000132 BSNS 12/30/2021 NaN
我想做的是計算期限(從設定的日期開始)
enddate = date(2021, 10, 15)
但不同 fmcSecType 的計算引數不同
- 對于 fmcSecType == 'OABS' 或 'AABS',使用 weightedAverageMaturity
- 對于其他所有情況,請使用 EffectiveMaturity
所以我在下面嘗試但它不起作用:
if (metric_df['fmcSecType'] == 'AABS') | (metric_df['fmcSecType'] == 'OABS'):
metric_df['ET_manual'] = (metric_df['weightedAverageMaturity'] - pd.Timestamp(enddate - timedelta(days = 1))).dt.days
else:
metric_df['ET_manual'] = (metric_df['effectiveMaturity'] - pd.Timestamp(enddate - timedelta(days = 1))).dt.days
錯誤代碼是:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
所以我嘗試了另一種方法,但仍然不起作用,使用 weightedAverageMaturity 的計算不會發生:
for i in metric_df['fmcSecType']:
if i == 'AABS':
metric_df['ET_manual'] = (metric_df['weightedAverageMaturity'] - pd.Timestamp(enddate - timedelta(days = 1))).dt.days
elif i == 'OABS':
metric_df['ET_manual'] = (metric_df['weightedAverageMaturity'] - pd.Timestamp(enddate - timedelta(days = 1))).dt.days
else:
metric_df['ET_manual'] = (metric_df['effectiveMaturity'] - pd.Timestamp(enddate - timedelta(days = 1))).dt.days
uj5u.com熱心網友回復:
代替使用if-else不支持檢查 Pandas 布爾系列的 Python陳述句,您可以設定 Pandas 布爾掩碼.isin(),然后使用.loc布爾掩碼來設定具有不同日期列的新列,如下所示:
對于每一列effectiveMaturity和weightedAverageMaturity,我們pd.to_datetime()在計算日期差異之前將它們從日期字串轉換為日期時間格式。
from datetime import date, timedelta
enddate = date(2021, 10, 15)
# Setup boolean mask for checking whether fmcSecType is 'AABS' or 'OABS'
mask = metric_df['fmcSecType'].isin(['AABS', 'OABS'])
# For rows with fmcSecType is 'AABS' or 'OABS', use `weightedAverageMaturity` as source date
metric_df.loc[mask, 'ET_manual'] = (pd.to_datetime(metric_df['weightedAverageMaturity'], format='%m/%d/%Y') - pd.Timestamp(enddate - timedelta(days = 1))).dt.days
# For rows with fmcSecType is neither 'AABS' nor 'OABS', use `effectiveMaturity` as source date
metric_df.loc[~mask, 'ET_manual'] = (pd.to_datetime(metric_df['effectiveMaturity'], format='%m/%d/%Y') - pd.Timestamp(enddate - timedelta(days = 1))).dt.days
結果:
print(metric_df)
cusip fmcSecType effectiveMaturity weightedAverageMaturity ET_manual
0 683244AM9 OABS 11/26/2029 3/23/2026 1621.0
1 975014AC5 OABS 11/20/2040 3/31/2033 4186.0
2 44107EAA7 OABS 1/31/2045 12/27/2035 5187.0
3 140006AA5 OABS 3/31/2046 5/21/2036 5333.0
4 35086RAA1 OABS 6/23/2045 12/26/2031 3725.0
5 00287XAA9 AABS 12/31/2043 9/28/2034 4732.0
6 004331AA2 OABS 8/31/2039 2/12/2032 3773.0
7 00433JAA3 OABS 9/30/2037 12/24/2030 3358.0
8 00434CAC3 OABS 12/31/2042 1/28/2035 4854.0
9 09852URA3 NPTB 4/1/2022 NaN 169.0
10 0985ZUMQ7 NPTB 12/23/2021 NaN 70.0
11 74800JY41 NPTB 11/4/2021 NaN 21.0
12 44051F10 J EETF 5/6/2031 NaN 3491.0
13 44051H10 J EETF 1/16/2023 NaN 459.0
14 SF00000132 BSNS 7/5/2022 NaN 264.0
15 SV00000132 BSNS 12/30/2021 NaN 77.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/331250.html
上一篇:C#根據特定的天數將日期范圍分組
