尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Python数据清洗与可视化实战:从EDA到建模的完整工作流

Python数据清洗与可视化实战:从EDA到建模的完整工作流 1. 从“数据到手”到“图表说话”美赛建模的数据起点如果你正在准备美赛或者任何类似的数学建模竞赛那么恭喜你你已经意识到了数据是模型的基石。很多新手队伍拿到赛题后第一反应是去搜索“高大上”的算法模型却往往在第一步——数据处理上就栽了跟头。数据没清洗干净、格式乱七八糟、可视化图表不知所云再精妙的模型也如同建立在流沙上的城堡。今天我们就来聊聊美赛备赛中用Python进行数据处理与可视化的核心实战路径。这不是一个简单的库函数介绍而是结合我多次带队和评审经验梳理出的从原始数据到洞察图表的高效工作流。美赛的数据通常有几个特点多源、异构、含噪。你可能需要处理来自官方附件、自行爬取、或公开数据库的CSV、Excel、TXT甚至PDF表格。数据里可能有缺失值、异常值、单位不统一、文本与数字混杂等问题。Python的Pandas库是处理这类问题的“瑞士军刀”而Matplotlib和Seaborn则是将处理后的数据转化为直观洞察的“画笔”。我们的目标很明确用最少的代码实现最可靠的数据清洗和最具表现力的可视化为后续的模型构建打下坚实基础。2. 数据导入与初窥避开第一个陷阱数据处理的第一步不是埋头写清洗代码而是彻底了解你的数据。盲目操作很容易导致信息丢失或引入错误。2.1 多格式数据的安全读取美赛数据可能以多种格式出现。使用Pandas读取时关键参数决定了数据是否能被正确加载。import pandas as pd # 1. 读取CSV注意编码和分隔符 # 常见陷阱文件有中文默认‘utf-8’可能报错 try: df_csv pd.read_csv(data.csv, encodingutf-8) except UnicodeDecodeError: # 尝试其他常见编码 df_csv pd.read_csv(data.csv, encodinggbk, encoding_errorsignore) # 更稳健的做法用chardet库检测编码 import chardet with open(data.csv, rb) as f: result chardet.detect(f.read(10000)) # 检测前10000字节 encoding result[encoding] df_csv pd.read_csv(data.csv, encodingencoding) # 2. 读取Excel指定工作表名和表头行 # 如果数据不是从第一行开始使用header参数 df_excel pd.read_excel(data.xlsx, sheet_nameSheet1, header0) # 3. 读取非标准格式文本如固定宽度或特殊分隔符 # 假设数据以多个空格分隔 df_txt pd.read_csv(data.txt, sep\s, enginepython) # \s 匹配一个或多个空白字符注意读取数据后务必立即使用df.head()、df.tail()和df.sample(5)查看数据首尾和随机样本避免因数据排列问题如注释在底部导致的误判。2.2 核心元信息诊断了解数据框的“体检报告”至关重要这能帮你快速定位潜在问题。# 查看数据维度 print(f数据集形状{df_csv.shape}) # (行数 列数) # 查看列名和数据类型 print(df_csv.info()) # 查看数值型列的统计摘要 print(df_csv.describe()) # 查看非数值型列的统计摘要 print(df_csv.describe(include[object, category])) # 检查缺失值情况 missing_sum df_csv.isnull().sum() missing_percent (missing_sum / len(df_csv)) * 100 missing_df pd.DataFrame({缺失数量: missing_sum, 缺失百分比%: missing_percent}) print(missing_df[missing_df[缺失数量] 0]) # 只显示有缺失的列为什么这一步不能省我曾见过一个队伍数据中“年份”列被识别为object类型导致后续时间序列分析完全错误。df.info()显示后才发现原来数据里混入了“2023年”这样的字符串。还有一次describe()显示某列最大值是一个天文数字远超出合理范围这就是一个明显的异常值信号需要在清洗阶段处理。3. 数据清洗实战构建干净、一致的数据集清洗是数据处理中最耗时但也最关键的环节。目标是将原始数据转化为格式统一、完整可靠的“整洁数据”。3.1 处理缺失值策略比填充更重要面对缺失值首先问为什么缺失是随机缺失还是系统缺失这决定了处理策略。# 策略1删除缺失值适用于缺失很少且随机缺失的情况 # 删除任何包含缺失值的行 df_dropna df_csv.dropna() # 删除在关键列上缺失的行 df_dropna_subset df_csv.dropna(subset[销售额, 客户ID]) # 策略2填充缺失值更常用 # 数值型数据用均值、中位数、众数或前后值填充 df_csv[年龄].fillna(df_csv[年龄].median(), inplaceTrue) # 中位数对异常值不敏感 df_csv[收入].fillna(df_csv[收入].mean(), inplaceTrue) # 均值 df_csv[部门].fillna(df_csv[部门].mode()[0], inplaceTrue) # 众数第一个 # 对于时间序列数据常用前后向填充 df_csv[股价].fillna(methodffill, inplaceTrue) # 用前一个有效值填充 df_csv[股价].fillna(methodbfill, inplaceTrue) # 用后一个有效值填充 # 策略3创建缺失指示符适用于数据挖掘表明缺失可能包含信息 df_csv[收入_缺失] df_csv[收入].isnull().astype(int) # 然后再对‘收入’列进行填充实操心得不要盲目用均值填充所有数值列。例如在收入数据中如果高收入群体更不愿意披露收入那么缺失可能就是非随机的用整体均值填充会低估这部分人的收入。此时考虑按群体如职业分组后计算均值进行填充或使用插值法、甚至建立预测模型来估算会是更严谨的做法。3.2 处理异常值是噪音还是信号异常值可能是数据录入错误也可能是重要的极端事件。需要结合业务赛题背景判断。# 方法1基于标准差3σ原则识别 - 假设数据近似正态分布 mean_val df_csv[数值列].mean() std_val df_csv[数值列].std() lower_bound mean_val - 3 * std_val upper_bound mean_val 3 * std_val outliers_std df_csv[(df_csv[数值列] lower_bound) | (df_csv[数值列] upper_bound)] # 方法2基于四分位距IQR识别 - 更稳健不依赖正态分布假设 Q1 df_csv[数值列].quantile(0.25) Q3 df_csv[数值列].quantile(0.75) IQR Q3 - Q1 lower_bound_iqr Q1 - 1.5 * IQR upper_bound_iqr Q3 1.5 * IQR outliers_iqr df_csv[(df_csv[数值列] lower_bound_iqr) | (df_csv[数值列] upper_bound_iqr)] print(f基于3σ原则发现的异常值数量{len(outliers_std)}) print(f基于IQR原则发现的异常值数量{len(outliers_iqr)}) # 处理异常值通常选择盖帽法或直接删除 # 盖帽法将超出边界的值替换为边界值 df_csv[数值列_盖帽] df_csv[数值列].clip(lowerlower_bound_iqr, upperupper_bound_iqr) # 删除法谨慎使用 df_clean df_csv[(df_csv[数值列] lower_bound_iqr) (df_csv[数值列] upper_bound_iqr)].copy()为什么IQR更常用因为实际竞赛数据很少完美符合正态分布。IQR方法对极端值不敏感识别出的异常值更可靠。在美赛涉及社会经济数据时一些“异常值”如某地区的极高GDP本身就是需要研究的特点不应简单删除而应在可视化中突出并分析。3.3 数据转换与特征工程准备清洗后的数据往往需要转换以便于分析和建模。# 1. 类型转换 df_csv[日期] pd.to_datetime(df_csv[日期字符串], format%Y/%m/%d) # 指定格式加快转换 df_csv[类别编码] df_csv[类别].astype(category).cat.codes # 将文本类别转为数字编码 # 2. 字符串处理 df_csv[城市] df_csv[城市].str.strip() # 去除首尾空格 df_csv[姓名] df_csv[姓名].str.title() # 首字母大写 df_csv[地址] df_csv[地址].str.replace(省, ) # 简单替换 # 3. 创建新特征特征工程雏形 # 从日期中提取年月日等信息 df_csv[年份] df_csv[日期].dt.year df_csv[月份] df_csv[日期].dt.month df_csv[季度] df_csv[日期].dt.quarter df_csv[星期几] df_csv[日期].dt.dayofweek # 周一0 周日6 # 对数值列进行分箱离散化 df_csv[年龄分段] pd.cut(df_csv[年龄], bins[0, 18, 35, 60, 100], labels[少年, 青年, 中年, 老年]) # 4. 数据标准化/归一化为后续建模准备 from sklearn.preprocessing import StandardScaler, MinMaxScaler scaler StandardScaler() df_csv[[收入, 身高]] scaler.fit_transform(df_csv[[收入, 身高]]) # 标准化均值为0标准差为1 scaler_mm MinMaxScaler() df_csv[[温度, 湿度]] scaler_mm.fit_transform(df_csv[[温度, 湿度]]) # 归一化到[0,1]区间关键点pd.to_datetime是处理时间数据的神器自动识别能力很强但指定format参数能大幅提升转换速度和准确性。特征工程是提升模型性能的关键在数据清洗阶段就可以提前构思比如从“确诊日期”和“报告日期”可以衍生出“报告延迟天数”这一可能的重要特征。4. 探索性数据分析与可视化用图表讲述故事干净的数据本身没有价值洞察才有。EDA探索性数据分析是通过可视化手段快速理解数据分布、发现规律、提出假设的过程。在美赛论文中清晰专业的图表是打动评委的第一印象。4.1 单变量分析理解每一个变量首先对单个变量进行分布可视化。import matplotlib.pyplot as plt import seaborn as sns # 设置中文字体和图表样式 plt.rcParams[font.sans-serif] [SimHei, DejaVu Sans] # 用来正常显示中文标签 plt.rcParams[axes.unicode_minus] False # 用来正常显示负号 sns.set_style(whitegrid) # 设置Seaborn样式 fig, axes plt.subplots(2, 3, figsize(15, 10)) # 创建2行3列的画布 # 1. 数值变量直方图密度曲线 axes[0, 0].hist(df_csv[年龄], bins20, edgecolorblack, alpha0.7, densityTrue) df_csv[年龄].plot(kindkde, axaxes[0, 0], colorred, secondary_yTrue) # 密度曲线 axes[0, 0].set_title(年龄分布直方图与密度曲线) axes[0, 0].set_xlabel(年龄) axes[0, 0].set_ylabel(密度) # 2. 数值变量箱线图看分布与异常值 sns.boxplot(ydf_csv[收入], axaxes[0, 1], colorskyblue) axes[0, 1].set_title(收入箱线图) axes[0, 1].set_ylabel(收入) # 3. 分类变量计数柱状图 category_counts df_csv[产品类别].value_counts() axes[0, 2].bar(category_counts.index, category_counts.values, colorlightgreen) axes[0, 2].set_title(产品类别分布) axes[0, 2].set_xlabel(类别) axes[0, 2].set_ylabel(数量) axes[0, 2].tick_params(axisx, rotation45) # 旋转x轴标签 # 4. 分类变量饼图慎用类别不宜过多 axes[1, 0].pie(category_counts.values, labelscategory_counts.index, autopct%1.1f%%, startangle90) axes[1, 0].set_title(产品类别占比) # 5. 时间序列变量折线图 # 假设我们已按日期聚合了销售额 df_daily_sales df_csv.groupby(日期)[销售额].sum().reset_index() axes[1, 1].plot(df_daily_sales[日期], df_daily_sales[销售额], markero, linestyle-, linewidth2) axes[1, 1].set_title(每日销售额趋势) axes[1, 1].set_xlabel(日期) axes[1, 1].set_ylabel(销售额) axes[1, 1].grid(True, linestyle--, alpha0.7) fig.autofmt_xdate(rotation45) # 自动格式化日期标签 # 6. Q-Q图检验数据是否服从正态分布 from scipy import stats stats.probplot(df_csv[年龄].dropna(), distnorm, plotaxes[1, 2]) axes[1, 2].set_title(年龄Q-Q图检验正态性) plt.tight_layout() # 自动调整子图间距 plt.show()图表选择指南直方图KDE最佳选择直观展示分布形状是否偏态、多峰。箱线图必须包含一眼看出中位数、四分位数、异常值。饼图尽量避免除非类别很少≤5且占比差异显著。多个饼图很难比较用分组柱状图替代。Q-Q图如果你想检验数据正态性或者后续模型如线性回归有正态性假设这个图非常有用。4.2 双变量与多变量分析发现关系这是发现故事的核心环节看变量之间如何相互作用。fig, axes plt.subplots(2, 2, figsize(14, 12)) # 1. 数值 vs 数值散点图相关性与模式 axes[0, 0].scatter(df_csv[广告投入], df_csv[销售额], alpha0.6, edgecolorsw, s50) # 添加趋势线线性拟合 z np.polyfit(df_csv[广告投入], df_csv[销售额], 1) p np.poly1d(z) axes[0, 0].plot(df_csv[广告投入], p(df_csv[广告投入]), r--, linewidth2, labelf趋势线: y{z[0]:.2f}x{z[1]:.2f}) axes[0, 0].set_xlabel(广告投入) axes[0, 0].set_ylabel(销售额) axes[0, 0].set_title(广告投入与销售额关系散点图) axes[0, 0].legend() axes[0, 0].grid(True, alpha0.3) # 2. 分类 vs 数值分组箱线图或小提琴图比较组间分布 sns.violinplot(x产品类别, y利润, datadf_csv, axaxes[0, 1], innerquartile, paletteSet2) axes[0, 1].set_title(不同产品类别的利润分布小提琴图) axes[0, 1].set_xlabel(产品类别) axes[0, 1].set_ylabel(利润) axes[0, 1].tick_params(axisx, rotation30) # 3. 分类 vs 分类热力图交叉表可视化 cross_tab pd.crosstab(df_csv[地区], df_csv[是否购买], normalizeindex) # 行百分比 sns.heatmap(cross_tab, annotTrue, fmt.2%, cmapYlOrRd, axaxes[1, 0]) axes[1, 0].set_title(地区与购买行为的交叉热力图行百分比) axes[1, 0].set_xlabel(是否购买) axes[1, 0].set_ylabel(地区) # 4. 多个数值变量相关系数热力图 corr_matrix df_csv.select_dtypes(include[np.number]).corr() # 只计算数值列相关系数 sns.heatmap(corr_matrix, annotTrue, cmapcoolwarm, center0, axaxes[1, 1], squareTrue) axes[1, 1].set_title(数值变量间相关系数矩阵) # 优化突出显示高相关性的单元格 for i in range(len(corr_matrix.columns)): for j in range(len(corr_matrix.columns)): if abs(corr_matrix.iloc[i, j]) 0.7 and i ! j: axes[1, 1].text(j0.5, i0.5, ★, hacenter, vacenter, fontsize12, colorgold) plt.tight_layout() plt.show()为什么选择这些图散点图趋势线直接展示两个连续变量的关系是判断线性、非线性、聚类的首选。小提琴图比箱线图更优它同时展示了数据的核密度估计和箱体能清晰看到分布的“形状”比较不同类别时信息量更大。热力图展示两个分类变量间的关系强度用颜色和百分比注释一目了然。相关系数矩阵美赛必备。快速筛选出高度相关的变量对为后续建模避免多重共线性和深入分析提供方向。用星号标记高相关性单元格是一个让评委眼前一亮的小技巧。4.3 高级可视化与美赛图表美化美赛论文中的图表不仅要正确还要美观、专业、信息密度高。# 示例制作一个包含多个子图、信息丰富的组合图表 fig plt.figure(figsize(16, 10)) # 使用GridSpec进行更灵活的布局 gs fig.add_gridspec(3, 4) ax1 fig.add_subplot(gs[0, :2]) # 第一行前两列 ax2 fig.add_subplot(gs[0, 2:]) # 第一行后两列 ax3 fig.add_subplot(gs[1, :]) # 第二行整行 ax4 fig.add_subplot(gs[2, 1:3]) # 第三行中间两列 # 子图1带置信区间的线性回归拟合图Seaborn regplot sns.regplot(x用户活跃度, y客户价值, datadf_csv, axax1, scatter_kws{s: 40, alpha: 0.6, edgecolor: k}, line_kws{color: red, linewidth: 3}) ax1.set_title(用户活跃度与客户价值关系带置信区间, fontsize14, fontweightbold) ax1.set_xlabel(用户活跃度标准化) ax1.set_ylabel(客户价值元) # 子图2堆叠柱状图展示构成随时间变化 # 假设有不同产品类别每个月的销售额 df_pivot df_csv.pivot_table(index月份, columns产品类别, values销售额, aggfuncsum) df_pivot.plot(kindbar, stackedTrue, axax2, colormaptab20c) ax2.set_title(各月销售额产品构成堆叠柱状图, fontsize14, fontweightbold) ax2.set_xlabel(月份) ax2.set_ylabel(销售额万元) ax2.legend(title产品类别, bbox_to_anchor(1.05, 1), locupper left) # 子图3多系列折线图对比多个指标趋势 # 假设我们聚合了多个指标 df_trend df_csv.groupby(月份)[[销售额, 成本, 利润]].mean() ax3.plot(df_trend.index, df_trend[销售额], markers, label销售额, linewidth2.5) ax3.plot(df_trend.index, df_trend[成本], markero, label成本, linewidth2.5) ax3.plot(df_trend.index, df_trend[利润], marker^, label利润, linewidth2.5) ax3.set_title(核心经营指标月度趋势对比, fontsize14, fontweightbold) ax3.set_xlabel(月份) ax3.set_ylabel(金额万元) ax3.legend() ax3.grid(True, linestyle:, alpha0.5) # 添加填充区域突出利润为正的区域 ax3.fill_between(df_trend.index, 0, df_trend[利润], where(df_trend[利润]0), colorgreen, alpha0.2, interpolateTrue) ax3.fill_between(df_trend.index, 0, df_trend[利润], where(df_trend[利润]0), colorred, alpha0.2, interpolateTrue) # 子图4雷达图适合多维度能力对比 # 假设我们要比较三个地区在多个维度上的表现 categories [服务质量, 价格竞争力, 交付速度, 创新能力, 客户满意度] N len(categories) angles [n / float(N) * 2 * np.pi for n in range(N)] angles angles[:1] # 闭合 def plot_radar(ax, values, label, color): values list(values) values values[:1] ax.plot(angles, values, linewidth2, linestylesolid, labellabel, colorcolor) ax.fill(angles, values, alpha0.1, colorcolor) ax4 plt.subplot(gs[2, 1:3], polarTrue) ax4.set_theta_offset(np.pi / 2) ax4.set_theta_direction(-1) plt.xticks(angles[:-1], categories, size11) # 假设有三个地区的数据 region_a_values [4.2, 3.8, 4.5, 3.9, 4.1] region_b_values [3.9, 4.3, 3.7, 4.4, 4.0] region_c_values [4.0, 3.5, 4.2, 3.6, 3.8] plot_radar(ax4, region_a_values, 地区A, blue) plot_radar(ax4, region_b_values, 地区B, green) plot_radar(ax4, region_c_values, 地区C, red) ax4.set_title(不同地区多维度能力雷达图, fontsize14, fontweightbold, y1.1) ax4.legend(locupper right, bbox_to_anchor(1.3, 1.0)) plt.suptitle(美赛数据分析综合仪表板示例, fontsize16, fontweightbold, y1.02) plt.tight_layout() plt.show()美赛图表美化核心技巧一致性全文图表保持统一的配色方案建议使用sns.color_palette(“Set2”)或“tab10”等专业色板、字体和样式。信息密度像上面的组合图一张图传达多个信息节省论文篇幅也体现分析深度。标注清晰每个坐标轴、图例、标题都必须清晰无误。单位、数据来源如果适用要注明。突出重点使用颜色、标记、填充、注释ax.text()来引导读者关注你想强调的重点如异常点、转折点、最大值等。避免花哨3D图表、爆炸式饼图通常华而不实降低可读性慎用。简洁、清晰的二维图表是学术论文的首选。5. 数据聚合与透视从细节到宏观洞察原始数据是粒状的我们需要聚合以获得宏观趋势和模式。Pandas的groupby和pivot_table是完成这项工作的核心工具。5.1 灵活的Groupby操作groupby的核心思想是“拆分-应用-合并”。理解这个流程就能应对各种聚合需求。# 基础分组聚合 # 按‘地区’分组计算‘销售额’的平均值和总和 grouped df_csv.groupby(地区)[销售额].agg([mean, sum, count, std]) print(grouped) # 对多列进行不同聚合操作 agg_dict { 销售额: [sum, mean], 利润: mean, 客户ID: nunique # 计算唯一客户数 } grouped_complex df_csv.groupby(产品类别).agg(agg_dict) # 扁平化多层列索引让表格更易读 grouped_complex.columns [_.join(col).strip() for col in grouped_complex.columns.values] print(grouped_complex.head()) # 多级分组Hierarchical Grouping # 按‘年份’和‘季度’两级分组 grouped_multi df_csv.groupby([年份, 季度])[销售额].sum().unstack() # unstack将内层索引转为列 print(grouped_multi) # 分组后应用自定义函数 def profit_margin(series): 计算利润率利润/销售额 return series[利润].sum() / series[销售额].sum() * 100 margin_by_region df_csv.groupby(地区).apply(profit_margin) print(margin_by_region)踩坑提醒使用groupby后直接apply一个自定义函数如果函数返回一个Series或DataFrame结果可能会产生令人困惑的多层索引。确保你理解apply的返回结构或者考虑使用更可控的agg或transform。5.2 强大的数据透视表数据透视表可以看作是多维度的groupby它能以更直观的表格形式展示交叉分析结果。# 基础数据透视表类似Excel # index是行columns是列values是要聚合的值aggfunc是聚合函数 pivot_simple pd.pivot_table(df_csv, index地区, columns产品类别, values销售额, aggfuncsum, fill_value0) print(pivot_simple) # 复杂的多级透视 pivot_complex pd.pivot_table(df_csv, index[年份, 季度], # 行索引有两级 columns[地区, 客户等级], # 列索引有两级 values[销售额, 利润], # 要聚合的数值列 aggfunc{销售额: sum, 利润: mean}, # 对不同列应用不同聚合 marginsTrue, # 添加总计行/列 margins_name总计) print(pivot_complex) # 将透视表结果用于可视化 pivot_for_plot pd.pivot_table(df_csv, index月份, columns产品类别, values销售额, aggfuncsum) pivot_for_plot.plot(kindarea, stackedTrue, alpha0.8, figsize(10,6)) plt.title(各产品类别销售额月度堆叠面积图) plt.ylabel(销售额) plt.xlabel(月份) plt.legend(title产品类别, bbox_to_anchor(1.05, 1)) plt.tight_layout() plt.show()为什么透视表重要在美赛论文中你经常需要展示“不同地区、不同产品在不同时间段的销售额对比”。用文字描述冗长用多张图分散。而一个设计良好的透视表能将这些信息浓缩在一张表格里放在附录或正文中极具说服力。marginsTrue参数能快速给出行列总计非常实用。6. 实战流程整合与效率技巧将以上所有步骤串联成一个可复用的数据分析管道并分享一些提升效率的“硬核”技巧。6.1 构建可复用的数据分析管道使用函数和Jupyter Notebook的Cell魔法让你的分析流程模块化、可重复。def load_and_inspect(filepath): 数据加载与初步诊断函数 import chardet with open(filepath, rb) as f: encoding chardet.detect(f.read(10000))[encoding] df pd.read_csv(filepath, encodingencoding) print( 数据概览 ) print(f形状: {df.shape}) print(\n 前5行 ) print(df.head()) print(\n 信息摘要 ) print(df.info()) print(\n 缺失值统计 ) print(df.isnull().sum().sort_values(ascendingFalse).head(10)) # 显示缺失最多的前10列 return df def clean_data(df): 数据清洗函数根据实际情况定制 df_clean df.copy() # 1. 处理缺失值示例 df_clean[年龄].fillna(df_clean[年龄].median(), inplaceTrue) # 2. 删除无关列 cols_to_drop [无用列1, 备注] df_clean.drop(columns[col for col in cols_to_drop if col in df_clean.columns], inplaceTrue, errorsignore) # 3. 类型转换 if 日期 in df_clean.columns: df_clean[日期] pd.to_datetime(df_clean[日期], errorscoerce) # 4. 重置索引 df_clean.reset_index(dropTrue, inplaceTrue) print(数据清洗完成。) return df_clean def create_visualizations(df): 创建核心可视化图表函数 # 这里可以调用前面定义的各种绘图代码封装成子函数 plot_correlation_heatmap(df) plot_time_series_trend(df) # ... 其他图表函数 print(核心图表已生成。) # 主流程 file_path your_dataset.csv df_raw load_and_inspect(file_path) df_clean clean_data(df_raw) create_visualizations(df_clean) # 进行深入分析和建模...6.2 提升效率的Pandas/Seaborn技巧掌握这些技巧能让你在比赛有限的时间内写出更简洁、高效的代码。# 技巧1使用query进行条件筛选更直观 high_sales df_csv.query(销售额 10000 and 地区 in [华东, 华南]) # 技巧2使用assign动态创建新列链式调用 df_csv (df_csv .assign(利润率lambda x: x[利润] / x[销售额]) .assign(销售额等级lambda x: pd.cut(x[销售额], bins3, labels[低, 中, 高])) ) # 技巧3使用pd.NA处理缺失值新版Pandas比np.nan类型更安全 df_csv[新列] pd.NA # 技巧4使用Styler美化DataFrame输出在Notebook中展示给队友看非常酷 styled_table (df_csv.head(10) .style .background_gradient(subset[销售额, 利润], cmapBlues) # 渐变背景 .format({利润率: {:.2%}, 销售额: ¥{:.0f}}) # 格式化数字 .bar(subset[客户满意度], colorlightgreen) # 数据条 .highlight_max(subset[利润], coloryellow) # 高亮最大值 .highlight_null(colorred) # 高亮缺失值 ) # 在Jupyter中直接显示 styled_table 即可 # 技巧5Seaborn的FacetGrid分面网格进行多子图批量分析 g sns.FacetGrid(df_csv, col产品类别, col_wrap3, height4, aspect1.2) g.map(sns.scatterplot, 广告投入, 销售额, alpha0.7) g.set_titles({col_name}) # 用列变量值作为子图标题 g.set_axis_labels(广告投入, 销售额) g.add_legend() plt.suptitle(不同产品类别下广告投入与销售额关系, y1.02) plt.tight_layout() plt.show() # 技巧6使用Plotly创建交互式图表如果论文允许提交HTML或需要动态展示 # import plotly.express as px # fig px.scatter(df_csv, x广告投入, y销售额, color产品类别, # hover_data[地区, 利润], size客户数, # title交互式散点图) # fig.show()关于交互式图表Plotly生成的图表非常精美且交互性强鼠标悬停显示数据。虽然美赛最终提交的PDF论文无法体现交互性但在团队内部探索数据时极其有用。你也可以将关键静态图用Plotly生成其默认样式通常比Matplotlib更美观。数据处理与可视化绝非赛前突击就能掌握的工具罗列它是一套需要反复练习的思维流程和工作习惯。从看到数据的第一眼起就要带着问题去观察、去清洗、去探索。在美赛高压的环境中一套熟练、稳健的数据处理流程能为你节省大量时间并避免因数据错误导致的模型崩溃。更重要的是出色的可视化图表是你向评委讲述数据故事最有力的语言。不要满足于画出图形要思考这张图到底回答了什么问题传递了什么信息。当你能够从杂乱的数据中提炼出清晰的洞察并用专业的图表呈现出来时你的论文就已经成功了一半。
返回列表