求助:基于Pandas实现分组平行坐标图绘制
纽约出租车数据平行坐标图实现指南
嘿,我来帮你搞定这个平行坐标图的实现!首先得提醒你一个小细节:现在pandas已经把parallel_coordinates从pandas.tools.plotting移到pandas.plotting模块里了,用旧路径会报错哦,先把这个改过来。接下来一步步来:
1. 导入必要的库
先把需要的工具都导入进来,覆盖数据处理、归一化和绘图全流程:
import pandas as pd from pandas.plotting import parallel_coordinates from sklearn.preprocessing import MinMaxScaler import matplotlib.pyplot as plt
2. 特征归一化处理
你选的三个特征(行程距离、乘客数、支付金额)量纲差异极大,直接绘图会导致小范围特征的变化被掩盖,所以必须先做归一化:
# 假设你的预处理后数据存在df变量中 feature = ['trip_distance','passenger_count','payment_amount'] # 初始化归一化器,将特征缩放到0-1区间 scaler = MinMaxScaler() df[feature] = scaler.fit_transform(df[feature])
如果不想修改原数据,也可以单独创建归一化后的数据集:
scaled_features = scaler.fit_transform(df[feature]) scaled_df = pd.DataFrame(scaled_features, columns=feature) scaled_df['day_of_week'] = df['day_of_week'] # 预留后续分组用的周几列
3. 按周几计算日均特征值
首先得从行程时间列里提取周几信息(假设你的数据包含tpep_pickup_datetime上车时间列):
# 先把时间列转成datetime格式(如果还没处理的话) df['tpep_pickup_datetime'] = pd.to_datetime(df['tpep_pickup_datetime']) # 提取周几名称,方便图表可读性;也可以用数字(0=周一,6=周日) df['day_of_week'] = df['tpep_pickup_datetime'].dt.day_name() # 按周几分组,计算三个特征的均值 daily_mean = df.groupby('day_of_week')[feature].mean().reset_index()
4. 绘制平行坐标图
现在用parallel_coordinates生成可视化图表,重点要指定类别区分列(这里就是day_of_week):
plt.figure(figsize=(12, 6)) parallel_coordinates( daily_mean, class_column='day_of_week', # 按周几区分不同线条 cols=feature, # 要展示的特征列 color=['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b', '#e377c2'], linewidth=2 ) # 添加图表装饰,提升可读性 plt.title('2016纽约黄出租车一周日均特征平行坐标图', fontsize=14) plt.xlabel('特征', fontsize=12) plt.ylabel('归一化后数值', fontsize=12) plt.grid(alpha=0.3) plt.legend(title='周几', bbox_to_anchor=(1.05, 1), loc='upper left') plt.tight_layout() # 保存或展示图表 plt.savefig('parallel_coordinates.png', dpi=300) plt.show()
实用小提示
- 如果数据量过大,分组前可以先抽样:
df_sample = df.sample(frac=0.1, random_state=42),能大幅提升运行速度 - 不用sklearn也能实现归一化:
df[feature] = df[feature].apply(lambda x: (x - x.min()) / (x.max() - x.min())) - 要是周几顺序混乱,可以手动排序:
daily_mean['day_of_week'] = pd.Categorical( daily_mean['day_of_week'], categories=['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'], ordered=True )
内容的提问来源于stack exchange,提问作者Min
相关产品推荐
相关产品推荐

