基于Python的天气数据分析与可视化系统(附源码获取链接)

基于Python的天气数据分析与可视化系统(附源码获取链接)

📌 引言

随着气候变化日益受到关注,对历史天气数据的分析和未来趋势的预测变得尤为重要。本次分享一个基于 Django天气数据分析与可视化系统,实现了从数据采集、存储、分析到可视化展示和预测的全流程功能。

🏗️ 一、系统概述

本项目是一个完整的 Web端天气数据分析平台,主要功能包括:

  • ✅ 多城市历史天气数据自动爬取
  • ✅ 用户注册/登录与数据管理
  • ✅ 温度、风力、空气质量等多维度数据可视化
  • ✅ 天气词云展示
  • ✅ 基于机器学习的天气趋势预测
  • ✅ 支持MySQL数据库与定时任务更新

项目采用 前后端分离 + MVC架构,后端使用 Django 框架,前端基于 Bootstrap + Morris Chart + jQuery 实现响应式交互界面。

🧩 二、系统架构设计

[用户浏览器] ↓ HTTP请求 [Django Web Server] ↓ 路由分发 → View → Model → DB [MySQL/SQLite] ↑ 数据存储 [Spiders] ← 定时任务 ← Python爬虫 ← 天气网站 ↓ [Pandas] → 数据清洗 → [Scikit-learn] → 预测模型 ↓ [前端图表] ← JSON API ← View
📌 架构特点:数据采集与业务逻辑解耦可扩展性强,支持多城市、多指标支持开发(SQLite)与生产(MySQL)环境切换

⚙️ 三、技术栈详解

类别技术
后端Python 3.8+, Django 3.1.14, MySQL, SQLite
爬虫requestslxml
数据处理pandasnumpy
机器学习scikit-learn(线性回归、随机森林)
前端Bootstrap 4, Morris Chart, Swiper, jQuery
工具库csvdatetimejson

🗂️ 四、项目目录结构

weather-analysis-system/ ├── manage.py ├── requirements.txt ├── weatherdata.sql # 数据库初始化脚本 ├── spiders/ # 爬虫模块 │ ├── spiderMain.py # 主爬虫入口 │ ├── spiderCity.py # 城市爬虫 │ └── city.csv # 城市列表 ├── myApp/ # Django主应用 │ ├── models.py # 数据模型 │ ├── views.py # 视图逻辑 │ ├── urls.py # URL路由 │ └── templates/ # HTML模板 ├── model/ # 预测模型 │ └── index.py # 预测算法 ├── utils/ # 工具函数 │ └── getChartData.py # 图表数据生成 ├── static/ # 静态资源 ├── wordCloud.py # 词云生成脚本 └── 天气数据分析可视化系统/ # Django项目配置
💡 说明:项目命名使用中文目录是为方便理解

🕷️ 五、核心功能实现

1. 数据采集模块(爬虫)

使用 requests + lxml 抓取某天气网站的历史数据(如“中国天气网”),示例代码如下:

# spiders/spiderMain.py import requests from lxml import html def crawl_weather(city, date): url = f"https://www.weather.com/history/{city}/{date}" headers = {"User-Agent": "Mozilla/5.0"} response = requests.get(url, headers=headers) tree = html.fromstring(response.content) temperature = tree.xpath('//div[@class="temp"]/text()')[0] wind = tree.xpath('//div[@class="wind"]/text()')[0] air_quality = tree.xpath('//div[@class="aqi"]/text()')[0] return { "city": city, "date": date, "temperature": temperature, "wind": wind, "air_quality": air_quality }
🔁 支持批量爬取多个城市,并将数据写入数据库。

2. 数据模型定义(Django Models)

# myApp/models.py from django.db import models class WeatherData(models.Model): city = models.CharField(max_length=50, verbose_name="城市") date = models.DateField(verbose_name="日期") high_temp = models.IntegerField(verbose_name="最高气温") low_temp = models.IntegerField(verbose_name="最低气温") wind = models.CharField(max_length=30, verbose_name="风力") air_quality = models.CharField(max_length=20, verbose_name="空气质量") weather = models.CharField(max_length=20, verbose_name="天气状况") class Meta: db_table = 'weather_data' verbose_name = "天气数据" verbose_name_plural = "天气数据"

3. 数据可视化(Morris Chart)

前端使用 Morris.js 实现动态图表,例如温度趋势图:

<!-- templates/temp_chart.html --> <div></div> <script> Morris.Line({ element: 'temp-chart', data: {{ chart_data|safe }}, xkey: 'date', ykeys: ['high', 'low'], labels: ['最高温', '最低温'], parseTime: false }); </script>

后端视图提供JSON数据:

# myApp/views.py def cityChar(request): city = request.GET.get('city', '北京') data = WeatherData.objects.filter(city=city).order_by('date') chart_data = [ {"date": d.date.strftime("%m-%d"), "high": d.high_temp, "low": d.low_temp} for d in data ] return JsonResponse(chart_data, safe=False)

4. 词云生成(wordCloud.py)

使用 wordcloud 库生成天气状况词云:

