阶段一:数据清洗与结构化
原始数据清洗要点
在市场分析场景中,原始数据通常来自销售系统、网站分析和门店POS等多源。缺失值处理、重复记录清理和字段标准化是第一步。正确的清洗能提升后续热力图的准确性。
本阶段还应关注日期时间解析、编码规范和<强>单位一致性,以确保跨源对齐。多源数据常存在日期格式不一致、地区编码差异等问题,需在导入时统一处理。
import pandas as pd# 示例:读取原始销售数据
df = pd.read_csv('sales.csv')# 1) 日期统一
df['date'] = pd.to_datetime(df['date'], errors='coerce')# 2) 缺失值处理
df['sales'] = df['sales'].fillna(0)# 3) 去重
df = df.drop_duplicates()# 4) 字段重命名以统一口径
df = df.rename(columns={'region_code':'region_code', 'sales_amount':'sales'})
处理后,字段命名规范与数据类型要一致,方便后续聚合和合并。
统一字段与格式
统一地区编码和日期粒度,确保后续热力图映射正确。可以建立一个映射表,将外部地区编码映射到地理数据中的区域键。
通过创建一个列对齐方案,让 region_code、date、sales 等字段在同一数据框内可直接用于聚合。
阶段二:数据准备与聚合用于热力图
销售区域的地理编码
要将销售数据可视化在地理单位上,需要将区域编码与地理边界进行对齐。GeoJSON/Shapefile提供几何信息,地区编码字段用于对齐。
为避免跨源错位,建议在导入地理数据时进行几何投影一致性检查以及区域编码的唯一性校验。
import geopandas as gpd
# 读取地理边界
regions = gpd.read_file('regions.geojson') # or 'regions.shp'# 聚合销售数据
agg = df.groupby('region_code', as_index=False)['sales'].sum()# 将销售数据合并到地理边界
regions = regions.merge(agg, left_on='region_code', right_on='region_code', how='left')
regions['sales'] = regions['sales'].fillna(0)
数据透视表与网格热力
若希望在网格级别显示热点,可对时间维度进行切片,生成以区域为行、时间窗口为列的透视表。透视表和热力分布便于直观观察变动趋势。
也可以按区域和周/日聚合,得到一个二维表用于网格热力图绘制。

# 示例:按region与week聚合
df['week'] = df['date'].dt.isocalendar().week
pivot = df.pivot_table(index='region_code', columns='week', values='sales', aggfunc='sum', fill_value=0)
阶段三:阶段三:选择热力图类型与实现
地理热力图 vs 网格热力图
在市场分析中,地理热力图(choropleth)适合展示区域级别的强度,直观对应销售区域。而 网格热力图 则更适合按时间序列或细粒度网格观察热点变化。
实际应用中,可以根据数据粒度与呈现目标在两者之间选择,甚至同时提供两种视图以满足不同决策场景。
使用 Python 绘制热力图的关键库
核心工具包括 pandas 做数据处理、geopandas 处理地理数据、plotly 或 folium 做交互可视化,以及 matplotlib/seaborn 做静态图。以下示例展示两种常见实现。
# 方法1:地理 choropleth(Plotly + GeoJSON)
import plotly.express as px
import jsonwith open('regions.geojson') as f:geojson = json.load(f)# regions DataFrame 必须包含 region_code 和 sales 字段
fig = px.choropleth(regions, geojson=geojson,color='sales',locations='region_code',featureidkey='properties.region_code',projection='mercator',color_continuous_scale='Reds')
fig.update_geos(fitbounds='locations', visible=False)
fig.update_layout(title_text='销售区域热度可视化')
fig.show()# 方法2:网格热力图(Seaborn/Matplotlib)
import seaborn as sns
import matplotlib.pyplot as plt# pivot 已在阶段二构建
sns.heatmap(pivot, cmap='YlOrRd')
plt.title('区域x 周 销售热力图')
plt.xlabel('week')
plt.ylabel('region_code')
plt.show()
阶段四:从数据清洗到销售区域热度可视化的完整示例
完整管道概览
一个完整的热力图绘制管道通常包括 数据清洗、区域编码对齐、数据聚合、以及 可视化实现。该过程能够将底层数据转化为直观的图形,帮助市场决策。
通过将地理边界和销售数据合并,可以在地图上直接看到热点分布,方便跨区域对比与资源分配。
# 完整流程汇总代码片段(简化示例)
import pandas as pd
import geopandas as gpd
import json
import plotly.express as px# 1) 数据清洗
df = pd.read_csv('sales.csv')
df['date'] = pd.to_datetime(df['date'], errors='coerce')
df['sales'] = df['sales'].fillna(0)
df = df.drop_duplicates()# 2) 区域聚合
agg = df.groupby('region_code', as_index=False)['sales'].sum()# 3) 地理数据合并
regions = gpd.read_file('regions.geojson')
regions = regions.merge(agg, on='region_code', how='left')
regions['sales'] = regions['sales'].fillna(0)# 4) 可视化
with open('regions.geojson') as f:geojson = json.load(f)
fig = px.choropleth(regions, geojson=geojson,color='sales',locations='region_code',featureidkey='properties.region_code',projection='mercator')
fig.update_geos(fitbounds='locations', visible=False)
fig.update_layout(title_text='销售区域热度可视化')
fig.show()
# 只使用纯数据网格热力的示例(不可忽略的步骤)
# pivot 已经在阶段二准备好
import seaborn as sns
import matplotlib.pyplot as plt
sns.heatmap(pivot, cmap='Reds')
plt.title('区域-周热力图')
plt.xlabel('week')
plt.ylabel('region_code')
plt.tight_layout()
plt.savefig('region_week_heatmap.png', dpi=300)
阶段五:部署与后续扩展
静态导出与仪表盘集成
完成可视化后,可以将图像导出为 PNG/SVG,或在仪表板中显示。静态导出适用于报告,交互式仪表板则利于在线分析。
常见做法包括将热力图嵌入 Dash、Streamlit 应用,或将 Plotly 图保存为 HTML 文件以嵌入网页。
# 保存为静态图片(需要 kaleido)
fig.write_image('sales_heatmap.png')# 或导出为 HTML
fig.write_html('sales_heatmap.html')
性能与扩展要点
当区域数量较多时,数据分片加载、分层聚合和懒加载有助于保持响应性。可考虑分布式数据处理或按区域分批渲染。
未来可扩展为 交互式仪表盘,集成 过滤器、日期区间选择、以及 多模态数据源 的热力图组合展示。


