You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现保险客户保费按月度比例分摊(单列转多列)

保险保费月度分摊实现方案(Python)

需求说明

原始数据包含User ID、Period From、Period to、Total premium字段,需将每条记录按保障时段拆分为月度条目,每个月份对应一条记录,显示用户当月的分摊保费(总保费平摊到每个保障月份)。

实现思路

  1. 将起始/结束日期转换为可处理的日期格式
  2. 为每个用户生成保障期间内的所有月份
  3. 计算单月分摊保费:Total premium / 保障月数
  4. 展开每条原始记录为对应月度的多条记录

代码实现

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 08:23:55