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

如何通过分组对比找出销售数据库中新增或消失的广告项?

计算每日广告新增/下线数量

首先,你的示例DataFrame如下:

import pandas as pd

df = pd.DataFrame({
    "offer-id": [1,1,2,2,3,4,5],
    "date": ["2024-02-10","2024-02-11","2024-02-10","2024-02-11","2024-02-11","2024-02-11","2024-02-10"],
    "price": [30,10,30,30,20,25,20]
})

实现步骤

核心思路是先获取每日的唯一广告集合,再和前一日的集合做对比,计算差异数量。

方法一:利用分组和集合运算

# 按日期分组,提取每日唯一的广告ID集合
daily_offers = df.groupby('date')['offer-id'].apply(set).reset_index(name='active_offers')

# 转换日期格式并按时间排序,确保顺序正确
daily_offers['date'] = pd.to_datetime(daily_offers['date'])
daily_offers = daily_offers.sort_values('date').reset_index(drop=True)

# 获取前一日的广告集合
daily_offers['prev_offers'] = daily_offers['active_offers'].shift(1)

# 计算新增广告数:当天存在、前一日不存在的ID数量
daily_offers['new_offers'] = daily_offers.apply(
    lambda x: len(x['active_offers'] - x['prev_offers']) if pd.notna(x['prev_offers']) else 0,
    axis=1
)

# 计算下线广告数:前一日存在、当天不存在的ID数量
daily_offers['removed_offers'] = daily_offers.apply(
    lambda x: len(x['prev_offers'] - x['active_offers']) if pd.notna(x['prev_offers']) else 0,
    axis=1
)

# 补充每日在线广告总数
daily_offers['total_active'] = daily_offers['active_offers'].apply(len)

运行后得到的结果:

dateactive_offersprev_offersnew_offersremoved_offerstotal_active
2024-02-10{1, 2, 5}NaN003
2024-02-11{1, 2, 3, 4}{1, 2, 5}214

对应你的需求:2月10日有3个在线广告(无前置日期,故无下线/新增);2月11日有4个在线广告,其中2个为新增(ID3、4),1个已下线(ID5)。

方法二:遍历日期对比(更直观)

如果觉得集合运算不够直观,可以直接遍历每个日期,和前一日的广告列表做对比:

# 先去重,保留每个日期下的唯一广告ID
unique_offers = df[['date', 'offer-id']].drop_duplicates()
# 按时间顺序排序日期
sorted_dates = sorted(unique_offers['date'].unique())

result_list = []
for idx, current_date in enumerate(sorted_dates):
    # 获取当日的所有广告ID
    current_ids = set(unique_offers[unique_offers['date'] == current_date]['offer-id'])
    total_active = len(current_ids)
    new_count = 0
    removed_count = 0
    
    # 不是第一个日期时,和前一日对比
    if idx > 0:
        prev_date = sorted_dates[idx-1]
        prev_ids = set(unique_offers[unique_offers['date'] == prev_date]['offer-id'])
        new_count = len(current_ids - prev_ids)
        removed_count = len(prev_ids - current_ids)
    
    result_list.append({
        'date': current_date,
        'total_active': total_active,
        'new_offers': new_count,
        'removed_offers': removed_count,
        'active_offer_ids': current_ids
    })

# 转换为DataFrame
result_df = pd.DataFrame(result_list)

这个方法逻辑更直白,适合需要自定义更多细节的场景。


内容的提问来源于stack exchange,提问作者fußballball

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 04:25:15