项目名称:基于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.pysqider1.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.pysqider1.py通过requests从天气网站抓取数据,并解析出日期和温度数据。
  • 数据被存储到数据库中的ShuJu表。
3.2 数据展示与管理
  • 后台管理界面(通过admin.py)展示用户数据并允许管理员管理。
  • 主页展示天气数据,用户可以查看不同日期的天气信息。
3.3 预测与可视化
  • yuce.py使用Prophet进行历史天气数据的拟合与预测,输出未来的天气趋势。
  • 可视化部分在前端页面中通过Flask的模板系统展示预测结果。
3.4 用户权限管理
  • 后台管理界面通过MyModelView处理用户权限,未登录的用户会被重定向到登录页面。

4. 依赖与环境设置

4.1 环境配置
  • 需要安装FlaskFlask-SQLAlchemyFlask-BabelrequestsBeautifulSouppandasfbprophet等依赖。
  • 安装命令:
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.pysqider1.py中的抓取功能依赖外部天气网站,如果这些网站发生结构变化或停止提供数据,抓取功能可能会失效。
  • 需要定期清理数据库中的停用数据,以确保数据库的性能。
  • Prophet模型适合处理有明确季节性趋势的数据,但对于某些类型的天气数据(如突发天气变化),可能需要调整模型的参数。

具体项目演示效果:

【基于python+flask+时间序列模型的天气大数据预测+大屏可视化分析s2025017】 https://www.bilibili.com/video/BV114QRYeEXY/?sharesource=copyweb&vd_source=3d18b0a7b9486f50fe7f4dea4c24e2a4

以下是具体的代码分析:

admin.py 文件的前部分,以下是该文件的主要内容:

  1. 导入模块
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生成。
  1. 定义自定义的 ModelView
class MyModelView(ModelView):
    def inaccessible_callback(self, name, **kwargs):
        # 如果用户没有访问权限,重定向到登录页面
        return redirect(url_for('login', next=request.url))
  • 创建了一个自定义的 MyModelView 类继承自 ModelView
  • inaccessible_callback 方法用于处理用户没有访问权限时的回调,通常会将用户重定向到登录页面。
  1. 自定义用户管理视图
class MyUser(MyModelView):
    column_labels = dict(
        name='账号',
        email='邮箱'
    )
  • MyUser 类继承了 MyModelView,并自定义了列标签(如 name 对应 "账号",email 对应 "邮箱")。

这个文件的功能是为Flask后台提供管理界面,特别是管理用户信息,且做了一些权限检查。如果用户没有登录,访问管理页面时会被重定向到登录页面。

​​

main.py 文件的前部分,以下是该文件的主要内容:

  1. 导入模块
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 函数,可能用于抓取数据。
  1. 路由装饰器和视图函数
@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 页面,支持 GETPOST 请求。
  • 检查用户是否已登录,检查 session 中是否存在 uuid(可能是用户的唯一标识符)。
  • 如果用户未登录,重定向到登录页面。

main.py 的主要功能是处理Flask应用的路由,尤其是首页的访问。它检查用户是否已经登录,如果没有则重定向到登录页。

models.py 文件的前部分,以下是该文件的主要内容:

  1. 导入模块
import flask
from flask_sqlalchemy import SQLAlchemy
import os
import datetime
from flask_babelex import Babel
  • 导入Flask及相关库,用于构建Flask应用。
  • 导入 SQLAlchemy 来处理数据库操作。
  • 导入 Babel 用于国际化支持。
  1. Flask应用配置
app = flask.Flask(__name__)
babel = Babel(app)
app.config['BABEL_DEFAULT_LOCALE'] = 'zh_CN'
  • 创建Flask应用实例,并配置默认的语言环境为中文。
  1. 数据库配置
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 用于保护会话数据等。
  1. 数据库实例和模型定义

db = SQLAlchemy(app)
  • 初始化 SQLAlchemy,用于数据库操作。
  1. User模型类
class User(db.Model):
    __tablename__ = 'user'
  • 定义一个 User 数据库模型,继承自 db.Model
  • __tablename__ 定义了数据库表的名称(user 表)。

models.py 文件的作用是配置Flask应用与数据库的连接,并定义了 User 数据库模型。通过SQLAlchemy,Flask可以方便地与数据库进行交互。

​​

spider.py 文件的前部分,以下是该文件的主要内容:

  1. 导入模块
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 模块,可能用于将抓取的数据存入数据库。
  1. 请求头设置
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 以模拟浏览器请求,避免被网站识别为爬虫。
  1. 抓取天气数据
city_url = 'http://d1'
  • 在此代码中,city_url 看起来是一个天气数据源的 URL 地址,可能后续代码会根据城市ID拼接完整的URL来抓取天气数据。

spider.py 文件的目的是爬取天气数据,使用 requestsBeautifulSoup 解析网页内容,并处理数据。这些数据可能会被保存到数据库中,以便后续的可视化和预测使用。

​​

sqider1.py 文件的前部分,以下是该文件的主要内容:

  1. 导入模块
import requests
from bs4 import BeautifulSoup
import time
import models
from sqlalchemy import and_
from datetime import datetime, timedelta
  • 导入 requestsBeautifulSoup 用于网页抓取和解析。
  • 导入 models 用于处理与数据库的交互。
  • 导入 datetimetimedelta 用于日期操作,帮助计算过去的日期。
  1. 请求头设置
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"
}
  • 设置请求头,模拟浏览器行为,避免被网站识别为爬虫。
  1. 计算最近 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 文件的前部分,以下是该文件的主要内容:

  1. 导入模块
from fbprophet import Prophet
import models
import pandas as pd
  • 导入 Prophet,这是一个用于时间序列预测的模型库,广泛用于处理和预测趋势数据。
  • 导入 models,用于从数据库中获取数据。
  • 导入 pandas 用于数据处理。
  1. 从数据库中获取数据
dates = models.ShuJu.query.all()
  • 使用SQLAlchemy查询数据库中的 ShuJu 表,获取所有数据。
  1. 构建数据字典
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(最小值),这可能是模型的约束。
  1. 构建 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 文件的作用是为文本处理提供停用词列表,帮助清理和优化数据,尤其是在进行如分词、情感分析等任务时。

Logo

永洪科技,致力于打造全球领先的数据技术厂商,具备从数据应用方案咨询、BI、AIGC智能分析、数字孪生、数据资产、数据治理、数据实施的端到端大数据价值服务能力。

更多推荐