Pyecharts与Pandas数据处理

学习如何使用Pandas处理数据,并结合Pyecharts创建专业的数据可视化图表

为什么Pandas与Pyecharts是完美搭档?

Pandas是Python中最流行的数据处理库,而Pyecharts是强大的可视化工具。将两者结合使用,可以轻松地从原始数据到精美图表,实现完整的数据分析流程。

本教程将介绍如何使用Pandas进行数据读取、清洗、转换和分析,并将处理后的数据直接用于Pyecharts图表创建,实现数据可视化的完整流程。

Pandas基础入门

安装Pandas

使用pip安装Pandas库:

命令行
pip install pandas

Pandas核心数据结构

Pandas主要有两种数据结构:Series和DataFrame

  • Series:一维数组,类似于带标签的数组
  • DataFrame:二维表格数据结构,由多个Series组成

创建和读取数据

Pandas支持多种数据格式的读取:

python
import pandas as pd

# 从CSV文件读取数据
df = pd.read_csv('data.csv')

# 从Excel文件读取数据
df = pd.read_excel('data.xlsx')

# 从JSON文件读取数据
df = pd.read_json('data.json')

# 创建一个简单的DataFrame
data = {
 '姓名': ['张三', '李四', '王五'],
 '年龄': [25, 30, 35],
 '城市': ['北京', '上海', '广州']
}
df = pd.DataFrame(data)

Pandas数据处理与分析

数据查看与基本统计

python
# 查看数据的前几行
df.head()

# 查看数据的后几行
df.tail()

# 查看数据的基本信息
df.info()

# 获取数据的统计摘要
df.describe()

# 查看数据的列名
df.columns

# 查看数据的形状(行数和列数)
df.shape

# 计算某列的平均值
df['年龄'].mean()

# 计算某列的总和
df['销售额'].sum()

# 计算某列的最大值
df['销售额'].max()

# 计算某列的最小值
df['销售额'].min()

数据筛选与排序

python
# 按条件筛选数据
young_people = df[df['年龄'] < 30]

# 多条件筛选
condition = (df['年龄'] > 25) & (df['城市'] == '北京')
selected_data = df[condition]

# 按某列排序
sorted_df = df.sort_values(by='销售额', ascending=False)

# 按多列排序
sorted_df = df.sort_values(by=['城市', '年龄'])

# 选择特定的列
selected_columns = df[['姓名', '销售额']]

# 使用iloc按位置选择数据
df.iloc[0:5, 0:3] # 前5行,前3列

# 使用loc按标签选择数据
df.loc[0:5, ['姓名', '年龄']]

数据清洗

python
# 检查缺失值
df.isnull().sum()

# 删除含有缺失值的行
df.dropna()

# 用指定值填充缺失值
df.fillna(0)
# 用平均值填充缺失值
df['销售额'].fillna(df['销售额'].mean())

# 移除重复行
df.drop_duplicates()

# 数据类型转换
df['年龄'] = df['年龄'].astype('int')

# 修改列名
df.rename(columns={'旧列名': '新列名'})

# 应用函数到某一列
df['销售额'] = df['销售额'].apply(lambda x: x * 0.8)

数据分组与聚合

python
# 按某列分组
grouped = df.groupby('城市')

# 计算每组的平均值
grouped.mean()

# 计算每组的总和
grouped.sum()

# 对不同列应用不同的聚合函数
grouped.agg({
 '销售额': 'sum',
 '年龄': 'mean'
})

# 多级分组
df.groupby(['城市', '性别']).sum()

# 透视表
pivot_table = pd.pivot_table(
 df,
 values='销售额',
 index='城市',
 columns='月份',
 aggfunc='sum'
)

Pandas与Pyecharts数据可视化实战

案例1:月度销售数据分析

使用Pandas读取销售数据,分析月度销售额趋势,并使用Pyecharts创建折线图展示。

代码示例:
python
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Line

# 读取销售数据
# 这里我们模拟数据,实际使用时可以从文件读取
months = ['1月', '2月', '3月', '4月', '5月', '6月']
sales_data = {
 '月份': months,
 '销售额': [1200, 1800, 2200, 2800, 3200, 4000],
 '利润': [480, 720, 880, 1120, 1280, 1600]
}

df = pd.DataFrame(sales_data)

# 创建折线图
line = Line()

# 从DataFrame中提取数据添加到图表
line.add_xaxis(df['月份'].tolist())
line.add_yaxis("销售额", df['销售额'].tolist(), is_smooth=True)
line.add_yaxis("利润", df['利润'].tolist(), is_smooth=True, yaxis_index=1)

