如何平滑含1440个数据点的Spotify播放时长曲线图?
解决方案
一、高效平滑曲线(替代插值)
针对1440个分钟级数据,直接用pandas内置的矢量化平滑方法,速度比插值快几个数量级,同时能有效过滤异常值带来的波动:
1. 先过滤极端异常值(可选但推荐)
先通过四分位距(IQR)剔除明显的异常值,避免平滑时被干扰:
# 假设播放时长列名为play_duration q1 = df['play_duration'].quantile(0.25) q3 = df['play_duration'].quantile(0.75) iqr = q3 - q1 # 保留在合理范围内的数据 df_clean = df[(df['play_duration'] >= q1 - 1.5*iqr) & (df['play_duration'] <= q3 + 1.5*iqr)]
2. 移动平均平滑
用滚动窗口均值做平滑,窗口大小可根据需求调整(比如15代表前后7分钟+当前分钟,平衡平滑度和细节):
# center=True让窗口以当前点为中心,min_periods=1避免边缘数据缺失 df_clean['smooth_rolling'] = df_clean['play_duration'].rolling( window=15, center=True, min_periods=1 ).mean()
3. 指数加权移动平均(EWMA)
如果想更侧重近期数据的趋势,用EWMA,效率同样极高:
# span=10代表加权时侧重最近10个数据点,adjust=False保持权重一致 df_clean['smooth_ewm'] = df_clean['play_duration'].ewm(span=10, adjust=False).mean()
二、无需指定日期处理时间数据
把时间列转换为纯时间维度的索引,完全脱离日期约束:
方法1:转为time类型索引
如果你的时间是类似"00:00"的字符串:
# 转成datetime后提取时间部分,得到纯时分格式的索引 df['time'] = pd.to_datetime(df['time_str'], format='%H:%M').dt.time df.set_index('time', inplace=True)
方法2:转为Timedelta索引(更适合时间运算)
用时长表示一天内的时间,方便后续做分钟级的偏移、分组等操作:
# 转成Timedelta,比如"00:00"对应0天0时0分 df['time_delta'] = pd.to_timedelta(df['time_str']) df.set_index('time_delta', inplace=True)
之后所有的平滑、绘图操作都只针对一天内的分钟维度,完全不需要指定日期。
内容的提问来源于stack exchange,提问作者Alberto Salazar Lloreda
相关产品推荐
相关产品推荐