# wordCloud.py from wordcloud import WordCloud import matplotlib.pyplot as plt from myApp.models import WeatherData def generate_wordcloud(): texts = WeatherData.objects.values_list('weather', flat=True).join(texts) wc = WordCloud(font_path='simhei.ttf', width=800, height=400, background_color='white') wc.generate(text) wc.to_file('static/images/wordcloud.png')
🖼️ 效果:雨天、晴天、多云等出现频率高的词会更大。

5. 天气预测(机器学习)

使用 scikit-learn 建立简单线性回归模型预测未来温度:

# model/index.py import pandas as pd from sklearn.linear_model import LinearRegression def predict_temperature(city, days=7): data = pd.read_csv('spiders/tempData.csv') data['date_ordinal'] = pd.to_datetime(data['date']).map(pd.Timestamp.toordinal) X = data[['date_ordinal']] y = data['high_temp'] model = LinearRegression() model.fit(X, y) # 预测未来7天 future_dates = pd.date_range(data['date'].max(), periods=days+1)[1:] future_ordinals = [[d.toordinal()] for d in future_dates] predictions = model.predict(future_ordinals) return list(zip(future_dates.strftime("%Y-%m-%d"), predictions))
⚠️ 注意:想要扩展的可以使用更复杂的模型(如LSTM)并加入气象因子。

🚀 六、快速部署指南

1. 安装依赖

pip install -r requirements.txt

2. 配置数据库(settings.py)

DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'weatherdata', 'USER': 'root', 'PASSWORD': 'your_password', 'HOST': '127.0.0.1', 'PORT': '3306', } }

3. 初始化数据库

python manage.py makemigrations python manage.py migrate

4. 运行服务

python manage.py runserver 8000

访问:http://127.0.0.1:8000


📊 七、系统截图

源码获取:

Read more

csp信奥赛c++高频考点假期集训(分模块进阶)

csp信奥赛c++高频考点假期集训(分模块进阶)

csp信奥赛c++高频考点假期集训(分模块进阶) 课程简介: csp信奥赛C++高频考点集训课涵盖12大高频考点专题: 1、语法基础专题 2、数学思维专题 3、模拟算法专题 4、排序算法专题 5、贪心算法专题 6、二分算法专题 7、前缀和&差分 8、深度优先搜索 9、广度优先搜索 10、动态规划专题 11、栈和队列专题 12、树和图专题 csp信奥赛C++高频考点集训:视频简介 适合人群: 正在学习csp信奥赛的学生 准备参加csp信奥赛的学生 想通过csp信奥赛集训课提升解题方法和技巧的学生 想通过csp信奥赛集训课提升自身整体编码能力的学生 你将会学到: csp信奥赛C++12大高频考点专题,助力你冲刺csp一等奖 课程直通链接: https://edu.ZEEKLOG.net/course/

By Ne0inhk
华为OD机试双机位C卷:采购订单 (Py/Java/C/C++/Js/Go)

华为OD机试双机位C卷:采购订单 (Py/Java/C/C++/Js/Go)

采购订单 华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 100分题型 华为OD机试双机位c卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录|机考题库 + 算法考点详解 题目描述 在一个采购系统中,采购申请(PR)需要经过审批后才能生成采购订单(PO)。每个PR包含商品的单价(假设相同商品的单价一定是一样的)及数量信息。系统要求对商品进行分类处理:单价高于100元的商品需要单独处理,单价低于或等于100元的相同商品可以合并到同一采购订单PO中。针对单价低于100的小额订单,如果量大可以打折购买。 具体规则如下: 如果PR状态为"审批通过",则将其商品加入到PO中。如果PR的状态为"审批拒绝"或"待审批",则忽略改PR。 对于单价高于100元的商品,每个商品单独生成一条PO记录。对于单价低于100元的商品,将相同商品的数量合并到一条PO记录中。 如果商品单价<100且商品数量>=100,则单价打9折。 输入描述 第一行包含整数N,

By Ne0inhk
C++ 函数进阶之递归与尾递归优化

C++ 函数进阶之递归与尾递归优化

第31篇:C++ 函数进阶之递归与尾递归优化 一、学习目标与重点 * 掌握递归函数的定义、核心原理及适用场景 * 理解递归的“递推-回归”过程,能够独立编写正确的递归代码 * 识别递归的常见问题(栈溢出、重复计算)并掌握解决方案 * 了解尾递归的概念、优化原理及在C++中的实现方式 * 能够根据实际场景选择递归或迭代,提升代码效率 💡 核心重点:递归的终止条件设计、尾递归与普通递归的区别、栈溢出问题的规避 二、递归函数基础认知 2.1 什么是递归函数 递归函数是指在函数体内部直接或间接调用自身的函数,它是解决复杂问题的重要编程思想,核心是“分而治之”——将大问题拆解为结构相同的小问题,直到小问题可直接求解(终止条件),再逐步回归得到原问题的答案。 🗄️ 生活中的递归案例: * 俄罗斯套娃:大娃娃里套小娃娃,直到最小的娃娃(终止条件),再逐个打开回归 * 阶乘计算:n! = n × (n-1)!,直到 0! = 1(

By Ne0inhk