1. 项目概述
这个航班数据分析系统是一个基于Python和Flask构建的Web应用,主要用于可视化展示和分析航班数据。系统能够自动处理原始航班数据,生成11种不同类型的可视化图表,并通过美观的Web界面展示分析结果。
作为一个数据可视化项目,它完美结合了Python的数据处理能力和Flask的轻量级Web框架特性。系统启动时会自动检查数据文件是否存在,如果不存在则会生成示例数据,确保用户能够立即体验完整功能。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 技术栈选择
这个项目采用了以下技术栈组合:
- Python 3.x:作为核心编程语言,负责数据处理和分析
- Flask:轻量级Web框架,构建前端展示界面
- Pandas:数据处理和分析库
- Matplotlib:数据可视化库
- NumPy:科学计算基础库
- OpenPyXL:Excel文件处理库
选择这些技术的主要考虑是:
- Python在数据科学领域的成熟生态
- Flask的轻量级特性适合中小型Web应用
- 这些库之间有良好的兼容性和成熟的社区支持
2.2 目录结构设计
系统采用标准的Flask项目结构:
code复制flight_analysis_system/
├── static/
│ ├── css/
│ │ └── style.css
│ └── images/ # 自动生成的图表存放位置
├── templates/ # HTML模板文件
│ ├── index.html
│ ├── airport_analysis.html
│ ├── route_analysis.html
│ ├── airline_analysis.html
│ ├── price_analysis.html
│ ├── time_analysis.html
│ └── about.html
├── requirements.txt # 项目依赖
├── app.py # Flask主程序
└── flight_data_analysis.py # 数据处理和可视化核心代码
这种结构清晰地区分了前端资源、模板和业务逻辑代码,便于维护和扩展。
3. 核心功能实现
3.1 数据处理模块
flight_data_analysis.py是系统的核心数据处理模块,主要功能包括:
- 数据加载:支持从Excel文件加载真实数据,若无则自动生成示例数据
- 数据清洗:
- 处理缺失值和异常值
- 转换时间格式
- 计算衍生字段(如航线、起飞小时等)
- 数据分析:
- 机场流量统计
- 航线热度排名
- 航空公司运营指标计算
python复制# 示例:数据清洗函数
def to_minutes(s):
"""将"X小时Y分钟"格式的时间转换为分钟数"""
if pd.isna(s):
return np.nan
s = str(s)
if "小时" in s:
parts = s.split("小时")
h = int(parts[0]) if parts[0] else 0
m = int(parts[1].replace("分钟","").strip()) if len(parts)>1 and "分钟" in parts[1] else 0
return h * 60 + m
if "分钟" in s:
return int(s.replace("分钟","").strip())
return np.nan
3.2 可视化实现
系统生成11种不同类型的图表,覆盖了航班数据的多个维度:
- 机场分布图:展示机场地理位置和客流规模
- 航线热度图:显示热门航线的航班数和乘客数
- 航空公司分析图:包括准点率、票价分布和机型占比
- 票价分析图:票价分布直方图和票价-里程关系图
- 时间分析图:起飞时间分布和每周班期统计
python复制# 示例:生成机场分布图
def plot_airport_distribution(airport_traffic):
plt.figure(figsize=(10,7))
s_values = np.clip(airport_traffic["人数"].fillna(0)/2, 20, 900)
plt.scatter(airport_traffic["起飞机场x"], airport_traffic["起飞机场y"],
s=s_values, alpha=0.85, c=color_list(len(airport_traffic)))
for i, r in airport_traffic.iterrows():
plt.text(r["起飞机场x"], r["起飞机场y"], r["起飞机场"], fontsize=9)
plt.xlabel("经度")
plt.ylabel("纬度")
plt.title("起飞机场分布(点大小表示累计人数)")
plt.tight_layout()
plt.savefig(os.path.join(IMAGE_DIR, "airport_distribution.png"), dpi=300)
plt.close()
3.3 Web界面设计
系统采用响应式设计,主要特点包括:
- 导航结构:7个功能页面,覆盖所有分析维度
- 视觉设计:
- 渐变背景
- 卡片式布局
- 悬浮特效
- 图表展示:自适应网格布局,确保在不同设备上都能良好显示
html复制<!-- 示例:航线分析页面结构 -->
<div class="container">
<h1 class="page-title">✈️ 航线热度深度分析</h1>
<h2 class="sub-title">一、核心可视化图表</h2>
<div class="chart-grid">
<div class="chart-card">
<h3 class="chart-title">前10条航线航班数排名</h3>
<img src="{{ url_for('static', filename='images/top10_routes_count.png') }}" class="chart-img">
</div>
<div class="chart-card">
<h3 class="chart-title">前10条航线乘客总数排名</h3>
<img src="{{ url_for('static', filename='images/top10_routes_passengers.png') }}" class="chart-img">
</div>
</div>
</div>
4. 系统部署与使用
4.1 环境准备
- 安装Python 3.7+
- 创建虚拟环境(推荐)
- 安装依赖库:
bash复制pip install -r requirements.txt
4.2 数据准备
系统支持两种数据输入方式:
-
使用真实数据:
- 准备Excel文件"光用24年一年的就行-22年1月1日至24年12月31日航班数据.xlsx"
- 放置在项目根目录
- 系统会自动读取前300条记录
-
使用示例数据:
- 如果没有找到上述文件
- 系统会自动生成包含300条记录的示例数据集
4.3 启动系统
运行主程序:
bash复制python app.py
系统将:
- 检查图表是否存在,不存在则自动生成
- 启动Flask开发服务器
- 在默认浏览器中打开 http://localhost:5000
5. 开发经验与技巧
5.1 中文显示问题解决方案
Matplotlib默认不支持中文,系统实现了自动查找系统中文字体的功能:
python复制def find_chinese_font():
candidates = ["SimHei", "Microsoft YaHei", "MSYH", "Noto Sans CJK"]
sys_fonts = font_manager.findSystemFonts()
name_to_path = {}
for f in sys_fonts:
try:
prop = font_manager.FontProperties(fname=f)
name = prop.get_name()
name_to_path[name] = f
except:
continue
for c in candidates:
for name, path in name_to_path.items():
if c.lower() in name.lower():
return path, name
return None, None
5.2 数据可视化最佳实践
-
选择合适的图表类型:
- 分布数据使用直方图
- 排名数据使用条形图
- 占比数据使用饼图
- 关系数据使用散点图
-
颜色使用技巧:
- 使用tab20色系确保颜色丰富且协调
- 重要数据使用更鲜艳的颜色
- 相似数据使用相近色系
python复制# 使用tab20色系生成颜色列表
cmap = plt.get_cmap("tab20")
def color_list(n):
return [cmap(i % 20) for i in range(n)]
5.3 Flask项目组织技巧
-
路由设计:
- 每个分析维度单独路由
- 保持URL简洁有意义
- 使用一致的命名规范
-
模板组织:
- 共用导航栏和页脚
- 使用CSS类保持样式一致
- 合理组织图表展示区域
python复制# Flask路由示例
@app.route('/airport')
def airport_analysis():
return render_template('airport_analysis.html')
@app.route('/route')
def route_analysis():
return render_template('route_analysis.html')
6. 常见问题与解决方案
6.1 数据加载问题
问题:Excel文件加载失败
解决方案:
- 检查文件路径是否正确
- 确保文件没有被其他程序占用
- 验证文件格式是否为.xlsx
问题:中文显示乱码
解决方案:
- 确保系统安装了中文字体
- 在代码中正确设置字体参数
- 使用系统提供的字体查找功能
6.2 可视化问题
问题:图表显示不正常
解决方案:
- 检查数据是否包含NaN或异常值
- 验证图表尺寸是否合适
- 确保保存路径存在且可写
问题:颜色不协调
解决方案:
- 使用系统提供的color_list函数
- 避免使用太多相似颜色
- 重要数据使用对比度高的颜色
6.3 部署问题
问题:依赖安装失败
解决方案:
- 使用虚拟环境隔离项目
- 检查Python版本是否符合要求
- 尝试逐个安装依赖库
问题:端口被占用
解决方案:
- 更改Flapp运行端口
- 查找并终止占用端口的进程
- 使用
lsof -i :5000查找占用进程
python复制# 更改Flask运行端口
if __name__ == "__main__":
app.run(debug=True, host='0.0.0.0', port=5001) # 使用5001端口
7. 项目扩展建议
-
数据源扩展:
- 支持更多数据格式(CSV、JSON等)
- 增加数据库支持(MySQL、MongoDB等)
- 实现定时自动更新数据
-
功能扩展:
- 添加用户交互功能(筛选、排序等)
- 实现图表导出功能(PNG、PDF等)
- 增加数据预测功能(基于历史数据)
-
性能优化:
- 使用缓存提高图表生成效率
- 实现异步数据加载
- 优化大数据集处理能力
-
界面增强:
- 增加主题切换功能
- 实现响应式布局优化
- 添加动画过渡效果
python复制# 示例:使用缓存提高性能
from flask_caching import Cache
cache = Cache(config={'CACHE_TYPE': 'simple'})
cache.init_app(app)
@app.route('/airport')
@cache.cached(timeout=300) # 缓存5分钟
def airport_analysis():
return render_template('airport_analysis.html')
这个航班数据分析系统展示了如何使用Python生态构建完整的数据可视化解决方案。从数据处理到Web展示,项目涵盖了数据科学项目的典型工作流程。系统的模块化设计和清晰的代码结构也使其成为学习Flask和数据可视化的优秀范例。
