跟随行的“链”并从CSV文件计算连续月份。
目前我正在阅读一个包含5列感兴趣的CSV文件(基于保险单):
CONTRACT_ID START-DATE END-DATE CANCEL_FLAG OLD_CON_ID
123456 2015-05-30 2016-05-30 0 8788
123457 2014-03-20 2015-03-20 0 12000
123458 2009-12-20 2010-12-20 0 NaN
...
我想计算合约链的连续月数。
示例:从链的“前端”(最旧的合同)和合同的最后一个START-DATE
(最新的合同)中的合同中取END-DATE
。最旧的合同由链中取消的合同之前的或没有OLD_CON_ID
值的合同定义。
每行代表一份合约,prev_Con_ID指向先前的合约ID。期望的输出是合同链回到差距的几个月(即客户在一段时间内没有合同)。如果该列中没有任何内容那么这就是该链中的第一个合同。
CANCEL_FLAG也应该削减链条,因为值为1表示合同被取消。
当前代码通过编辑数据框来计算每年的有效合同数量:
df_contract = df_contract[
(df_contract['START_DATE'] <= pd.to_datetime('2015-05-31')) &
(df_contract['END_DATE'] >= pd.to_datetime('2015-05-31')) & (df_contract['CANCEL_FLAG'] == 0 )
]
df_contract = df_contract[df_contract['CANCEL_FLAG'] == 0
]
activecount = df_contract.count()
print activecount['CONTRACT_ID']
以下是我创建数据框并调整日期时间值的前6行代码:
file_name = 'EXAMPLENAME.csv'
df = pd.read_csv(file_name)
df_contract = pd.read_csv(file_name)
df_CUSTOMERS = pd.read_csv(file_name)
df_contract['START_DATE'] = pd.to_datetime(df_contract['START_DATE'])
df_contract['END_DATE'] = pd.to_datetime(df_contract['END_DATE'])
理想输出类似于:
FIRST_CONTRACT_ID CHAIN_LENGTH CON_MONTHS
1234567 5 60
1500001 1 4
800 10 180
然后将绘制这些数据点。
EDIT2:CSV文件已更改,现在可能更容易了。问题已更新。
答案 0 :(得分:0)
不确定我是否完全按照您的要求行事,但做了类似的工作吗?:
df_contract['TOTAL_YEARS'] = (df_contract['END_DATE'] - df_contract['START_DATE']
)/np.timedelta64(1,'Y')
df_contract['TOTAL_YEARS'][(df['CANCEL_FLAG'] == 1) && (df['TOTAL_YEARS'] > 1)] = 1
答案 1 :(得分:0)
经过大量的反复试验后我才开始工作!
这可以找到链中第一个和最后一个合约之间的时差和找到链的长度。
到目前为止,这不是最干净的代码,但它确实有效:
test = 'START_DATE'
df_short = df_policy[['OLD_CON_ID',test,'CONTRACT_ID']]
df_short.rename(columns={'OLD_CON_ID':'PID','CONTRACT_ID':'CID'},
inplace = True)
df_test = df_policy[['CONTRACT_ID','END_DATE']]
df_test.rename(columns={'CONTRACT_ID':'CID','END_DATE': 'PED'}, inplace = True)
df_copy1 = df_short.copy()
df_copy2 = df_short.copy()
df_copy2.rename(columns={'PID':'PPID','CID':'PID'}, inplace = True)
df_merge1 = pd.merge(df_short, df_copy2,
how='left',
on=['PID'])
df_merge1['START_DATE_y'].fillna(df_merge1['START_DATE_x'], inplace = True)
df_merge1.rename(columns={'START_DATE_x':'1_EFF','START_DATE_y':'2_EFF'}, inplace=True)
对5个合并的数据帧重复复制,合并,填充和重命名代码:
df_merged = pd.merge(df_merge5, df_test,
how='right',
on=['CID'])
df_merged['TOTAL_MONTHS'] = ((df_merged['PED'] - df_merged['6_EFF']
)/np.timedelta64(1,'M'))
df_merged4 = df_merged[
(df_merged['PED'] >= pd.to_datetime('2015-07-06'))
df_merged4['CHAIN_LENGTH'] = df_merged4.drop(['PED','1_EFF','2_EFF','3_EFF','4_EFF','5_EFF'], axis=1).apply(lambda row: len(pd.unique(row)), axis=1) -3
希望我的代码能被理解,将来会帮助某人。