DS Python 面试的考察框架
Data Science Python 面试不是 LeetCode 刷题。DS 面试的 Python 考察重点在于:能否用 Python 高效地处理真实数据、构建分析 Pipeline,以及实现和解释机器学习模型。
根据 Glassdoor 和 Blind 的面试报告,Top 10 科技公司 DS 岗位的 Python 面试通常分为三个层次:
| 层次 | 考察内容 | 代表公司 | |------|----------|----------| | 数据处理层 | Pandas 操作、数据清洗、缺失值处理 | 所有公司 | | 统计分析层 | 假设检验、A/B Test、概率分布 | Meta、Google、Amazon | | 机器学习层 | 模型选择、特征工程、模型评估 | Google、DeepMind、Bloomberg |
UK 市场特点:英国金融科技和银行业的 DS 岗位(如 Revolut、Barclays、HSBC、Bloomberg)更注重数据处理和统计分析层,ML 层的考察相对较少;而英国科技公司(如 DeepMind、Waymo UK、Palantir London)则三个层次都会深入考察。
Pandas 核心考察点
Pandas 是 DS Python 面试中最高频的考察工具,面试官通常通过 Pandas 题目来评估候选人的数据处理能力和代码效率。
高频考察点 1:GroupBy 与聚合
1import pandas as pd
2
3# 真题:计算每个用户的月均消费金额,并找出消费最高的前 10% 用户
4df = pd.read_csv('transactions.csv') # columns: user_id, date, amount
5
6# 解法
7df['month'] = pd.to_datetime(df['date']).dt.to_period('M')
8monthly_avg = (
9 df.groupby(['user_id', 'month'])['amount']
10 .sum()
11 .reset_index()
12 .groupby('user_id')['amount']
13 .mean()
14 .reset_index()
15 .rename(columns={'amount': 'monthly_avg_spend'})
16)
17
18# 找出前 10% 用户
19threshold = monthly_avg['monthly_avg_spend'].quantile(0.9)
20top_users = monthly_avg[monthly_avg['monthly_avg_spend'] >= threshold]高频考察点 2:时间序列处理
1# 真题:计算用户 7 日滚动留存率
2df['date'] = pd.to_datetime(df['date'])
3df = df.sort_values(['user_id', 'date'])
4
5# 计算每个用户的首次登录日期
6df['first_login'] = df.groupby('user_id')['date'].transform('min')
7df['days_since_first'] = (df['date'] - df['first_login']).dt.days
8
9# 7 日留存:首次登录后第 7 天是否有活跃记录
10retention = df[df['days_since_first'] == 7]['user_id'].nunique() / df['user_id'].nunique()高频考察点 3:数据清洗与缺失值处理
1# 真题:处理一张包含 30% 缺失值的用户特征表
2# 面试官考察的不是代码,而是你的决策逻辑
3
4# 1. 先分析缺失值的分布
5print(df.isnull().sum() / len(df)) # 缺失率
6print(df.isnull().mean()) # 同上,更简洁
7
8# 2. 根据业务逻辑选择填充策略
9# 数值型:用中位数(对异常值鲁棒)
10df['age'].fillna(df['age'].median(), inplace=True)
11
12# 类别型:用众数或单独的 'Unknown' 类别
13df['city'].fillna('Unknown', inplace=True)
14
15# 时间序列:用前向填充(forward fill)
16df['price'].fillna(method='ffill', inplace=True)
17
18# 3. 对缺失率 > 50% 的列,考虑删除
19cols_to_drop = df.columns[df.isnull().mean() > 0.5]
20df.drop(columns=cols_to_drop, inplace=True)面试技巧:在处理缺失值时,一定要先解释你的决策逻辑(为什么选择这种填充方式),而不是直接写代码。面试官更看重你的数据直觉,而不是代码语法。
机器学习 Python 考察点
Sklearn Pipeline 构建
真题(Google DS 面试):给定一个包含数值特征和类别特征的数据集,构建一个完整的 ML Pipeline,包括特征预处理、模型训练和交叉验证。
1from sklearn.pipeline import Pipeline
2from sklearn.compose import ColumnTransformer
3from sklearn.preprocessing import StandardScaler, OneHotEncoder
4from sklearn.impute import SimpleImputer
5from sklearn.ensemble import RandomForestClassifier
6from sklearn.model_selection import cross_val_score
7
8# 定义特征类型
9numeric_features = ['age', 'income', 'tenure']
10categorical_features = ['city', 'product_type', 'channel']
11
12# 数值特征处理:填充缺失值 + 标准化
13numeric_transformer = Pipeline(steps=[
14 ('imputer', SimpleImputer(strategy='median')),
15 ('scaler', StandardScaler())
16])
17
18# 类别特征处理:填充缺失值 + One-Hot 编码
19categorical_transformer = Pipeline(steps=[
20 ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
21 ('onehot', OneHotEncoder(handle_unknown='ignore', sparse_output=False))
22])
23
24# 合并特征处理器
25preprocessor = ColumnTransformer(
26 transformers=[
27 ('num', numeric_transformer, numeric_features),
28 ('cat', categorical_transformer, categorical_features)
29 ]
30)
31
32# 完整 Pipeline
33pipeline = Pipeline(steps=[
34 ('preprocessor', preprocessor),
35 ('classifier', RandomForestClassifier(n_estimators=100, random_state=42))
36])
37
38# 交叉验证
39scores = cross_val_score(pipeline, X_train, y_train, cv=5, scoring='roc_auc')
40print(f'CV AUC: {scores.mean():.4f} (+/- {scores.std()*2:.4f})')模型评估与解释
- 面试中最常被忽视的环节:模型评估不只是看 Accuracy。DS 面试官通常会追问:
- 为什么选择 AUC 而不是 Accuracy?(数据不平衡时 Accuracy 会误导)
- Precision 和 Recall 的权衡如何决定?(取决于业务场景:欺诈检测 vs 推荐系统)
- 如何解释模型的决策?(SHAP values、Feature Importance)
1import shap
2
3# 用 SHAP 解释 RandomForest 的预测
4explainer = shap.TreeExplainer(pipeline.named_steps['classifier'])
5X_processed = pipeline.named_steps['preprocessor'].transform(X_test)
6shap_values = explainer.shap_values(X_processed)
7
8# 可视化特征重要性
9shap.summary_plot(shap_values[1], X_processed, feature_names=feature_names)统计分析 Python 考察点
统计分析是 UK DS 面试中最容易被忽视、但实际上最重要的考察点。 英国金融行业的 DS 岗位(Bloomberg、Barclays、HSBC)对统计基础的要求远高于美国科技大厂。
假设检验
1from scipy import stats
2import numpy as np
3
4# 真题:给定两组用户的购买金额数据,判断两组是否存在显著差异
5group_a = np.array([45, 52, 48, 61, 39, 55, 47, 58, 43, 51])
6group_b = np.array([52, 61, 58, 67, 49, 63, 55, 70, 48, 59])
7
8# 1. 先检验正态性(Shapiro-Wilk 检验)
9_, p_normal_a = stats.shapiro(group_a)
10_, p_normal_b = stats.shapiro(group_b)
11
12if p_normal_a > 0.05 and p_normal_b > 0.05:
13 # 数据近似正态分布,使用 t 检验
14 t_stat, p_value = stats.ttest_ind(group_a, group_b)
15 print(f't-statistic: {t_stat:.4f}, p-value: {p_value:.4f}')
16else:
17 # 数据不符合正态分布,使用非参数检验(Mann-Whitney U)
18 u_stat, p_value = stats.mannwhitneyu(group_a, group_b, alternative='two-sided')
19 print(f'U-statistic: {u_stat:.4f}, p-value: {p_value:.4f}')
20
21# 2. 计算效应量(Effect Size)
22cohens_d = (group_b.mean() - group_a.mean()) / np.sqrt(
23 ((len(group_a)-1)*group_a.std()**2 + (len(group_b)-1)*group_b.std()**2) /
24 (len(group_a) + len(group_b) - 2)
25)
26print(f"Cohen's d: {cohens_d:.4f}")面试关键点:不要只报告 p-value,还要解释效应量(Effect Size)和实际业务意义。p < 0.05 只说明统计显著,不代表业务上有意义。
AT&T Career Data Science Track 的 Python 备考支持
我们的 Tech Track(Data Science 方向) 提供系统化的 Python 面试备考支持,包括:Pandas/NumPy/Sklearn 专项训练、ML Pipeline 构建实战、统计分析和 A/B Test 模拟面试,以及 Bloomberg/Meta/Google DS 岗位的完整 Python 面试模拟。如需了解详情,请访问 www.attcareer.com/tech 或扫描页面二维码联系我们。
常见问题 · FAQ
DS Python 面试需要掌握深度学习(PyTorch/TensorFlow)吗?+
对于大多数 DS 岗位(尤其是 UK 金融行业),不需要。深度学习主要在 ML Engineer 和 Research Scientist 岗位中考察。DS 岗位更注重 Pandas/Sklearn 的熟练使用和统计分析能力。但如果你申请的是 DeepMind、Waymo 等 AI 公司的 DS 岗位,则需要掌握基础的 PyTorch。
面试中可以使用 ChatGPT 或 Copilot 吗?+
大多数 DS 面试(包括 Take-home Assignment)不允许使用 AI 工具,因为面试官需要评估你的真实能力。但部分公司(如 Palantir)的面试允许使用互联网,这时候重要的是你能快速找到正确答案并解释清楚,而不是死记硬背。
UK DS 面试和美国 FAANG DS 面试哪个更难?+
难度不同,侧重点不同。UK 金融行业 DS 面试更注重统计和 SQL,美国 FAANG DS 面试更注重产品分析和 ML 系统设计。如果你同时申请两个市场,建议先攻克 UK 市场的 SQL + 统计,再扩展到 ML 系统设计。
Free Resource
免费领取【Tech 求职全套资料包】
包含 CV 模板、面试题库、Networking 模板信及完整的求职 Timeline。已有 1,200+ 学员领取。

