Python实现保险客户保费按月度比例分摊(单列转多列)
保险保费月度分摊实现方案(Python)
需求说明
原始数据包含User ID、Period From、Period to、Total premium字段,需将每条记录按保障时段拆分为月度条目,每个月份对应一条记录,显示用户当月的分摊保费(总保费平摊到每个保障月份)。
实现思路
- 将起始/结束日期转换为可处理的日期格式
- 为每个用户生成保障期间内的所有月份
- 计算单月分摊保费:
Total premium / 保障月数 - 展开每条原始记录为对应月度的多条记录
代码实现
import pandas as pd # 1. 模拟原始数据(可替换为实际读取的数据源,如Excel/CSV) raw_data = pd.DataFrame({ 'User ID': ['A8856', 'A8857'], 'Period From': ['2022-01-01', '2022-01-01'], 'Period to': ['2022-04-30', '2022-02-28'], 'Total premium': [600, 400] }) # 2. 转换日期列格式 raw_data['Period From'] = pd.to_datetime(raw_data['Period From']) raw_data['Period to'] = pd.to_datetime(raw_data['Period to']) # 3. 定义拆分函数:生成每个用户的月度分摊记录 def split_monthly_records(row): # 生成保障期间内的所有月份(取每月第一天) months = pd.date_range(start=row['Period From'], end=row['Period to'], freq='MS') # 计算保障月数和单月保费 month_count = len(months) monthly_premium = row['Total premium'] / month_count # 构造月度记录列表 return pd.DataFrame({ 'User ID': [row['User ID']] * month_count, 'Month': months.strftime('%Y-%m'), 'Monthly Premium': [monthly_premium] * month_count }) # 4. 应用函数并合并结果 monthly_data = pd.concat([split_monthly_records(row) for _, row in raw_data.iterrows()], ignore_index=True) # 5. 输出结果 print(monthly_data)
代码说明
- 日期处理:用
pd.to_datetime转换字符串日期为datetime类型,pd.date_range按月度频率生成期间内的所有月份 - 分摊计算:直接用总保费除以保障月数,实现平摊逻辑
- 数据展开:通过
concat将每个用户的月度记录合并为最终数据集
输出样例
User ID Month Monthly Premium 0 A8856 2022-01 150.0 1 A8856 2022-02 150.0 2 A8856 2022-03 150.0 3 A8856 2022-04 150.0 4 A8857 2022-01 200.0 5 A8857 2022-02 200.0
内容的提问来源于stack exchange,提问作者kevin rysan
相关产品推荐
相关产品推荐

