使用Pycaret与Plotly绘制空气质量时间序列图异常求助
空气质量时间序列可视化异常修复方案
问题原因
- 核心问题1:读取数据后未按日期排序,绘制折线时前后点连接逻辑混乱,是出现异常折线的最常见诱因
- 核心问题2:分组筛选子集时使用链式索引,会触发pandas的
SettingWithCopyWarning,新增的移动平均列数据可能异常 - 潜在问题3:未校验
CO列的空值、离群异常值,以及单分组内是否存在重复日期的多条数据,会导致折线出现跳变、断点
修复后代码
import pandas as pd import plotly.express as px # 读取数据 data = pd.read_csv('E:/Self Learning/Djang_Dash/2019-2020_5.csv') # 日期格式转换 data['Date'] = pd.to_datetime(data['Date'], format='%d/%m/%Y') # 全局按日期排序,避免折线连接混乱 data = data.sort_values('Date').reset_index(drop=True) # 处理分组标识 data['OBJECTID'] = ['Location_' + str(i) for i in data['OBJECTID']] data['time_series'] = data[['OBJECTID']].apply(lambda x: '_'.join(x), axis=1) data.drop(['OBJECTID'], axis=1, inplace=True) # 日期特征衍生(替换原有列表推导式,运行效率更高) data['month'] = data['Date'].dt.month data['year'] = data['Date'].dt.year data['day_of_week'] = data['Date'].dt.dayofweek data['day_of_year'] = data['Date'].dt.dayofyear # 前置数据清洗 # 过滤CO空值、异常值,可根据实际业务调整CO的合理范围 data = data.dropna(subset=['CO']) data = data[(data['CO'] >= 0) & (data['CO'] <= 50)] # 同一个分组+同一个日期如果有多条数据,取均值聚合,避免重复值导致折线跳变 data = data.groupby(['time_series', 'Date'], as_index=False).agg({ 'CO': 'mean', 'month': 'first', 'year': 'first', 'day_of_week': 'first', 'day_of_year': 'first' }) # 遍历每个分组绘图 for series_name in data['time_series'].unique(): # 明确生成独立子集,避免链式索引警告 subset = data[data['time_series'] == series_name].copy() # 滚动计算移动平均,添加min_periods参数避免前29天数据为空出现断点 subset['moving_average'] = subset['CO'].rolling(window=30, min_periods=1).mean() fig = px.line(subset, x="Date", y=["CO","moving_average"], title=series_name, template='plotly_dark') fig.show()
补充校验方法
如果修改后仍有异常,可打印单分组的subset.head(50)检查日期顺序、CO列数值是否符合预期,确认原始数据本身没有格式错误。
内容的提问来源于stack exchange,提问作者eirsh
相关产品推荐
相关产品推荐

