数据科学面试题库
收录真实面试常见问题,答案长度适合口头表达;拿不准时可返回相关主题复习。
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 可视化应怎样表示缺失数据与不确定性,并避免混淆两者? 查看答案 ▾ 收起 ▴
缺失表示观测不存在或不可用,不确定性则修饰已经观测或估计的数值。我会在数据中保留缺失状态,并在时间序列上断开折线,而不是删除该行后跨越缺口连接。若进行插值,就要标出方法和区间,同时保留原始缺失标记。对于不确定性,要说明显示的是标准差、标准误差、预测区间还是置信区间,并给出水平、方法与抽样单位。条件允许时还应显示样本量或原始分布,因为精致的阴影带无法弥补稀少或相互依赖的观测。
没有符合筛选条件的问题。