连续日期的大熊猫行分析

时间:2015-06-30 00:54:58

标签: python date csv pandas

跟随行的“链”并从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文件已更改,现在可能更容易了。问题已更新。

2 个答案:

答案 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

希望我的代码能被理解,将来会帮助某人。