基于Python+Flask+时间序列的天气可视化与预测系统
该项目使用Flask框架开发,主要功能包括天气数据的抓取、存储、可视化展示以及基于时间序列预测模型(如Prophet)进行未来天气预测。系统通过爬虫从网站抓取数据,将其存入数据库,随后进行可视化展示和天气趋势预测。
项目名称:基于Flask的天气可视化与预测系统
项目概述
该项目使用Flask框架开发,主要功能包括天气数据的抓取、存储、可视化展示以及基于时间序列预测模型(如Prophet)进行未来天气预测。系统通过爬虫从网站抓取数据,将其存入数据库,随后进行可视化展示和天气趋势预测。
项目结构
│ ├── .idea/ # 项目配置文件(IDE生成) ├── admin.py # Flask后台管理界面 ├── main.py # Flask应用主入口,处理路由和页面逻辑 ├── models.py # 数据库模型定义 ├── spider.py # 爬虫脚本,用于抓取天气数据 ├── sqider1.py # 爬虫脚本,抓取过去6个月的天气数据 ├── static/ # 静态文件(CSS、JS、图片等) ├── stopwords.txt # 停用词文件 ├── templates/ # HTML模板 ├── yuce.py # 使用Prophet进行时间序列预测 └── __pycache__/ # 编译的Python缓存文件
1. 数据库设计
数据库配置:
- 使用SQLAlchemy进行数据库操作,Flask配置数据库连接为SQLite数据库。
- 数据表包括:
User,ShuJu。
数据库模型:
1.1 User模型(models.py)
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50), nullable=False)
email = db.Column(db.String(100), unique=True, nullable=False)
# 其他用户相关字段...
id: 用户的唯一标识符。name: 用户名。email: 用户的电子邮箱,唯一。
1.2 ShuJu模型(models.py)
class ShuJu(db.Model):
__tablename__ = 'shu_ju'
id = db.Column(db.Integer, primary_key=True)
datetime = db.Column(db.String(20)) # 存储日期,格式为 'YYYY年MM月DD日'
max_wendu = db.Column(db.Float) # 最高温度
min_wendu = db.Column(db.Float) # 最低温度
# 其他天气数据字段...
datetime: 日期(格式:YYYY年MM月DD日)。max_wendu: 最高温度。min_wendu: 最低温度。
2. 功能模块设计
2.1 管理后台 (admin.py)
- 使用
Flask-Admin扩展实现一个简单的管理后台界面,用于展示和管理User模型的数据。 - 自定义了一个
MyModelView类,用于处理没有权限时的回调,确保用户未登录时会被重定向到登录页面。
2.2 Flask路由与视图处理 (main.py)
- 主要的路由定义和视图函数位于
main.py中,负责处理前端页面的请求。 @app.route('/', methods=['GET', 'POST']): 首页路由,用于展示天气数据,并进行用户登录状态检查。
2.3 数据爬取 (spider.py & sqider1.py)
spider.py和sqider1.py是用于从天气网站抓取数据的爬虫脚本,使用了requests库和BeautifulSoup库来解析HTML内容。spider.py爬取单一日期的天气数据,sqider1.py爬取过去6个月的天气数据,利用datetime生成过去6个月的日期,抓取每个月的数据。
2.4 天气预测 (yuce.py)
- 使用
Prophet库进行时间序列预测。 yuce.py脚本从数据库ShuJu表中获取天气数据(日期、最高温度),并使用Prophet模型进行拟合和预测。growth='logistic'表示使用逻辑增长模型进行预测,设置了温度的上限cap和下限floor。
3. 流程与功能实现
3.1 数据抓取
spider.py和sqider1.py通过requests从天气网站抓取数据,并解析出日期和温度数据。- 数据被存储到数据库中的
ShuJu表。
3.2 数据展示与管理
- 后台管理界面(通过
admin.py)展示用户数据并允许管理员管理。 - 主页展示天气数据,用户可以查看不同日期的天气信息。
3.3 预测与可视化
yuce.py使用Prophet进行历史天气数据的拟合与预测,输出未来的天气趋势。- 可视化部分在前端页面中通过Flask的模板系统展示预测结果。
3.4 用户权限管理
- 后台管理界面通过
MyModelView处理用户权限,未登录的用户会被重定向到登录页面。
4. 依赖与环境设置
4.1 环境配置
- 需要安装
Flask、Flask-SQLAlchemy、Flask-Babel、requests、BeautifulSoup、pandas、fbprophet等依赖。 - 安装命令:
pip install Flask Flask-SQLAlchemy Flask-Babel requests beautifulsoup4 pandas fbprophet
4.2 数据库配置
- SQLite数据库,数据库文件默认存储为
TianQi.db,位于Flask应用的根目录下。
4.3 运行项目
- 启动Flask应用:
python main.py
5. 注意事项
spider.py和sqider1.py中的抓取功能依赖外部天气网站,如果这些网站发生结构变化或停止提供数据,抓取功能可能会失效。- 需要定期清理数据库中的停用数据,以确保数据库的性能。
Prophet模型适合处理有明确季节性趋势的数据,但对于某些类型的天气数据(如突发天气变化),可能需要调整模型的参数。
具体项目演示效果:
【基于python+flask+时间序列模型的天气大数据预测+大屏可视化分析s2025017】 https://www.bilibili.com/video/BV114QRYeEXY/?sharesource=copyweb&vd_source=3d18b0a7b9486f50fe7f4dea4c24e2a4


