使用Altair绘制Pandas原油数据图表遇问题:序列化及大数据量报错
问题解决方案
一、修复datetime序列化错误并绘制二维图表
报错源于数据预处理不彻底:设置列名后未清理冗余行,且日期/价格列未正确转换为对应数据类型,导致Altair序列化时出错。按以下步骤修正:
1. 正确读取并清洗数据
import pandas as pd # 读取Excel文件 xls_file = pd.ExcelFile('PET_PRI_SPT_S1_D.xls') crude_df = xls_file.parse('Data 1') # 设置第二行为列名 crude_df.columns = crude_df.iloc[1] # 删除前两行冗余数据(原表头行),重置索引 crude_df = crude_df.drop([0, 1]).reset_index(drop=True) # 转换日期列为datetime类型,价格列为数值型 crude_df['Date'] = pd.to_datetime(crude_df['Date']) price_col = 'Cushing, OK WTI Spot Price FOB (Dollars per Barrel)' crude_df[price_col] = pd.to_numeric(crude_df[price_col], errors='coerce') # 移除价格为空的行 crude_df = crude_df.dropna(subset=[price_col])
2. 绘制二维图表(散点图/折线图)
Altair需要明确指定数据类型(:T表示时间,:Q表示定量数值),示例如下:
散点图
import altair as alt alt.Chart(crude_df).mark_circle(size=6).encode( x='Date:T', # 指定为时间类型 y=f'{price_col}:Q', # 指定为定量数值类型 tooltip=['Date:T', f'{price_col}:Q'] # 鼠标悬浮显示详情 ).interactive() # 启用缩放平移交互
时间序列折线图(更适合价格数据)
alt.Chart(crude_df).mark_line(color='#2c3e50').encode( x='Date:T', y=f'{price_col}:Q', tooltip=['Date:T', f'{price_col}:Q'] ).interactive()
二、解决数据量超过5000条的报错
Altair默认限制5000行数据(避免浏览器性能问题),有两种解决方案:
方案1:启用大型数据处理模式
安装vegafusion扩展,支持处理十万级以上数据:
pip install vegafusion altair
启用后直接绘制全量数据:
import altair as alt # 启用vegafusion数据转换器 alt.data_transformers.enable('vegafusion') # 绘制全量数据折线图 alt.Chart(crude_df).mark_line().encode( x='Date:T', y=f'{price_col}:Q' ).interactive()
方案2:数据聚合/采样
如果不想安装额外库,可对数据按时间周期聚合(如周/月均值)或随机采样:
# 按周聚合取平均 weekly_avg_df = crude_df.resample('W', on='Date')[price_col].mean().reset_index() alt.Chart(weekly_avg_df).mark_line().encode( x='Date:T', y=f'{price_col}:Q' ) # 或随机采样1000条数据 sampled_df = crude_df.sample(n=1000, random_state=42) alt.Chart(sampled_df).mark_circle().encode( x='Date:T', y=f'{price_col}:Q' )
内容的提问来源于stack exchange,提问作者prashanth manohar
相关产品推荐
相关产品推荐

