数据科学 面试题库
收录真实面试常见问题,答案长度适合口头表达;拿不准时可返回相关主题复习。
Python 可视化
2个问题 · 0 已看01 Matplotlib 中的 Figure、Axes、Axis 与 Artist 有什么区别? 查看答案 ▾ 收起 ▴
Figure 是完整的输出容器,拥有画布、布局和一个或多个 Axes。Axes 是单个绘图区,plot、bar、set_title 和 legend 等常用操作都属于它。每个 Axes 通常包含 x、y 两个 Axis 对象,负责尺度、刻度位置、formatter 与刻度标签。Artist 是折线、矩形、文字、图例和图像等可见元素的共同抽象。理解这套层级后,就能明确一次更新、标签设置或保存操作究竟作用于哪个对象。
02 为什么可复用代码更适合使用 Matplotlib 的面向对象接口? 查看答案 ▾ 收起 ▴
Pyplot 会维护当前 Figure 和当前 Axes。短暂的交互式操作很方便,但函数行为会依赖调用顺序。可复用代码更适合接收一个 Axes,通过 ax 方法添加图元,再由所属 Figure 保存。图表以后移入多面板布局时,这种设计无需改写,测试也能检查实际创建的对象。Pyplot 仍可负责创建和关闭图形。重点是让所有权明确,而不是禁止导入 matplotlib.pyplot。
视觉编码
1个问题 · 0 已看渲染与生命周期
1个问题 · 0 已看04 怎样让 Matplotlib 在无显示服务中可靠地批量渲染? 查看答案 ▾ 收起 ▴
应在进程启动时、导入 pyplot 或创建图形之前选择 Agg 等非交互式后端。每个请求或任务都明确拥有自己的 Figure,通过 fig.savefig 保存,并在 finally 中关闭这个 Figure。库函数不要修改全局 rcParams;临时样式应放进 rc_context。不能只凭调用成功就假定尺寸和格式正确,还要检查生成文件。测试需要在无显示环境运行,主动制造保存失败,并断言结束后 pyplot 没有遗留任何图形编号。
Python 数组
1个问题 · 0 已看05 NumPy 数组的实用契约包含哪些信息? 查看答案 ▾ 收起 ▴
首先要说明形状、数据类型以及每个轴的含义。仅有形状还不够,因为同样的 (32, 10) 既可能表示“样本 × 特征”,也可能表示“时间 × 传感器”。契约还应包含所有权:基本切片可能共享缓冲区,高级索引则返回副本。数值代码还要规定空轴、NaN、无穷、整数范围和浮点容差的处理方式。可靠的函数会按具名轴说明输入输出形状,并明确它会原地修改、返回视图,还是分配独立结果。
数组语义
1个问题 · 0 已看06 NumPy 广播如何工作,为什么合法广播仍可能出错? 查看答案 ▾ 收起 ▴
NumPy 会从尾轴开始比较形状。两个轴长度相等,或者其中一个为 1 时就兼容;缺失的左侧轴按长度 1 处理。结果在每个兼容轴上取较大的长度。这套机械规则不理解领域含义,因此 (n, 1) 与 (n,) 相加虽然合法,却会得到常常出乎意料的 (n, n)。我会先预测结果形状,必要时保留被聚合的轴,用非方形维度测试,并在接口中命名每个轴,而不是因为表达式能运行就相信它。
内存与所有权
1个问题 · 0 已看07 NumPy 何时返回视图而不是副本,这个区别为什么重要? 查看答案 ▾ 收起 ▴
基本切片通常返回与原数组共享缓冲区的视图,整数数组索引与布尔索引则返回副本。reshape 和 ravel 会根据内存布局返回视图或副本,flatten 总是复制。这个区别决定了写入视图是否会修改调用者的数据,也决定了是否分配新缓冲区。需要确认重叠时我会使用 np.shares_memory,在所有权边界则显式调用 copy。函数文档和测试都应说明输入是否可能改变,并分别修改输入与输出,验证承诺的关系。
生成代码审查
2个问题 · 0 已看08 信任生成的 NumPy 预处理管道前,应审查哪些内容? 查看答案 ▾ 收起 ▴
我会跟踪每次操作后的形状、数据类型、轴含义与所有权,然后查找语义错误但形状合法的广播、整数数组上的原地除法、误写成逐元素乘法的矩阵乘法,以及被当作临时副本修改的基本切片。边界测试应覆盖空输入、单行、常数列、NaN、无穷、整数极值和非连续视图。随机操作应接收 Generator,而不是重置全局状态。最后用一个可手算的非方形样本对照代码,因为相等维度很容易掩盖轴错误。
20 信任 AI 生成的可视化代码前,应审查什么? 查看答案 ▾ 收起 ▴
我会挑选几条记录,从输入开始追踪它们经过筛选、聚合、排序与编码后对应的标记、标签和图例项。这样能发现只排序数值却没有同步移动标签,或把聚合后的表与旧索引配对等常见错误。随后列出每条轴和颜色通道的领域、单位、基线与变换,确认可比较面板共享尺度。边界测试覆盖空输入、重复键、缺失值、无穷、负数、常量列与极端值。最后在真实交付尺寸下检查文字裁剪、只靠颜色的提示、被隐藏的缺口和未解释的不确定性。
表格数据契约
1个问题 · 0 已看09 数据流程阶段之间传递 DataFrame 时,契约应包含什么? 查看答案 ▾ 收起 ▴
我会说明必需列、每列的数据类型与含义、行索引语义,以及哪些键必须唯一。契约还应规定是否允许缺失值、未知分类怎样表示、函数能否修改输入。对于转换操作,要说明输出形状与输入的关系,并写出收入总额守恒、保留左侧全部订单等不变量。运行时应在边界验证这些属性,因为 DataFrame 即使列名正确,也可能带有乱序标签、重复键或被静默提升的数据类型。
选择与所有权
1个问题 · 0 已看10 .loc 与写时复制怎样影响 pandas 3.0 中的赋值? 查看答案 ▾ 收起 ▴
写时复制让从另一个 pandas 对象派生出的对象在使用者看来表现为副本,修改派生对象不会更新源对象。因此,df[mask]["status"] = value 这样的链式赋值无法修改 df,第二次操作只写入中间对象。我会用 df.loc[mask, "status"] = value 在一次操作中指定目标行与列。如果 API 应返回独立结果,就显式复制后再返回。测试需要在赋值后同时比较源对象与结果,让所有权承诺可以观察,而不是靠猜测。
分组与聚合
1个问题 · 0 已看11 groupby 之后应在什么情况下使用 agg、transform 或 apply? 查看答案 ▾ 收起 ▴
我会根据所需输出形状选择。agg 为每组生成一个或多个摘要值,通常会减少行数;命名聚合还能固定输出列名。transform 返回与原索引对齐的结果,适合需要回填到每行的组总额、占比、排名或中心化值。只有当内置聚合与转换无法表达结果时,才把 apply 当作出口。使用前要明确预期索引与形状,并检查直接的列操作能否更清楚地表达规则。
连接与完整性
2个问题 · 0 已看12 怎样防止 pandas 连接静默扩增行数? 查看答案 ▾ 收起 ▴
我会先明确预期基数:一对一、一对多、多对一,或确实需要的多对多。随后检查键的空值和受约束一侧的唯一性,并把对应 validate 值传给 merge。验证期间通常加入 indicator=True,统计只来自左侧、只来自右侧和两侧匹配的行。连接后比较行数与应保持的业务总额。空键策略也要明确,因为 pandas 会匹配两侧空键,这与常见 SQL 行为不同。大小写和空格规范化应在这些检查前完成。
16 怎样审查 Polars 连接,防止数据静默扩增或丢失? 查看答案 ▾ 收起 ▴
我会先命名预期基数:一对一、一对多、多对一,或确实需要的多对多。随后检查受约束键的空值与唯一性,并把 validate=“m:1” 等对应值传给 join。连接类型应由保留规则决定,不能只看写起来是否方便;填充右侧空值前还要检查未匹配键。执行后比较行数与应守恒的业务总量。如果输出顺序属于契约,我也会显式排序,因为分组或连接结果不应被视为天然有序。
Polars 执行模型
1个问题 · 0 已看13 Polars 中的 DataFrame 与 LazyFrame 有什么区别,collect 应该出现在哪里? 查看答案 ▾ 收起 ▴
DataFrame 包含已经物化的列,因此即时操作会在调用时执行。LazyFrame 保存逻辑查询计划,方法调用只会继续添加扫描、过滤、投影、聚合与连接节点,直到 collect 执行计划并返回 DataFrame。小型内存数据适合即时模式,能利用全计划优化的文件流程则适合惰性扫描。可复用转换通常应接收并返回 LazyFrame。我会把 collect 或 sink 放在应用边界,这样输入输出、内存占用、模式错误和执行后的不变量都能被观察。
表达式与模式
1个问题 · 0 已看14 什么是 Polars 表达式上下文,为什么相邻表达式不能依赖新别名? 查看答案 ▾ 收起 ▴
表达式描述列计算,上下文则决定结果的形状行为。select 返回表达式输出,with_columns 保留现有列,filter 选择行,group_by().agg() 归约分组。同一上下文中的相邻表达式面对同一份输入模式,并且可以独立执行。如果一个表达式创建 revenue,另一个不能在同一次 with_columns 中读取 pl.col(“revenue”)。我会串联第二次 with_columns,让 revenue 进入下一份输入模式;也可以把收入公式保存为表达式变量,直接复用公式。
数据契约
1个问题 · 0 已看15 模式、null 与 NaN 规则怎样影响可靠的 Polars 流程? 查看答案 ▾ 收起 ▴
我会把列名、数据类型、可空性、单位和键规则作为输入契约。CSV 没有原生模式,因此重要字段应使用 schema 或 schema_overrides,不能依赖随样本变化的推断。Polars 的 null 是与数据分开表示的缺失值,NaN 则是浮点值;fill_null 不会替换 NaN,fill_nan 也不会替换 null。我会分别计数和测试两者,决定无效转换应报错还是变成空值,并在解析后验证范围。模式吻合仍不能证明数量非负或标识符唯一。
可视化设计
1个问题 · 0 已看17 怎样从分析问题选择图表类型? 查看答案 ▾ 收起 ▴
我会先明确读者需要判断的关系:比较、趋势、分布、关联还是构成。随后说明数据粒度、字段类型、单位、缺失值策略和交付场景。类别与单个数值的比较通常从柱形或点图开始;连续时间从保留缺口的折线开始;单个数值分布从直方图或经验分布开始;两个数值字段从散点图开始。这些只是起点,不是硬规则。只有当视觉通道能直接支持目标比较,并且没有掩盖重要记录或变换时,我才保留这个图形。
尺度与完整性
1个问题 · 0 已看18 即使每个绘制值都正确,图表尺度何时仍会误导? 查看答案 ▾ 收起 ▴
当尺度的几何关系诱导读者做出数据领域并不支持的比较时,即使数值本身正确,图表仍会误导。截断柱形基线会改变长度比例,各面板独立取值则会让相同高度或颜色代表不同数值。对数轴适合比较比值,但必须拒绝或明确处理定义域外数值,并在刻度和标签中显示变换。断轴、裁剪离群值、反转方向和双 y 轴都需要明确理由。我会检查完整领域、单位、基线、变换与共享尺度要求,再用几个已知数值核对最终位置。
缺失与不确定性
1个问题 · 0 已看19 可视化应怎样表示缺失数据与不确定性,并避免混淆两者? 查看答案 ▾ 收起 ▴
缺失表示观测不存在或不可用,不确定性则修饰已经观测或估计的数值。我会在数据中保留缺失状态,并在时间序列上断开折线,而不是删除该行后跨越缺口连接。若进行插值,就要标出方法和区间,同时保留原始缺失标记。对于不确定性,要说明显示的是标准差、标准误差、预测区间还是置信区间,并给出水平、方法与抽样单位。条件允许时还应显示样本量或原始分布,因为精致的阴影带无法弥补稀少或相互依赖的观测。
没有符合筛选条件的问题。