以下是具体的代码分析:
在 admin.py 文件的前部分,以下是该文件的主要内容:
- 导入模块:
from flask_admin import Admin, AdminIndexView from main import app from flask_admin.contrib.sqla import ModelView from flask import current_app, redirect, url_for, request from models import db, User, Same_day, ShuJu
- 导入
Flask-Admin模块来处理后台管理界面。 - 从
main.py导入app,即Flask应用实例。 - 使用
ModelView来为数据库模型提供Flask-Admin的后台界面。 - 从
models导入db和模型类User,Same_day,ShuJu,这些可能是用于展示的数据表。 - 导入Flask的一些功能,如重定向和URL生成。
- 定义自定义的
ModelView类:
class MyModelView(ModelView):
def inaccessible_callback(self, name, **kwargs):
# 如果用户没有访问权限,重定向到登录页面
return redirect(url_for('login', next=request.url))
- 创建了一个自定义的
MyModelView类继承自ModelView。 inaccessible_callback方法用于处理用户没有访问权限时的回调,通常会将用户重定向到登录页面。
- 自定义用户管理视图:
class MyUser(MyModelView):
column_labels = dict(
name='账号',
email='邮箱'
)
MyUser类继承了MyModelView,并自定义了列标签(如name对应 "账号",email对应 "邮箱")。
这个文件的功能是为Flask后台提供管理界面,特别是管理用户信息,且做了一些权限检查。如果用户没有登录,访问管理页面时会被重定向到登录页面。
在 main.py 文件的前部分,以下是该文件的主要内容:
- 导入模块:
from flask import Flask, request, render_template, jsonify, abort, session, redirect, url_for import os import models from models import app from sqlalchemy import or_, and_ import datetime from spider import main as ma
- 导入Flask框架及相关功能,用于处理Web请求和模板渲染等。
- 导入自定义的
models模块,其中包含数据库相关的内容(如Flask应用实例app)。 - 使用SQLAlchemy的逻辑操作符
or_和and_。 - 导入
spider.py中的main函数,可能用于抓取数据。
- 路由装饰器和视图函数:
@app.route('/', methods=['GET', 'POST'])
@app.route('/index', methods=['GET', 'POST'])
def index():
uuid = session.get('uuid')
if uuid:
if not models.User.query.get(uuid):
return redirect(url_for('login'))
- 这个路由处理主页和
index页面,支持GET和POST请求。 - 检查用户是否已登录,检查
session中是否存在uuid(可能是用户的唯一标识符)。 - 如果用户未登录,重定向到登录页面。
main.py 的主要功能是处理Flask应用的路由,尤其是首页的访问。它检查用户是否已经登录,如果没有则重定向到登录页。
在 models.py 文件的前部分,以下是该文件的主要内容:
- 导入模块:
import flask from flask_sqlalchemy import SQLAlchemy import os import datetime from flask_babelex import Babel
- 导入Flask及相关库,用于构建Flask应用。
- 导入
SQLAlchemy来处理数据库操作。 - 导入
Babel用于国际化支持。
- Flask应用配置:
app = flask.Flask(__name__) babel = Babel(app) app.config['BABEL_DEFAULT_LOCALE'] = 'zh_CN'
- 创建Flask应用实例,并配置默认的语言环境为中文。
- 数据库配置:
app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv(
'DATABASE_URL',
'sqlite:///' + os.path.join(app.root_path, 'TianQi.db'))
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SECRET_KEY'] = 'TianQi'
- 配置数据库连接,默认使用SQLite数据库(
TianQi.db)。 - 禁用SQLAlchemy的修改追踪功能。
- 设置一个Flask的
SECRET_KEY用于保护会话数据等。
- 数据库实例和模型定义:
db = SQLAlchemy(app)
- 初始化
SQLAlchemy,用于数据库操作。
- User模型类:
class User(db.Model):
__tablename__ = 'user'
- 定义一个
User数据库模型,继承自db.Model。 __tablename__定义了数据库表的名称(user表)。
models.py 文件的作用是配置Flask应用与数据库的连接,并定义了 User 数据库模型。通过SQLAlchemy,Flask可以方便地与数据库进行交互。
在 spider.py 文件的前部分,以下是该文件的主要内容:
- 导入模块:
import json import requests from bs4 import BeautifulSoup import re import ast import pandas import time import models from sqlalchemy import and_
- 导入常用的爬虫库,包括
requests(用于HTTP请求),BeautifulSoup(用于HTML解析),re(正则表达式处理),ast(用于处理Python语法树),以及pandas(用于数据处理)。 - 还导入了自定义的
models模块,可能用于将抓取的数据存入数据库。
- 请求头设置:
session = requests.session()
def main(id):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36",
"Referer": "http://www.weather.com.cn/",
"Accept-Language": "zh-CN,zh;q=0.9",
"Accept": "*/*"
}
- 创建一个
requests会话对象session,可以在多次请求中复用连接。 - 定义
headers以模拟浏览器请求,避免被网站识别为爬虫。
- 抓取天气数据:
city_url = 'http://d1'
- 在此代码中,
city_url看起来是一个天气数据源的 URL 地址,可能后续代码会根据城市ID拼接完整的URL来抓取天气数据。
spider.py 文件的目的是爬取天气数据,使用 requests 和 BeautifulSoup 解析网页内容,并处理数据。这些数据可能会被保存到数据库中,以便后续的可视化和预测使用。
在 sqider1.py 文件的前部分,以下是该文件的主要内容:
- 导入模块:
import requests from bs4 import BeautifulSoup import time import models from sqlalchemy import and_ from datetime import datetime, timedelta
- 导入
requests和BeautifulSoup用于网页抓取和解析。 - 导入
models用于处理与数据库的交互。 - 导入
datetime和timedelta用于日期操作,帮助计算过去的日期。
- 请求头设置:
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36",
"Referer": "http://www.tianqihoubao.com",
"Accept-Language": "zh-CN,zh;q=0.9"
}
- 设置请求头,模拟浏览器行为,避免被网站识别为爬虫。
- 计算最近 6 个月的日期:
today = datetime.today() months_to_scrape = [today - timedelta(days=30 * i) for i in range(6)]
- 使用
datetime计算出最近6个月的日期,利用timedelta减去每个月的天数。这些日期可能用于抓取最近6个月的天气数据。
sqider1.py 主要负责抓取天气数据并处理过去6个月的日期。这些日期很可能用于抓取对应时间段的数据。
接下来,我将继续查看并分析 yuce.py 文件。
在 yuce.py 文件的前部分,以下是该文件的主要内容:
- 导入模块:
from fbprophet import Prophet import models import pandas as pd
- 导入
Prophet,这是一个用于时间序列预测的模型库,广泛用于处理和预测趋势数据。 - 导入
models,用于从数据库中获取数据。 - 导入
pandas用于数据处理。
- 从数据库中获取数据:
dates = models.ShuJu.query.all()
- 使用SQLAlchemy查询数据库中的
ShuJu表,获取所有数据。
- 构建数据字典:
dicts = {
'ds': [],
'y': [],
'cap': [],
'floor': []
}
for resu in dates:
dicts['ds'].append(resu.datetime.replace('日','').replace('年','-').replace('月','-'))
dicts['y'].append(resu.max_wendu),
dicts['cap'].append(40)
dicts['floor'].append(-10)
- 创建一个字典
dicts用于存储时间序列数据。 - 遍历数据库中的所有数据,处理每条数据的日期(将日期中的“日”、“年”、“月”字符替换为标准格式),并将最高温度(
max_wendu)加入数据字典。 - 还为每个数据点设置了一个
cap(最大值)和floor(最小值),这可能是模型的约束。
- 构建 DataFrame 并拟合模型:
df = pd.DataFrame.from_dict(dicts) # 拟合模型 m = Prophet(growth='logistic') m.fit(df)
- 将数据字典转换为
pandas的 DataFrame,供Prophet模型使用。 - 使用Prophet模型进行时间序列的拟合,设置
growth='logistic',表示使用逻辑增长模型进行预测。
yuce.py 文件使用Prophet进行时间序列预测。它从数据库获取天气数据(如最高温度),并构建用于拟合模型的数据集。之后,使用Prophet进行时间序列的建模和预测。
接下来,我将继续查看并分析 stopwords.txt 文件。
在 stopwords.txt 文件中,包含了大量的中文停用词。这些停用词在文本处理中通常会被移除,因为它们对文本分析没有太大意义。以下是文件的一部分内容:
- 常见的中文停用词,如数字 (
0,1,2, ...)、标点符号 (、,。,《,》)、以及一些常见的连词、介词等,如: 不,不但,不只,不如,但,如果,什么,于是,与,和,也,为了等。- 这些词汇通常在自然语言处理(NLP)任务中被去除,尤其是在文本分类、情感分析和其他基于文本的分析任务中。
stopwords.txt 文件的作用是为文本处理提供停用词列表,帮助清理和优化数据,尤其是在进行如分词、情感分析等任务时。
更多推荐


所有评论(0)