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

Python:基于组内条件创建资金重分配标识变量

如何判断客户是否进行了资金重分配?

根据你的需求,我们需要为每个客户(main_depot_id)生成一个标记变量,判断其是否满足资金重分配的条件:

  • 存在某基金持仓(sub_depot_id)卖出90%以上(sold 90% == 'Y'),且对应有资金流出(outflow)
  • 同时将等额±20%的资金投入到另一个不同的基金(sub_depot_id不同),对应有资金流入(inflow)

不需要用循环处理,用Pandas的分组和关联操作就能高效实现,以下是具体方案:

实现步骤及代码

import pandas as pd

# 你的原始数据集
df = pd.DataFrame({
'main_depot_id':[1, 1, 1, 2, 2, 2, 2], 
'sub_depot_id': [1, 1, 2, 1, 1, 2, 2],
'inflow': [100, 0, 100, 200, 0, 0, 220], 
'outflow': [0, 100, 0, 0, 0, 200, 0], 
'sold 90%': ['N', 'Y', 'N', 'N', 'N', 'Y', 'N']}) 

# 1. 提取所有卖出90%的事件记录:客户ID、对应基金ID、卖出金额
sell_events = df[df['sold 90%'] == 'Y'][['main_depot_id', 'sub_depot_id', 'outflow']]
sell_events = sell_events.rename(columns={'outflow': 'sell_amount'})

# 2. 提取所有有资金流入的事件记录:客户ID、对应基金ID、流入金额
inflow_events = df[df['inflow'] > 0][['main_depot_id', 'sub_depot_id', 'inflow']]
inflow_events = inflow_events.rename(columns={'inflow': 'inflow_amount'})

# 3. 关联同一客户的卖出和流入事件,排除同一基金的情况
merged = pd.merge(sell_events, inflow_events, on='main_depot_id', suffixes=('_sell', '_inflow'))
merged = merged[merged['sub_depot_id_sell'] != merged['sub_depot_id_inflow']]

# 4. 判断流入金额是否在卖出金额的±20%范围内(0.8倍到1.2倍之间)
merged['is_redistributed'] = (merged['inflow_amount'] >= merged['sell_amount'] * 0.8) & \
                             (merged['inflow_amount'] <= merged['sell_amount'] * 1.2)

# 5. 按客户汇总:只要有一条符合条件的记录,该客户就标记为True
customer_redist = merged.groupby('main_depot_id')['is_redistributed'].any().reset_index()

# 6. 将标记合并回原始数据集,无符合条件的客户标记为False
result = df.merge(customer_redist, on='main_depot_id', how='left')
result['is_redistributed'] = result['is_redistributed'].fillna(False)

print(result)

代码解释

  • 步骤1-2:分别筛选出关键的卖出和流入事件,提取核心字段并重命名,方便后续关联
  • 步骤3:将同一客户的卖出和流入记录关联,同时排除掉同一基金的操作(因为要求是投入另一基金)
  • 步骤4:根据定义判断流入金额是否符合“等额±20%”的条件
  • 步骤5:按客户汇总结果,只要该客户存在任意一条符合条件的记录,就判定为进行了资金重分配
  • 步骤6:把最终的标记合并回原始数据集,缺失值(无卖出/流入事件的客户)填充为False

运行结果

main_depot_id  sub_depot_id  inflow  outflow sold 90%  is_redistributed
0              1             1     100        0        N              True
1              1             1       0      100        Y              True
2              1             2     100        0        N              True
3              2             1     200        0        N              True
4              2             1       0        0        N              True
5              2             2       0      200        Y              True
6              2             2     220        0        N              True

补充说明

如果你的数据集包含日期变量,可以增加时间维度的判断(比如资金流入必须发生在卖出之后),只需要在筛选或关联时加入日期条件即可,例如:

# 假设存在date列,确保流入日期晚于卖出日期
merged = merged[merged['date_inflow'] >= merged['date_sell']]

内容的提问来源于stack exchange,提问作者twoRay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 16:52:49