您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Python优化数据预处理方法是什么
数据预处理是机器学习和数据分析中至关重要的步骤,约占整个项目70%的时间。Python作为数据科学的主流语言,提供了丰富的工具库和优化方法。本文将深入探讨Python中优化数据预处理的8大核心方法,并结合实际代码示例说明其应用场景。
## 一、向量化操作替代循环
### 1.1 NumPy向量化优势
```python
import numpy as np
# 传统循环方式
def standardize_loop(data):
result = []
mean_val = sum(data)/len(data)
std_val = (sum((x-mean_val)**2 for x in data)/len(data))**0.5
for x in data:
result.append((x-mean_val)/std_val)
return result
# 向量化方式
def standardize_vector(data):
arr = np.array(data)
return (arr - arr.mean()) / arr.std()
# 性能对比
data = list(range(1, 1000000))
%timeit standardize_loop(data) # 约1.2秒
%timeit standardize_vector(data) # 约20毫秒
import pandas as pd
df = pd.DataFrame({'A': np.random.randint(1,100,1000000)})
# 低效方式
df['B'] = df['A'].apply(lambda x: x**2 + 2*x + 1)
# 优化方式
df['B'] = df['A']**2 + 2*df['A'] + 1 # 速度提升5-10倍
# 原始数据类型
df = pd.read_csv('large_dataset.csv')
print(df.memory_usage(deep=True).sum() # 假设输出120MB
# 优化后
for col in df.columns:
if df[col].dtype == 'float64':
df[col] = pd.to_numeric(df[col], downcast='float')
elif df[col].dtype == 'int64':
df[col] = pd.to_numeric(df[col], downcast='integer')
print(df.memory_usage(deep=True).sum()) # 输出降为65MB
chunk_size = 100000
chunks = pd.read_csv('very_large_file.csv', chunksize=chunk_size)
result = []
for chunk in chunks:
# 对每个分块进行处理
processed = chunk[chunk['value'] > 0]
result.append(processed)
final_df = pd.concat(result)
from joblib import Parallel, delayed
def process_feature(col):
return df[col].fillna(df[col].median())
# 顺序执行
%time result = [process_feature(col) for col in df.columns]
# 并行执行
%time result = Parallel(n_jobs=4)(delayed(process_feature)(col) for col in df.columns)
import dask.dataframe as dd
# 创建Dask DataFrame
ddf = dd.from_pandas(df, npartitions=4)
# 并行执行操作
result = ddf.groupby('category').mean().compute()
import re
# 预编译正则表达式
pattern = re.compile(r'\b\d{3}-\d{2}-\d{4}\b') # 美国社保号格式
# 复用编译后的模式
df['ssn_valid'] = df['info'].str.contains(pattern)
# 低效方式
df['name_upper'] = df['name'].apply(lambda x: x.upper())
# 高效方式
df['name_upper'] = df['name'].str.upper() # 快3-5倍
from sklearn.preprocessing import OrdinalEncoder
# 高基数特征处理
high_card_cols = [col for col in df.columns if df[col].nunique() > 50]
# 使用序数编码替代独热编码
encoder = OrdinalEncoder(handle_unknown='use_encoded_value', unknown_value=-1)
df[high_card_cols] = encoder.fit_transform(df[high_card_cols])
# 转换前
df['category'] = df['category'].astype('object') # 占用较大内存
# 转换后
df['category'] = df['category'].astype('category') # 内存减少80%
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler
num_pipeline = Pipeline([
('imputer', SimpleImputer(strategy='median')),
('scaler', StandardScaler())
])
# 应用流水线
df[num_cols] = num_pipeline.fit_transform(df[num_cols])
from sklearn.base import BaseEstimator, TransformerMixin
class LogTransformer(BaseEstimator, TransformerMixin):
def fit(self, X, y=None):
return self
def transform(self, X):
return np.log1p(X)
# 集成到流水线
pipeline = Pipeline([
('log', LogTransformer()),
('scaler', StandardScaler())
])
# 传统列表推导式
result = [process(x) for x in large_list] # 立即占用内存
# 生成器方式
result = (process(x) for x in large_list) # 惰性求值
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
df = spark.read.csv('huge_dataset.csv')
# 转换操作不会立即执行
df_filtered = df.filter(df['value'] > 0)
df_transformed = df_filtered.withColumn('new_col', df['col1'] + df['col2'])
# 触发实际执行
df_transformed.show()
# 处理中间步骤
df_processed = complex_processing_pipeline(df)
# 保存中间结果
df_processed.to_parquet('processed_data.parquet')
# 后续直接加载
df_final = pd.read_parquet('processed_data.parquet')
from joblib import Memory
memory = Memory(location='./cachedir')
@memory.cache
def expensive_computation(data):
# 复杂计算过程
return result
# 第一次调用会执行计算并缓存
result1 = expensive_computation(data)
# 后续调用直接读取缓存
result2 = expensive_computation(data)
%timeit
测试不同实现的性能df.memory_usage()
和sys.getsizeof()
通过综合应用这些方法,可以在保持代码简洁的同时,将数据预处理效率提升10-100倍,特别是在处理GB级以上数据集时效果更为显著。 “`
注:实际使用时可根据需要调整代码示例中的数据集路径和具体参数。文章包含了代码示例、性能对比和实用建议,总字数约1900字,符合Markdown格式要求。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。