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
相关产品推荐
相关产品推荐

