如何基于面板数据按连续季度交易情况创建active trader哑变量列
面板数据「活跃交易者」标记实现
需求说明
按ID分组为每个时期生成active列,规则如下:
- 从该ID的首个时期开始,连续每个季度交易数(trading)>0时标记为1
- 一旦出现
trading=0的季度,该ID后续所有时期均标记为0
代码实现(Python Pandas)
import pandas as pd # 示例数据加载(实际可替换为你的数据源) data = { 'ID': ['A','A','A','A','A','B','B','B','C','C','C','C'], 'date': ['2020Q1','2020Q2','2020Q3','2020Q4','2021Q1','2019Q1','2019Q2','2019Q3','2021Q1','2021Q2','2021Q3','2021Q4'], 'trading': [4,5,0,2,1,0,1,2,3,3,4,0] } df = pd.DataFrame(data) # 定义分组处理逻辑 def mark_active(group): # 定位该组第一个交易数为0的行索引 first_zero_pos = group[group['trading'] == 0].index.min() if pd.isna(first_zero_pos): # 无交易中断,全标记为活跃 group['active'] = 1 else: # 中断前标记1,中断及之后标记0 group['active'] = 1 group.loc[first_zero_pos:, 'active'] = 0 return group # 分组应用逻辑并整理结果 df = df.groupby('ID', group_keys=False).apply(mark_active) df = df.sort_values(['ID', 'date']).reset_index(drop=True) print(df)
逻辑说明
- 按ID分组后,对每个组查找第一个
trading=0的位置 - 若组内无交易中断(无
trading=0的行),所有行active标记为1 - 若存在交易中断,中断位置之前的行标记1,从中断行开始(含该行)所有行标记0
- 最后按ID和日期排序,保证数据时序正确
示例输入
ID date trading A 2020Q1 4 A 2020Q2 5 A 2020Q3 0 A 2020Q4 2 A 2021Q1 1 B 2019Q1 0 B 2019Q2 1 B 2019Q3 2 C 2021Q1 3 C 2021Q2 3 C 2021Q3 4 C 2021Q4 0
示例输出
ID date trading active A 2020Q1 4 1 A 2020Q2 5 1 A 2020Q3 0 0 A 2020Q4 2 0 A 2021Q1 1 0 B 2019Q1 0 0 B 2019Q2 1 0 B 2019Q3 2 0 C 2021Q1 3 1 C 2021Q2 3 1 C 2021Q3 4 1 C 2021Q4 0 0
内容的提问来源于stack exchange,提问作者Olive
相关产品推荐
相关产品推荐

