一、环境搭建与工具准备
1.1 必备工具包
# 基础数据处理 pip install pandas==1.2.4 # 数据清洗利器 # 大数据处理 pip install pyspark==3.0.3 # 分布式计算框架 # 数据可视化 pip install pyecharts==1.9.0 # 交互式图表
1.2 版本管理要点
-
注意Pandas与PySpark的版本兼容性
-
Pyecharts 1.x与2.x的API差异较大
二、数据清洗核心技巧
2.1 重复数据处理
# 检测重复值 df[df.duplicated()] # 删除重复值(保留第一条) df.drop_duplicates(inplace=True) # 重建索引 df.reset_index(drop=True, inplace=True)
2.2 缺失值处理策略
方法 | 代码示例 | 适用场景 |
---|---|---|
前向填充 | df.fillna(method='ffill') | 时间序列数据 |
后向填充 | df.fillna(method='bfill') | 末尾数据缺失 |
均值填充 | df.fillna(df.mean()) | 数值型特征 |
删除记录 | df.dropna() | 缺失比例小时 |
2.3 数据格式标准化
# 日期格式统一化(处理混合格式) df['日期'] = df['日期'].apply( lambda x: pd.to_datetime(x, format='%Y#%m#%d') if '#' in str(x) else pd.to_datetime(x)) # 带单位数值清洗 df['数量'] = df['数量'].str.extract('(\d+)').astype(int) df['价格'] = df['价格'].str.replace('元','').astype(float)
三、Spark SQL核心操作
3.1 窗口函数应用
from pyspark.sql import Window import pyspark.sql.functions as F # 定义窗口规范 window_spec = Window.partitionBy("商品小类").orderBy(F.desc("销售单价")) # 计算每个商品小类价格排名 df.withColumn("价格排名", F.rank().over(window_spec)) \ .filter(F.col("价格排名") <= 5) # 获取各类TOP5
3.2 常见聚合操作
# 按月统计销售额 (df.groupBy(F.date_format("订单日期", "yyyy-MM").alias("月份")) .agg(F.sum("金额").alias("月销售额")) .orderBy("月份"))
四、数据分析方法论
4.1 RFM模型实现
# 计算R(最近购买)、F(购买频次)、M(消费金额) rfm = (spark.sql(""" SELECT 客户编码, DATEDIFF(current_date(), MAX(订单日期)) AS R, COUNT(DISTINCT 订单编码) AS F, SUM(金额) AS M FROM sales GROUP BY 客户编码 """)) # 客户分群(示例) rfm.withColumn("客户等级", F.when((F.col("R") < 30) & (F.col("F") > 5), "高价值") .otherwise("一般客户"))
4.2 销售漏斗分析
# 各环节转化率计算 conversion = (df.groupBy("客户行为阶段") .agg(F.count("*").alias("人数")) .withColumn("转化率", F.col("人数")/F.lag("人数").over(Window.orderBy("行为序列"))))
五、数据可视化技巧
5.1 Pyecharts最佳实践
from pyecharts.charts import Bar from pyecharts import options as opts # 创建柱状图 bar = ( Bar() .add_xaxis(["面膜", "口红", "精华"]) .add_yaxis("销量", [1200, 800, 600]) .set_global_opts( title_opts=opts.TitleOpts(title="商品销量TOP3"), toolbox_opts=opts.ToolboxOpts(), datazoom_opts=opts.DataZoomOpts() ) ) bar.render("sales_top3.html")
5.2 仪表盘制作
from pyecharts.charts import Page page = Page() page.add(bar1, bar2, line1, pie1) page.render("dashboard.html")
六、性能优化建议
-
数据分区策略:
-
按日期分区:
df.repartition(52, "周数")
-
合理设置分区数(建议每个分区128MB-1GB)
-
-
缓存常用数据集:
spark_df.cache() # 内存缓存 spark_df.persist(StorageLevel.MEMORY_AND_DISK) # 内存+磁盘
-
广播小表:
from pyspark.sql.functions import broadcast df.join(broadcast(lookup_df), "key")
七、常见问题解决方案
-
日期解析错误:
-
使用
pd.to_datetime()
的errors='coerce'
参数 -
自定义日期解析函数处理特殊格式
-
-
内存不足:
-
调整Spark配置:
spark.executor.memory=4g
-
使用
df.sample()
进行抽样分析
-
-
数据倾斜:
-
添加随机前缀进行二次聚合
-
使用
salting
技术分散热点key
-