### 数据分析面试中的常见代码题及解答
数据分析面试中常见的代码题通常围绕数据预处理、特征工程、模型实现以及优化等方面展开。以下是几类典型的代码题及其解答:
#### 1. 大规模数据处理
对于大规模数据(如超过内存容量的数据集),如何有效地对其进行分割和处理是一个重要考点。
```python
import hashlib
def hash_partition(file_path, output_dir, num_partitions=1000):
"""
使用哈希函数将大文件按行分区到多个子文件中。
:param file_path: 输入的大文件路径
:param output_dir: 输出目录
:param num_partitions: 分区数量,默认为1000
"""
partition_files = {i: open(f"{output_dir}/part_{i}.txt", 'w') for i in range(num_partitions)}
with open(file_path, 'r') as f:
for line in f:
# 计算每行的哈希值并映射到对应的分区
hash_value = int(hashlib.md5(line.encode()).hexdigest(), 16) % num_partitions
partition_files[hash_value].write(line)
for pf in partition_files.values():
pf.close()
```
此方法利用哈希函数将大数据集划分为若干个小部分,便于后续逐块加载到内存中进行计算[^4]。
---
#### 2. 缺失值填充
缺失值是实际业务场景中最常遇到的问题之一,合理填补这些缺失值能够提升模型性能。
```python
import pandas as pd
import numpy as np
def fill_missing_values(df, strategy='mean'):
"""
基于指定策略填充DataFrame中的缺失值。
:param df: 输入的Pandas DataFrame
:param strategy: 填充策略 ('mean', 'median', 'mode')
"""
strategies = {
'mean': lambda col: col.mean(),
'median': lambda col: col.median(),
'mode': lambda col: col.mode()[0],
}
if strategy not in strategies:
raise ValueError("Unsupported filling strategy.")
filled_df = df.copy()
for column in df.columns:
if df[column].isnull().any(): # 如果列中有缺失值
filler = strategies[strategy](df[column])
filled_df[column] = df[column].fillna(filler)
return filled_df
```
该函数支持多种填充方式,可以根据具体需求灵活调整[^3]。
---
#### 3. 特征编码
类别型变量需要转换成数值形式才能被机器学习算法接受,常用的编码技术包括独热编码(One-Hot Encoding)和标签编码(Label Encoding)。
```python
from sklearn.preprocessing import OneHotEncoder, LabelEncoder
def encode_categorical_features(df, categorical_cols=None, encoding_type='one_hot'):
"""
对分类变量进行编码。
:param df: 输入的Pandas DataFrame
:param categorical_cols: 需要编码的列名列表
:param encoding_type: 编码类型 ('label' 或 'one_hot')
"""
if categorical_cols is None or len(categorical_cols) == 0:
categorical_cols = df.select_dtypes(include=['object']).columns
encoded_df = df.drop(columns=categorical_cols).copy() # 移除原始分类列
if encoding_type == 'label':
label_encoders = {}
for col in categorical_cols:
le = LabelEncoder()
encoded_df[col] = le.fit_transform(df[col])
label_encoders[col] = le
return encoded_df, label_encoders
elif encoding_type == 'one_hot':
onehot_encoder = OneHotEncoder(sparse=False)
transformed_data = onehot_encoder.fit_transform(df[categorical_cols])
new_columns = []
for i, category_col in enumerate(categorical_cols):
categories = onehot_encoder.categories_[i]
new_columns.extend([f'{category_col}_{cat}' for cat in categories])
onehot_encoded_df = pd.DataFrame(transformed_data, columns=new_columns)
final_df = pd.concat([encoded_df.reset_index(drop=True), onehot_encoded_df], axis=1)
return final_df, onehot_encoder
else:
raise ValueError("Invalid encoding type specified.")
```
这段代码实现了两种主流的特征编码方案,并返回经过编码后的数据帧以及用于逆变换的对象[^3]。
---
#### 4. 排序与去重操作
在某些情况下,我们需要对数据按照特定字段排序或者去除重复项。
```python
def sort_and_drop_duplicates(df, sort_by_column, ascending=True, keep_first=True):
"""
按照某列排序并对整个表执行去重操作。
:param df: 输入的Pandas DataFrame
:param sort_by_column: 排序列名称
:param ascending: 是否升序排列
:param keep_first: 去重时保留第一个出现还是最后一个 (True 表示前者 False 后者)
"""
sorted_df = df.sort_values(by=sort_by_column, ascending=ascending)
deduplicated_df = sorted_df.drop_duplicates(keep='first' if keep_first else 'last')
return deduplicated_df
```
通过调用 `drop_duplicates` 方法可以轻松完成这一任务,同时还能控制保留哪条记录作为唯一代表。
---
#### 5. 文本向量化
自然语言处理领域经常需要用到词袋模型或其他高级表示法来捕捉文本信息。
```python
from sklearn.feature_extraction.text import TfidfVectorizer
def vectorize_text(corpus, max_features=1000, ngram_range=(1, 1)):
"""
将文本语料库转化为TF-IDF矩阵。
:param corpus: 列表形式存储的一组字符串样本
:param max_features: 控制最大特征数目
:param ngram_range: N-Gram范围设置
"""
tfidf_vectorizer = TfidfVectorizer(max_features=max_features, ngram_range=ngram_range)
X_tfidf = tfidf_vectorizer.fit_transform(corpus)
feature_names = tfidf_vectorizer.get_feature_names_out()
return X_tfidf.toarray(), feature_names
```