# 设置全局配置项
line.set_global_opts(
 title_opts=opts.TitleOpts(title="月度销售数据分析"),
 tooltip_opts=opts.TooltipOpts(trigger="axis"),
 legend_opts=opts.LegendOpts(pos_left="center"),
 xaxis_opts=opts.AxisOpts(name="月份"),
 yaxis_opts=[
 opts.AxisOpts(name="销售额(元)"),
 opts.AxisOpts(name="利润(元)", is_show=True, position="right")
 ]
)

# 渲染图表
line.render("sales_analysis.html")
效果展示:

案例2:不同产品类别销售对比

使用Pandas处理产品销售数据,进行分组统计,并使用Pyecharts创建柱状图进行对比分析。

代码示例:
python
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Bar

# 模拟产品销售数据
product_data = {
 '产品类别': ['电子产品', '服装', '食品', '图书', '家居用品'],
 '线上销售额': [15000, 8000, 6000, 3000, 7000],
 '线下销售额': [12000, 10000, 8000, 1500, 5000]
}

df = pd.DataFrame(product_data)

# 创建柱状图
bar = Bar()

# 添加数据
bar.add_xaxis(df['产品类别'].tolist())
bar.add_yaxis("线上销售额", df['线上销售额'].tolist())
bar.add_yaxis("线下销售额", df['线下销售额'].tolist())

# 设置全局配置项
bar.set_global_opts(
 title_opts=opts.TitleOpts(title="不同产品类别销售对比"),
 tooltip_opts=opts.TooltipOpts(trigger="axis"),
 legend_opts=opts.LegendOpts(pos_top="10%"),
 xaxis_opts=opts.AxisOpts(name="产品类别"),
 yaxis_opts=opts.AxisOpts(name="销售额(元)"),
 datazoom_opts=[opts.DataZoomOpts(type_="inside")]
)

# 渲染图表
bar.render("product_sales_comparison.html")
效果展示:

案例3:地区销售分布热力图

使用Pandas处理地区销售数据,然后使用Pyecharts创建热力图展示不同地区、不同月份的销售分布情况。

代码示例:
python
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import HeatMap
import numpy as np

# 生成模拟数据
cities = ['北京', '上海', '广州', '深圳', '杭州', '成都']
months = ['1月', '2月', '3月', '4月', '5月', '6月']

# 创建空的DataFrame
index = pd.MultiIndex.from_product([cities, months], names=['城市', '月份'])
df = pd.DataFrame(index=index)

# 填充随机销售数据
df['销售额'] = np.random.randint(500, 5000, size=len(df))

# 重塑数据为热力图所需格式
heatmap_data = []
for i, city in enumerate(cities):
 for j, month in enumerate(months):
 value = df.loc[(city, month), '销售额']
 heatmap_data.append([i, j, value])

# 创建热力图
heatmap = HeatMap()
heatmap.add_xaxis(cities)
heatmap.add_yaxis("销售额", months, heatmap_data)

# 设置全局配置项
heatmap.set_global_opts(
 title_opts=opts.TitleOpts(title="地区销售分布热力图"),
 visualmap_opts=opts.VisualMapOpts(min_=500, max_=5000),
 tooltip_opts=opts.TooltipOpts(formatter="{c} 元"),
 xaxis_opts=opts.AxisOpts(type_="category"),
 yaxis_opts=opts.AxisOpts(type_="category")
)

# 渲染图表
heatmap.render("regional_sales_heatmap.html")
效果展示:

案例4:中国各省份销售数据地图

使用Pandas处理全国各省份的销售数据,然后使用Pyecharts创建中国地图进行可视化展示。

代码示例:
python
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Map

# 创建省份销售数据
province_data = {
 '省份': ['北京', '上海', '广东', '江苏', '浙江', '山东', '河南',
 '四川', '湖北', '福建', '湖南', '安徽', '河北', '陕西'],
 '销售额': [15000, 18000, 25000, 22000, 20000, 16000, 14000,
 13000, 12000, 11000, 10500, 9800, 9500, 9000]
}

df = pd.DataFrame(province_data)

# 转换数据为Map所需的格式
map_data = list(zip(df['省份'].tolist(), df['销售额'].tolist()))

# 创建地图
map_chart = Map()
map_chart.add("销售额", map_data, "china")

# 设置全局配置项
map_chart.set_global_opts(
 title_opts=opts.TitleOpts(title="中国各省份销售数据地图"),
 visualmap_opts=opts.VisualMapOpts(
 min_=8000,
 max_=25000,
 text=['高', '低'],
 calculable=True
 ),
 tooltip_opts=opts.TooltipOpts(formatter="{b}: {c} 元")
)

# 渲染图表
map_chart.render("china_sales_map.html")
效果展示:

