IoT-For-Beginners 生长度日(GDD)可视化实战:基于 Jupyter Notebook 的温度数据分析
IoT-For-Beginners 生长度日GDD可视化实战基于 Jupyter Notebook 的温度数据分析【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners本文围绕 IoT-For-Beginners 课程农场模块第一课《Predict plant growth with IoT》的课后作业展开完整讲解如何将 IoT 温度传感器采集的数据通过 Jupyter Notebook 完成温度曲线可视化与生长度日Growing Degree Days, GDD计算。读完本文你将掌握从 MQTT 服务器落盘temperature.csv、搭建 Jupyter 分析环境、到按天聚合温度并计算 GDD 的完整实操链路。作业背景为什么要用 Notebook 分析 GDD在前序课程中你已经通过 IoT 设备Wio Terminal、Raspberry Pi 或虚拟设备配合温度传感器采集环境温度并通过 MQTT 将遥测数据发布到test.mosquitto.org这类公共代理。服务器端代码订阅遥测主题后将每条消息追加写入 CSV 文件。这一流程的完整代码位于 2-farm/lessons/1-predict-plant-growth/code-server/temperature-sensor-server/app.py。GDD 的计算需要至少一整天的最高温和最低温因此可靠的数据必须连续采集数天。而 Jupyter Notebook 将说明文字与可执行代码组织在称为cell单元格的区块中非常适合逐步完成「读取 CSV → 绘制温度曲线 → 按天聚合 → 计算 GDD」的分析过程。本作业提供的 notebook 位于 2-farm/lessons/1-predict-plant-growth/code-notebook/gdd.ipynb你可以逐格运行也可以直接修改代码——例如调整用于你目标作物的基准温度base_temperature。前置条件确保服务器持续运行要获得连续的 GDD 数据必须保证服务器代码在 IoT 设备活跃的整个时间段内持续运行。有两条途径修改电源管理设置让运行服务器代码的电脑不会在空闲时休眠例如禁用系统自动睡眠运行保活脚本使用如keep-system-active之类的 Python 保活脚本周期性模拟输入以阻止系统进入睡眠。在数据采集阶段需要注意若使用虚拟 IoT 设备建议在 CounterFit 应用中勾选温度传感器的Random复选框并设置合理范围Min/Max避免每次读取都返回相同数值、导致最高温与最低温失真。相关设置说明可参见 2-farm/lessons/1-predict-plant-growth/virtual-device-temp.md。服务器代码如何生成 temperature.csv理解 Notebook 分析的数据来源很有必要。服务器端temperature-sensor-server/app.py的关键逻辑如下from os import path import csv from datetime import datetime temperature_file_name temperature.csv fieldnames [date, temperature] if not path.exists(temperature_file_name): with open(temperature_file_name, modew) as csv_file: writer csv.DictWriter(csv_file, fieldnamesfieldnames) writer.writeheader() def handle_telemetry(client, userdata, message): payload json.loads(message.payload.decode()) with open(temperature_file_name, modea) as temperature_file: temperature_writer csv.DictWriter(temperature_file, fieldnamesfieldnames) temperature_writer.writerow({date : datetime.now().astimezone().replace(microsecond0).isoformat(), temperature : payload[temperature]})这段代码完成了三件事初始化 CSV 结构定义文件名temperature.csv与列头date,temperature若文件不存在则创建并写入表头订阅遥测主题mqtt_client.subscribe(client_telemetry_topic)其中主题名为id /telemetry追加写入数据handle_telemetry回调中将当前时间ISO 8601 格式、带时区、不含微秒与消息中的temperature作为一行追加到文件末尾。最终的 CSV 内容形如date,temperature 2021-04-19T17:21:36-07:00,25 2021-04-19T17:31:36-07:00,24 2021-04-19T17:41:36-07:00,25该文件包含两列date服务器收到消息的时刻与temperature来自遥测消息的温度值。temperature.csv就是 Notebook 分析的输入数据也是本作业后续所有步骤的基础。环境搭建创建 gdd-calculation 项目按照作业要求按以下步骤准备分析环境1. 创建项目文件夹mkdir gdd-calculation2. 获取 Notebook 与数据将 2-farm/lessons/1-predict-plant-growth/code-notebook/gdd.ipynb 下载并复制到gdd-calculation文件夹将 MQTT 服务器生成的temperature.csv复制到同一文件夹——Notebook 使用相对路径读取该文件二者必须同目录。3. 创建 Python 虚拟环境python -m venv .venv4. 安装依赖包pip install --upgrade pip pip install pandas pip install matplotlib pip install jupyter各依赖的作用包名用途pandas读取 CSV、将时间字符串解析为日期、按天分组聚合matplotlib绘制温度随时间变化的曲线图jupyter提供 Notebook 运行环境在浏览器中交互式执行5. 启动 Notebookjupyter notebook gdd.ipynbJupyter 启动后会打开默认浏览器并加载gdd.ipynb。作业配套的运行效果截图如下Notebook 逐步解析从 CSV 到 GDDgdd.ipynbnbformat 4Python 3 内核由若干 markdown 说明格与 Python 代码格组成。下面按执行顺序拆解每个代码格的作用。1. 设置基准温度Notebook 首先要求设置作物的基准温度base temperature即该作物开始生长的最低日平均温度base_temperature 10修改这个值即可适配不同作物。课程 README 中给出了一个标准示例玉米的基准温度为 10°C不同品种需要 800~2700 个 GDD 才能成熟见 2-farm/lessons/1-predict-plant-growth/README.md。2. 加载 CSV 数据import pandas as pd import matplotlib.pyplot as plt # Read the temperature CSV file df pd.read_csv(temperature.csv)pd.read_csv将temperature.csv读入 DataFrame。此时date仍是字符串temperature为数值。3. 绘制温度曲线plt.figure(figsize(20, 10)) plt.plot(df[date], df[temperature]) plt.xticks(rotationvertical);这段代码以日期为横轴、温度为纵轴绘制完整时间序列曲线figsize(20, 10)放大画布、rotationvertical让日期刻度竖直排列避免密集时间戳互相重叠。可视化能让你直观检查数据是否连续、是否有异常值。4. 按天聚合最高温与最低温GDD 计算需要的是每天的 T_max 与 T_min因此要将逐条记录按日期分组# Convert datetimes to pure dates so we can group by the date df[date] pd.to_datetime(df[date]).dt.date # Group the data by date so it can be analyzed by date data_by_date df.groupby(date) # Get the minimum and maximum temperatures for each date min_by_date data_by_date.min() max_by_date data_by_date.max() # Join the min and max temperatures into one dataframe and flatten it min_max_by_date min_by_date.join(max_by_date, ondate, lsuffix_min, rsuffix_max) min_max_by_date min_max_by_date.reset_index()关键点在于pd.to_datetime(df[date]).dt.date先把带时分秒的时间戳截断为纯日期才能正确按天groupby。随后分别对每天取min()与max()再通过join合并成一张同时含temperature_min与temperature_max的表。5. 计算 GDDGDD 使用课程中给出的简化公式GDD (T_max T_min) / 2 − T_base即「当日平均温度减去作物基准温度」。Notebook 中通过函数逐行计算def calculate_gdd(row): return ((row[temperature_max] row[temperature_min]) / 2) - base_temperature # Calculate the GDD for each row min_max_by_date[gdd] min_max_by_date.apply(lambda row: calculate_gdd(row), axis1) # Print the results print(min_max_by_date[[date, gdd]].to_string(indexFalse))apply(..., axis1)按行调用calculate_gdd把计算结果写入新列gdd最后打印每日date与gdd的对照表。一个手算核对示例课程 README 给出了草莓的手算示例可用于核对 Notebook 输出是否正确草莓基准温度 10°C当日最高温 25°C最低温 12°C25 12 3737 / 2 18.518.5 − 10 8.5 GDD。草莓约需 250 个 GDD 才能结果因此 8.5 GDD 表明距离成熟仍有相当距离。用同样数据手工验证 Notebook 的结果是确认分析正确性的好习惯。数据采集的质量要求与评分标准本作业的评估围绕两个维度展开数据质量直接决定 GDD 计算的可靠程度标准优秀合格待改进数据采集至少 2 个完整天的数据至少 1 个完整天的数据只采集到部分数据GDD 计算成功运行 Notebook 并计算出 GDD成功运行 Notebook无法运行 Notebook要点提醒完整天意味着服务器从当天第一次温度记录一直运行到次日同一时刻期间不能中断、电脑不能休眠只有覆盖了日间与夜间完整温度波动最高温、最低温都出现的数据min()与max()才有意义如果只采集了几个小时的片段计算出的「日最高/最低温」会严重偏低GDD 也会失真。进一步探索服务器端完整实现2-farm/lessons/1-predict-plant-growth/code-server/temperature-sensor-server/app.pyNotebook 源码含全部 markdown 说明格2-farm/lessons/1-predict-plant-growth/code-notebook/gdd.ipynb温度发布端示例虚拟设备每 10 分钟发布一条遥测2-farm/lessons/1-predict-plant-growth/code-publish-temperature/virtual-device/temperature-sensor/app.py课程完整背景数字农业、温度与作物生长、GDD 定义与公式2-farm/lessons/1-predict-plant-growth/README.mdMQTT 遥测接收的通用步骤可回看 1-getting-started/lessons/4-connect-internet/README.md挑战延伸作物生长除了热量还需要水、光照、养分等条件思考这些因素分别可以用什么传感器测量、用什么执行器控制以及如何组合一个或多个 IoT 设备来优化植物生长——这正是数字农业中「测量—分析—响应」闭环的实践方向。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考