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

基于多索引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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 12:27:00