数据预处理与可视化最佳实践

1. 数据清洗的重要性

在进行数据可视化之前,确保数据的质量是至关重要的。

  • 处理缺失值,避免图表出现断裂或空白
  • 识别和处理异常值,防止它们扭曲整体趋势
  • 确保数据类型正确,特别是日期和数值类型
  • 标准化数据格式,保持一致性

2. 选择合适的图表类型

根据数据的特点和要传达的信息,选择合适的图表类型:

数据类型 适用的图表类型
时间序列数据 折线图、面积图
分类数据比较 柱状图、条形图
占比关系 饼图、环形图
相关性分析 散点图、热力图
地理数据 地图、热力地图

3. 提升图表可读性的技巧

创建清晰、易于理解的图表:

  • 使用简洁明了的标题和坐标轴标签
  • 选择合适的颜色方案,确保对比度和可访问性
  • 对于复杂图表,添加图例和数据标签
  • 使用动画效果增强用户体验,但避免过度使用
  • 保持图表简洁,避免不必要的装饰元素
  • 添加交互功能,如悬停显示详情、缩放和平移等

练习题:Pandas与Pyecharts综合实践

通过以下练习,实践如何结合Pandas和Pyecharts进行数据处理和可视化:

练习题1:电商销售数据分析

使用Pandas处理以下模拟电商销售数据,并创建可视化图表:

import pandas as pd
import numpy as np

# 创建模拟数据
dates = pd.date_range('2023-01-01', periods=180)
categories = ['电子产品', '服装', '食品', '家居用品']

# 生成随机销售数据
data = {
 '日期': np.random.choice(dates, 1000),
 '产品类别': np.random.choice(categories, 1000),
 '销售额': np.random.randint(100, 5000, 1000),
 '地区': np.random.choice(['华东', '华南', '华北', '西南', '西北'], 1000)
}

df = pd.DataFrame(data)

# 将日期转换为月份
df['月份'] = df['日期'].dt.month_name()

要求:

  1. 按月份和产品类别对数据进行分组,计算总销售额
  2. 创建折线图,展示各产品类别的月度销售额趋势
  3. 创建饼图,展示不同地区的销售占比
  4. 添加适当的标题、图例和交互功能

练习题2:学生成绩数据分析

使用Pandas处理学生成绩数据,并创建可视化图表进行分析:

import pandas as pd
import numpy as np

# 创建学生成绩数据
students = [f'学生{i}' for i in range(1, 51)]
subjects = ['数学', '语文', '英语', '物理', '化学', '生物']

data = {'姓名': students}
for subject in subjects:
 data[subject] = np.random.randint(60, 100, 50)

df = pd.DataFrame(data)

# 计算总分和平均分
df['总分'] = df[subjects].sum(axis=1)
df['平均分'] = df[subjects].mean(axis=1)

要求:

  1. 对学生成绩进行排序,找出总分前10名的学生
  2. 创建柱状图,展示前10名学生的总分情况
  3. 创建雷达图,对比分析前5名学生各学科的成绩
  4. 创建热力图,展示各学科之间的相关性
  5. 添加适当的标题、图例和交互功能

练习题3:天气数据分析

使用Pandas处理天气数据,并创建可视化图表分析天气变化趋势:

import pandas as pd
import numpy as np

# 创建日期范围
dates = pd.date_range('2023-01-01', '2023-12-31')

# 生成模拟天气数据
high_temp = []
low_temp = []
rainfall = []

for date in dates:
 month = date.month
 # 模拟温度变化(1月最冷,7月最热)
 base_temp = 10 + 15 * np.sin((month - 1) * np.pi / 6)
 daily_high = base_temp + np.random.normal(0, 5)
 daily_low = daily_high - 8 - np.random.normal(0, 3)

 # 模拟降雨量(夏季多雨)
 rain_prob = 0.1 + 0.3 * np.sin((month - 4) * np.pi / 6)
 daily_rain = np.random.exponential(10) if np.random.random() < rain_prob else 0

 high_temp.append(daily_high)
 low_temp.append(daily_low)
 rainfall.append(daily_rain)

# 创建DataFrame
df = pd.DataFrame({
 '日期': dates,
 '最高温度': high_temp,
 '最低温度': low_temp,
 '降雨量': rainfall
})

# 添加月份列
df['月份'] = df['日期'].dt.month

要求:

  1. 按月对数据进行分组,计算每月的平均最高温度、平均最低温度和总降雨量
  2. 创建折线图,展示全年温度变化趋势
  3. 创建柱状图,展示每月的降雨量分布
  4. 使用组合图表,在同一图中展示温度和降雨量数据
  5. 添加适当的标题、图例和交互功能