5分钟完全掌握Cursor Pro功能永久激活的深度解析指南
2026/6/11 20:14:08
ggplot2、dplyr、tidyr和zoo)为处理时间序列数据、空间信息及多变量分析提供了灵活支持,特别适用于长期环境监测数据的趋势识别与建模。| 应用方向 | 常用R包 | 分析目标 |
|---|---|---|
| 空气质量趋势分析 | openair,lubridate | 识别PM2.5季节性波动与长期变化趋势 |
| 水质动态监测 | data.table,ggplot2 | 检测关键参数(如pH、溶解氧)异常变化 |
# 加载必要库 library(ggplot2) library(lubridate) # 模拟环境监测数据(日期与PM2.5浓度) set.seed(123) data <- data.frame( date = seq(as.Date("2020-01-01"), as.Date("2022-12-31"), by = "day"), pm25 = runif(1096, min = 15, max = 85) ) # 绘制趋势图 ggplot(data, aes(x = date, y = pm25)) + geom_line(color = "steelblue") + labs(title = "PM2.5 浓度时间序列趋势", x = "日期", y = "PM2.5 (μg/m³)") + theme_minimal()该代码段演示了如何使用R构建基础环境变量时间序列图,通过geom_line()呈现连续变化趋势,为后续趋势检验(如Mann-Kendall检验)奠定可视化基础。import pandas as pd data = pd.read_csv('sensor_data.csv', parse_dates=['timestamp'], index_col='timestamp')该代码将 timestamp 列解析为 datetime 类型,并设为索引,便于后续按时间切片操作。from scipy.stats import zscore data['z_score'] = data['temperature'].rolling(window=60).apply(zscore) data_clean = data[abs(data['z_score']) < 3]滚动窗口增强了对动态环境的适应性,避免全局统计量导致的误判。import pandas as pd missing_ratio = df.isnull().sum() / len(df) print(missing_ratio[missing_ratio > 0])该代码计算每列缺失占比,便于决策是否保留或填充。若缺失率低于5%,通常建议使用前向填充或插值法;高于30%则考虑剔除字段。from statsmodels.tsa.seasonal import seasonal_decompose import pandas as pd # 假设data是按月索引的时间序列 result = seasonal_decompose(data, model='additive', period=12) result.plot()该代码调用seasonal_decompose函数执行经典分解,其中model='additive'表示使用加法模型,period=12指定年度周期。输出包含趋势、季节性和残差三部分,便于可视化分析各成分贡献。library(ggplot2) ggplot(env_data, aes(x = timestamp, y = temperature)) + geom_line(color = "blue", linetype = "solid", size = 1) + labs(title = "Temperature Variation Over Time", x = "Time", y = "Temperature (°C)")上述代码中,`aes()` 定义了坐标轴映射,`color` 控制线条颜色,`size` 调整线宽,提升可读性。import pandas as pd from statsmodels.tsa.stattools import adfuller # ADF检验示例 def check_stationarity(series, significance_level=0.05): result = adfuller(series) p_value = result[1] if p_value < significance_level: print("序列平稳 (p = {:.4f})".format(p_value)) else: print("序列非平稳 (p = {:.4f})".format(p_value))该代码调用`adfuller`函数执行ADF检验,返回统计量与p值。当p值低于设定显著性水平时,判定序列平稳。典型预处理流程先进行对数变换缓解异方差,再应用一阶差分消除趋势,最后通过ADF验证结果。from scipy.stats import kendalltau import numpy as np def mann_kendall_test(x): n = len(x) s = 0 for i in range(n): for j in range(i+1, n): s += np.sign(x[j] - x[i]) return s上述代码计算Mann-Kendall统计量S。嵌套循环遍历所有时间点对,np.sign()函数判断差值方向,累加后反映整体趋势强度。# Python示例:计算Sen's斜率 from scipy import stats import numpy as np def sen_slope(x, y): n = len(y) slopes = [] for i in range(n): for j in range(i+1, n): if x[j] != x[i]: slope = (y[j] - y[i]) / (x[j] - x[i]) slopes.append(slope) return np.median(slopes) # 示例数据:年份与气温 years = np.arange(2000, 2020) temps = [0.1, 0.3, 0.4, 0.2, 0.5, 0.7, 0.6, 0.8, 1.0, 0.9, 1.1, 1.3, 1.2, 1.4, 1.6, 1.5, 1.7, 1.9, 1.8, 2.0] trend = sen_slope(years, temps) print(f"Sen's斜率: {trend:.3f}")该代码遍历所有点对,计算斜率并取中位数。结果表明气温每十年上升约0.1°C,有效抑制了年际波动的影响。EnvStats包实现:library(EnvStats) result <- seasonalKendallTest( formula = concentration ~ time | season, data = multi_site_data, group.by = "site_id" )上述代码中,formula指定响应变量与时间及季节分组的关系,group.by参数按站点ID分组计算。返回结果包含各站点的Z值、p值及Sen斜率估计,可用于后续空间可视化与显著性聚合分析。import numpy as np from scipy.stats import tiecorrect, rankdata def pettitt_test(x): n = len(x) k = np.arange(n) U = np.zeros(n) for t in range(n): U[t] = np.sum(np.sign(x[t] - x[:t])) K = np.max(np.abs(U)) p_value = 2 * np.exp(-(K**2) / (n**3 + n**2)) return K, p_value, np.argmax(np.abs(U))该函数返回最大检验统计量、p值及突变位置索引。其中,U[t]表示第t时刻前后子序列的秩差异累积值,突变年份对应最大绝对值的位置。import mgwr.gwr as gwr model = gwr.GWR(coords, y, X, bw=150, kernel='bisquare') results = model.fit() print(results.localR2)上述代码使用`mgwr`库执行GWR,其中`bw`为带宽,控制邻域范围;`kernel`定义空间权重衰减方式。输出的`localR2`反映各位置拟合优度的空间差异。自回归积分滑动平均模型(ARIMA)适用于非平稳时间序列的趋势预测。其核心参数包括(p,d,q),分别代表自回归阶数、差分次数和移动平均阶数。
from statsmodels.tsa.arima.model import ARIMA model = ARIMA(series, order=(1, 1, 1)) fitted_model = model.fit() print(fitted_model.summary())上述代码中,order=(1,1,1)表示使用一阶自回归、一次差分和一阶移动平均。模型通过最大似然估计拟合参数,适用于捕捉线性趋势与短期波动。
相比ARIMA,结构模型如BSM(Basic Structural Model)能更直观地建模长期趋势演化,尤其适合政策评估与归因分析场景。
from sklearn.decomposition import PCA import numpy as np # 标准化输入数据 X = (data - np.mean(data, axis=0)) / np.std(data, axis=0) pca = PCA(n_components=2) components = pca.fit_transform(X) print("解释方差比:", pca.explained_variance_ratio_)上述代码执行PCA变换,n_components=2表示保留前两个主成分,explained_variance_ratio_反映各成分对总体方差的贡献度。import pandas as pd from scipy import stats def clean_sensor_data(df): # 去除重复值 df = df.drop_duplicates() # Z-score 异常检测 z_scores = stats.zscore(df[['pm25', 'temperature']]) abs_z_scores = abs(z_scores) filtered_entries = (abs_z_scores < 3).all(axis=1) return df[filtered_entries]| 指标 | 正常范围 | 预警阈值 | 响应动作 |
|---|---|---|---|
| PM2.5 | 0–35 μg/m³ | >75 μg/m³ | 短信通知 + 日志记录 |
| 温度 | 15–30°C | <10 或 >40°C | 邮件告警 + 工单生成 |