一、准备工作
1. 安装必要的库
首先需要安装 python 的数据处理和 excel 处理库:
pip install pandas openpyxl xlrd
注意:
pandas
是核心数据处理库openpyxl
用于处理.xlsx
格式的 excel 文件xlrd
用于处理较旧的.xls
格式(从 xlrd 2.0.0 开始不再支持 .xlsx)
2. 准备 excel 文件
假设我们有一个名为 sales_data.xlsx
的 excel 文件,包含以下数据:
日期 | 产品 | 销量 | 单价 | 销售额 |
---|---|---|---|---|
2023-01-01 | 产品a | 10 | 100 | 1000 |
2023-01-01 | 产品b | 5 | 200 | 1000 |
2023-01-02 | 产品a | 8 | 100 | 800 |
2023-01-02 | 产品c | 12 | 150 | 1800 |
... | ... | ... | ... | ... |
二、读取 excel 文件
1. 使用 pandas 读取
import pandas as pd # 读取整个工作表 df = pd.read_excel('sales_data.xlsx') # 显示前5行数据 print(df.head()) # 读取特定工作表(如果有多个工作表) # df = pd.read_excel('sales_data.xlsx', sheet_name='sheet1') # 读取特定列 # df = pd.read_excel('sales_data.xlsx', usecols=['日期', '产品', '销量'])
2. 使用 openpyxl 读取
from openpyxl import load_workbook # 加载工作簿 wb = load_workbook('sales_data.xlsx') # 获取活动工作表或指定工作表 sheet = wb.active # 或 wb['sheet1'] # 读取数据 data = [] for row in sheet.iter_rows(values_only=true): data.append(row) # 转换为dataframe(可选) import pandas as pd df = pd.dataframe(data[1:], columns=data[0]) # 假设第一行是标题
三、数据基本操作
1. 查看数据信息
# 查看数据基本信息 print(df.info()) # 查看统计摘要 print(df.describe()) # 查看列名 print(df.columns.tolist())
2. 数据筛选
# 筛选特定日期的数据 jan_data = df[df['日期'] == '2023-01-01'] # 筛选销量大于5的产品 high_sales = df[df['销量'] > 5] # 筛选多个条件 filtered_data = df[(df['日期'] >= '2023-01-01') & (df['产品'] == '产品a')]
3. 数据分组和聚合
# 按产品分组计算总销量和总销售额 product_stats = df.groupby('产品').agg({ '销量': 'sum', '销售额': 'sum' }).reset_index() print(product_stats) # 计算每日销售额总和 daily_sales = df.groupby('日期')['销售额'].sum().reset_index()
4. 数据排序
# 按销售额降序排序 sorted_data = df.sort_values('销售额', ascending=false) # 按日期和销量排序 sorted_data = df.sort_values(['日期', '销量'], ascending=[true, false])
四、数据可视化
1. 使用 matplotlib 绘制图表
import matplotlib.pyplot as plt # 设置中文字体(避免中文显示问题) plt.rcparams['font.sans-serif'] = ['simhei'] plt.rcparams['axes.unicode_minus'] = false # 绘制柱状图 - 各产品总销量 product_stats.plot(kind='bar', x='产品', y='销量', title='各产品总销量') plt.ylabel('销量') plt.show() # 绘制折线图 - 每日销售额趋势 daily_sales.plot(kind='line', x='日期', y='销售额', title='每日销售额趋势') plt.xlabel('日期') plt.ylabel('销售额') plt.xticks(rotation=45) plt.tight_layout() plt.show()
2. 使用 seaborn 进行高级可视化
pip install seaborn
import seaborn as sns # 设置风格 sns.set(style="whitegrid") # 绘制箱线图 - 各产品销量分布 plt.figure(figsize=(10, 6)) sns.boxplot(x='产品', y='销量', data=df) plt.title('各产品销量分布') plt.show() # 绘制热力图 - 相关性分析 corr_matrix = df[['销量', '单价', '销售额']].corr() sns.heatmap(corr_matrix, annot=true, cmap='coolwarm') plt.title('变量相关性热力图') plt.show()
五、数据处理与清洗
1. 处理缺失值
# 检查缺失值 print(df.isnull().sum()) # 填充缺失值 df_filled = df.fillna({'销量': 0, '单价': df['单价'].mean()}) # 删除包含缺失值的行 df_dropped = df.dropna()
2. 数据类型转换
# 转换日期格式 df['日期'] = pd.to_datetime(df['日期']) # 转换数值类型 df['销量'] = pd.to_numeric(df['销量'], errors='coerce') df['单价'] = pd.to_numeric(df['单价'], errors='coerce') df['销售额'] = pd.to_numeric(df['销售额'], errors='coerce')
3. 数据标准化
from sklearn.preprocessing import standardscaler # 选择需要标准化的列 features = df[['销量', '单价', '销售额']] # 标准化处理 scaler = standardscaler() scaled_features = scaler.fit_transform(features) # 转换回dataframe scaled_df = pd.dataframe(scaled_features, columns=features.columns)
六、高级分析技术
1. 时间序列分析
# 确保日期是datetime类型 df['日期'] = pd.to_datetime(df['日期']) # 设置日期为索引 df.set_index('日期', inplace=true) # 按周汇总销售额 weekly_sales = df.resample('w')['销售额'].sum() # 移动平均 df['7天移动平均销售额'] = df['销售额'].rolling(window=7).mean()
2. 相关性分析
# 计算相关性矩阵 corr_matrix = df[['销量', '单价', '销售额']].corr() # 可视化相关性 import seaborn as sns import matplotlib.pyplot as plt plt.figure(figsize=(8, 6)) sns.heatmap(corr_matrix, annot=true, cmap='coolwarm', center=0) plt.title('变量相关性热力图') plt.show()
3. 分组聚合与透 视表
# 使用groupby分组聚合 grouped = df.groupby(['产品', '日期']).agg({ '销量': 'sum', '销售额': 'sum' }).reset_index() # 创建透 视表 pivot_table = df.pivot_table( values='销售额', index='日期', columns='产品', aggfunc='sum', fill_value=0 ) print(pivot_table)
七、完整示例
下面是一个完整的分析流程示例:
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from datetime import datetime # 1. 读取数据 df = pd.read_excel('sales_data.xlsx') # 2. 数据清洗 df['日期'] = pd.to_datetime(df['日期']) df['销量'] = pd.to_numeric(df['销量'], errors='coerce').fillna(0) df['单价'] = pd.to_numeric(df['单价'], errors='coerce').fillna(df['单价'].mean()) df['销售额'] = pd.to_numeric(df['销售额'], errors='coerce').fillna(0) # 3. 基本统计 print("基本统计信息:") print(df.describe()) # 4. 按产品分组统计 product_stats = df.groupby('产品').agg({ '销量': 'sum', '销售额': 'sum', '单价': 'mean' }).sort_values('销售额', ascending=false) print("\n各产品销售统计:") print(product_stats) # 5. 时间序列分析 df.set_index('日期', inplace=true) daily_sales = df.resample('d')['销售额'].sum() # 6. 可视化 plt.figure(figsize=(15, 10)) # 每日销售额趋势 plt.subplot(2, 2, 1) daily_sales.plot(title='每日销售额趋势') plt.ylabel('销售额') # 各产品销量对比 plt.subplot(2, 2, 2) product_stats['销量'].plot(kind='bar', title='各产品总销量') plt.ylabel('销量') # 销量与单价关系 plt.subplot(2, 2, 3) sns.scatterplot(data=df, x='单价', y='销量', hue='产品') plt.title('销量与单价关系') plt.xlabel('单价') plt.ylabel('销量') # 产品销售额占比 plt.subplot(2, 2, 4) product_stats['销售额'].plot(kind='pie', autopct='%1.1f%%', startangle=90) plt.title('产品销售额占比') plt.ylabel('') # 去掉默认的ylabel plt.tight_layout() plt.show()
八、性能优化技巧
对于大型 excel 文件,可以考虑以下优化方法:
只读取需要的列:
df = pd.read_excel('large_file.xlsx', usecols=['日期', '产品', '销量'])
分块读取:
chunk_size = 10000 chunks = pd.read_excel('very_large_file.xlsx', chunksize=chunk_size) for chunk in chunks: process(chunk) # 处理每个数据块
使用更高效的文件格式:
- 将 excel 转换为 csv 后处理(通常更快)
- 使用 parquet 或 feather 格式存储中间数据
并行处理:
import dask.dataframe as dd # 使用dask处理大型数据集 ddf = dd.read_excel('large_file.xlsx') result = ddf.groupby('产品').销量.sum().compute()
九、常见问题解决
中文显示问题:
plt.rcparams['font.sans-serif'] = ['simhei'] # 设置中文字体 plt.rcparams['axes.unicode_minus'] = false # 解决负号显示问题
日期格式不一致:
# 尝试多种日期格式解析 df['日期'] = pd.to_datetime(df['日期'], errors='coerce', format='%y-%m-%d') df['日期'] = pd.to_datetime(df['日期'], errors='coerce', format='%d/%m/%y') df['日期'].fillna(pd.to_datetime('1900-01-01'), inplace=true) # 处理无法解析的日期
内存不足错误:
- 使用
dtype
参数指定列的数据类型减少内存使用 - 分块处理大型文件
- 使用更高效的文件格式
- 使用
十、扩展分析方向
预测分析:
- 使用时间序列模型预测未来销售额
- 应用机器学习模型预测产品需求
客户细分:
- 基于购买行为进行客户分群
- 构建rfm模型(最近购买、频率、金额)
异常检测:
- 识别异常销售记录
- 检测数据中的异常模式
地理空间分析:
- 如果数据包含地理位置信息,可以进行地理可视化
- 分析不同地区的销售表现
以上就是python分析和处理excel文件数据的详细步骤的详细内容,更多关于python分析和处理excel数据的资料请关注代码网其它相关文章!
发表评论