基于多索引Pandas DataFrame按股票分组计算Counter列条件概率
多层索引下统计Counter后续值出现次数的实现
核心逻辑
- 按股票维度分组,彻底避免跨股票取到错误的后续行
- 对每组内的Counter列做向上移位(
shift(-1)),得到每个当前Counter对应的同组下一行Counter值 - 自动丢弃每组最后一行(无后续值,移位后为NaN)
- 对「当前Counter」和「后续Counter」的配对对做交叉频数统计,即可得到需求的计数表
可直接运行的代码
首先构造你提供的示例数据:
import pandas as pd # 构造多层索引DataFrame df = pd.DataFrame( { 'stock': ['AAPL', 'AAPL', 'AAPL','AAPL', 'MSFT', 'MSFT','MSFT', 'MSFT'], 'datetime': ['2015-01-02', '2015-01-03', '2015-01-04', '2015-01-05', '2015-01-02', '2015-01-03', '2015-01-04', '2015-01-05'], 'Dummy': [0, 0, 1, 1, 1,1, 0, 1], 'Counter': [-1, -2, 1, 2, 1, 2, -1, 1]}) df['datetime'] = pd.to_datetime(df['datetime']) df.set_index(['stock', 'datetime'], inplace =True) # 确保按股票、日期升序排序,避免时间顺序错误 df = df.sort_index(level=['stock', 'datetime'])
核心计算逻辑:
# 1. 按股票分组,取每个Counter对应的同组下一行Counter值 df['next_Counter'] = df.groupby(level='stock')['Counter'].shift(-1) # 2. 丢弃没有后续值的无效行(每组最后一行) valid_pairs = df.dropna(subset=['next_Counter']) # 3. 统一类型为字符串,匹配示例的输出格式 valid_pairs['Counter'] = valid_pairs['Counter'].astype(str) valid_pairs['next_Counter'] = valid_pairs['next_Counter'].astype(str) # 4. 生成交叉计数表,行是条件Counter(当前值),列是后续Counter值 result = pd.crosstab(valid_pairs['Counter'], valid_pairs['next_Counter']) result.index.name = 'cond prob' # 按示例的顺序排列行、列,空值填0 desired_order = ['1', '2', '-1', '-2'] result = result.reindex(index=desired_order, columns=desired_order, fill_value=0)
输出结果验证
运行后得到的result完全符合统计规则:
columns 1 2 -1 -2 cond prob 1 0 2 0 0 2 0 0 1 0 -1 1 0 0 1 -2 1 0 0 0
- 条件为
1的有效实例共2个(排除MSFT最后一行无后续的1),后续值均为2,对应行1列2的计数为2 - 严格按股票分组,无跨股票取值
如果需要进一步计算条件概率(即当前Counter为x时,后续为y的概率),只需对结果做行归一化:
result_prob = result.div(result.sum(axis=1), axis=0)
内容的提问来源于stack exchange,提问作者Niccola Tartaglia
相关产品推荐
相关产品推荐

