如何统计特定时间窗口列值出现次数并筛选近6个月价格上涨2次的商品
问题解决方法
你已经完成了价格差分计算的核心步骤,后续可以通过以下两种方式完成统计,优先推荐向量化方法,性能远高于显式循环。
方法1:Pandas向量化实现(生产环境优先选)
核心逻辑是按itemID分组后,统计相邻月份价格差大于0的记录数,无需写循环:
- 先补全基础预处理,避免多item场景下数据顺序错乱
import pandas as pd # 构造示例数据集 df = pd.DataFrame({ 'date': ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'July'], 'itemID': [12]*7, 'price': [100,100,120,120,140,140,140] }) # 按商品分组、按月份排序后计算月度价格差 df = df.sort_values(['itemID', 'date']).reset_index(drop=True) df['price_diff'] = df.groupby('itemID')['price'].diff()
- 标记上涨节点、统计次数并筛选目标商品
# 标记当月是否属于价格上涨(差值>0即为上涨) df['is_price_rise'] = (df['price_diff'] > 0).astype(int) # 统计每个商品的累计上涨次数 rise_stat = df.groupby('itemID')['is_price_rise'].sum().reset_index(name='rise_count') # 筛选出近6个月上涨次数≥2的商品 target_items = rise_stat[rise_stat['rise_count'] >= 2]['itemID'].tolist()
针对你给出的示例数据,itemID=12的商品在3月、5月各有1次上涨,累计2次,会被正确筛选出来。
如果你的数据集跨度超过6个月,需要严格做滚动6个月窗口统计,可以把日期转为时间格式后用滚动窗口计算:
df['date_dt'] = pd.to_datetime(df['date'], format='%b') df = df.set_index('date_dt') # 计算每个商品滚动6个月窗口内的上涨次数 df['rolling_6m_rise'] = df.groupby('itemID')['is_price_rise'].rolling('6M').sum().reset_index(drop=True) # 只要任意6个月窗口内出现过≥2次上涨的商品都纳入结果 target_items_rolling = df[df['rolling_6m_rise'] >= 2]['itemID'].unique().tolist()
方法2:带计数器的for循环实现(适配自定义复杂规则)
如果你有自定义的上涨判定规则(比如要求涨幅超过阈值、排除特殊促销调价等),可以用分组遍历+计数器的方式实现,逻辑更灵活:
target_items = [] # 按商品分组遍历 for item_id, item_data in df.groupby('itemID'): # 先按日期排序保证时序正确 item_data = item_data.sort_values('date').reset_index(drop=True) rise_counter = 0 # 从第二个月开始逐行和上月价格对比 for idx in range(1, len(item_data)): # 可在此处追加自定义判断规则,比如涨幅>5%才算有效上涨 if item_data.loc[idx, 'price'] > item_data.loc[idx-1, 'price']: rise_counter += 1 # 若做窗口统计,可在这里判断idx对应的月份是否超出6个月范围,超出则对应扣减计数器值 # 统计完成后判断是否符合条件 if rise_counter >= 2: target_items.append(item_id)
注意:所有时序统计前必须先按
itemID分组、再按时间字段排序,否则会出现不同商品价格串算、时序错乱的问题,导致统计结果错误。
内容的提问来源于stack exchange,提问作者Katarina123
相关产品推荐
相关产品推荐

