风力与太阳能发电波动预测与模型研究(2024认证杯D题)
2024年认证杯D题,问题一详细代码以及图像绘制,包括python和matlab
文章目录
数据形式
风电场数据集 W1:
数据内容:包含风速和功率输出的数据。
涡轮机数量:共有12台涡轮机。
额定功率:每台涡轮机的额定功率为2.x兆瓦(MW)。
风电场面积:风电场的面积为4x4平方公里。
数据时长:数据记录了一个月的时间,从2009年7月31日到2009年8月29日。
采样频率:数据的采样频率为1赫兹(Hz),意味着每秒钟记录一次数据。
数据来源:这些数据由德国不来梅的wpd windmanager GmbH公司提供。
太阳能数据集 S1:
数据内容:包含太阳辐射的数据。
传感器数量:共有11个传感器。
数据时长:数据记录了一个月的时间,从1993年6月1日到1993年6月30日。
采样频率:数据的采样频率同样为1赫兹(Hz),即每秒钟记录一次数据。
数据来源:这些数据是在德国奥尔登堡大学屋顶的一个平台上记录的。
模型假设
为了方便模型的建立与模型的可行性,我们这里首先对模型提出一些假设,使得模型更加完
备,预测的结果更加合理。
1、假设给出的数据均为真实数据,真实有效。
5、假设对于一些较为异常的数据的出现具有一定的合理性。
3、功率数据是稳定且连续的,假定研究对象中所使用的风力发电机的功率输出是连续的,
并且在时间序列数据中没有跳跃性变化。
4、数据中包含的所有涡轮机功率是独立的
5、时间戳数据的准确性,假定数据中的时间戳信息是准确的且按顺序排列。所有时间戳都
是以 Unix 时间戳形式给出,并且数据的时间间隔是一致的。这是时间序列分析的基本前提
条件。
数据清洗 (缺失值补齐以及异常值处理)
在原始数据中,Timestamp 列存储的是时间戳(即自 1970 年 1 月 1 日以来的秒数),通
常称为 POSIX 时间戳。为了更容易理解和操作这些时间戳,我们将其转换为 MATLAB 中的
datetime 类型。
公式: 时间傩转换公式为:
datetime = POSIX time + epoch
其中:
POSIX time 是自 1970 年 1 月 1 日以来的秒数;
epoch 是指 1970 年 1 月 1 日 00:00:00 UTC,这是 POSIX 时间的起点。
通过这个公式,时间戳数字会被转换成对应的日期时间格式。
在数据处理中,缺失值是一个常见问题,缺失值可能会影响模型的训练和分析结果。为了填
补这些缺失值,我们选择了线性插值方法。线性插值是指在数据序列中,缺失值被插补为其
前后两个值之间的线性平均值。MATLAB 的 fillmissing 函数可以实现这一操作。参数 ‘linear’
指定了插值方法为线性插值。此外,我们还指定了 ‘EndValues’,‘nearest’,这意味着对于数
据的起始和结束部分(即边缘处的缺失值),我们使用最近的有效值来填补。这是一种常用
的策略,因为边缘处的数据缺失可能无法进行有效的插值。
matlab代码
% 3. 处理缺失值:使用线性插值填补缺失值
data = fillmissing(data, 'linear', 'EndValues', 'nearest');
% 4. 识别并处理异常值(极端值)
% 这里我们使用基于IQR的方法来检测并处理异常值
% 对于每一列的功率数据(velocity1 到 velocity12)
for col = 2:13
% 计算Q1, Q3和IQR
col_data = data{:, col};
Q1 = prctile(col_data, 25);
Q3 = prctile(col_data, 75);
IQR = Q3 - Q1;
% 定义异常值的上下限
lower_bound = Q1 - 1.5 * IQR;
upper_bound = Q3 + 1.5 * IQR;
% 找到异常值并替换
outliers = (col_data < lower_bound) | (col_data > upper_bound);
data{outliers, col} = NaN; % 将异常值设置为NaN
end
% 5. 处理NaN值:使用线性插值填补异常值
data = fillmissing(data, 'linear', 'EndValues', 'nearest');
1.1 问题一(风电场功率预测)
图表一(功率随时间的变化)
两条曲线,蓝色线表示总功率随时间的变化,红色曲线表示过去三十分钟平均功率随时间的变化
直观呈现功率的时变特性与整体趋势,风电功率受风速、风向等自然因素的影响,具有显著的时间波动性和随机性。通过绘制实时功率曲线,可以直观地观察到风电场功率随时间的剧烈波动,包括功率峰值、低谷、以及功率输出的时段性变化。同时,过去30分钟的平均功率作为平滑后的参考曲线,清晰地揭示功率变化的整体趋势与周期性特征。
实时功率(蓝色线)反映了风电场在每个时间点的实际输出情况,但由于风速的短时波动,实时功率曲线呈现出较大起伏,难以直接用于分析整体趋势。
过去30分钟平均功率(红色线)通过移动平均法对功率数据进行平滑处理,能够有效减少随机波动的影响,突出短期内功率的平均水平。这种平滑处理不仅可以作为实时功率的基准值,还可以用于识别长期的功率变化趋势。
通过对两条曲线的比较,可以观察到实时功率相对于短期平均功率的偏离程度。较大的偏离往往意味着风电功率存在显著波动,而偏离较小则说明功率输出相对稳定。
图表二(波动强度随时间的变化)
波动强度k随时间的变化曲线
量化功率波动的剧烈程度
风电功率的波动性是风电并网面临的主要挑战之一,过大的波动可能影响电网的稳定运行。通过定义波动强度 𝑘,可以将实时功率与短期平均功率的偏离程度进行量化,从而揭示风电场在不同时间段的功率波动情况。波动强度越大,说明功率偏离短期平均值越多,波动越剧烈。
识别显著波动时刻
通过绘制波动强度 𝑘的时间分布,可以直观地识别出功率波动剧烈的时刻。例如,当 𝑘超过设定的阈值 𝑡 时,可以判断此时功率发生了显著变化。这对于风电场的运行监控具有重要意义,能够帮助运维人员及时采取措施,减少功率波动对电网的影响。
揭示功率波动的时间规律
从波动强度的时间分布图中,可以观察到功率波动的时段性特征。例如,波动强度可能在某些特定时段(如清晨或傍晚)较高,这可能与风速变化、风切变效应等因素相关。这种规律的揭示有助于深入理解风电功率波动的成因,并为后续的功率预测提供数据支持。
为预测显著变化提供依据
结合波动强度 𝑘的分布与阈值设定,可以进一步实现对显著功率变化的预测。例如,在代码中,通过提前5分钟或2分钟识别波动强度超过阈值的时刻,可以为风电场的控制系统提供预警,帮助电网调度中心提前应对功率的剧烈波动。
matlab代码
% 1. 加载数据
filename = 'Supplement_W1_power.txt';
opts = detectImportOptions(filename); % 自动检测数据格式
data = readtable(filename, opts); % 加载数据表格
% 2. 将 Timestamp 列的时间戳转换为 datetime 类型
data.Timestamp = datetime(data.Timestamp, 'ConvertFrom', 'posixtime');
% 3. 处理缺失值:使用线性插值填补缺失值
data = fillmissing(data, 'linear', 'EndValues', 'nearest');
% 4. 识别并处理异常值(极端值)
% 这里我们使用基于IQR的方法来检测并处理异常值
% 对于每一列的功率数据(velocity1 到 velocity12)
for col = 2:13
% 计算Q1, Q3和IQR
col_data = data{:, col};
Q1 = prctile(col_data, 25);
Q3 = prctile(col_data, 75);
IQR = Q3 - Q1;
% 定义异常值的上下限
lower_bound = Q1 - 1.5 * IQR;
upper_bound = Q3 + 1.5 * IQR;
% 找到异常值并替换
outliers = (col_data < lower_bound) | (col_data > upper_bound);
data{outliers, col} = NaN; % 将异常值设置为NaN
end
% 5. 处理NaN值:使用线性插值填补异常值
data = fillmissing(data, 'linear', 'EndValues', 'nearest');
% 6. 计算功率波动强度 k = |p - q| / q,其中 p 为当前功率,q 为过去30分钟的平均功率
% 假设风电场的功率数据是从第2列到第13列(velocity1到velocity12),
% 我们将计算每个时刻的总功率,以及过去30分钟的平均功率。
num_rows = height(data);
num_turbines = 12;
total_power = sum(data{:, 2:13}, 2); % 每个时刻的总功率
% 计算过去30分钟的平均功率
window_size = 30; % 过去30分钟
moving_avg_power = movmean(total_power, window_size);
% 计算波动强度 k
k = abs(total_power - moving_avg_power) ./ moving_avg_power;
% 7. 设定波动阈值 t
threshold_t = 0.1; % 可以调整阈值 t,控制波动的敏感度
% 8. 预测显著变化的时刻
% 对于减少波动,提前5分钟预测
% 对于增加波动,提前2分钟预测
significant_decrease = find(k > threshold_t); % 找到波动大于阈值的时刻
forecast_decrease = significant_decrease - 5; % 提前5分钟预测
significant_increase = find(k > threshold_t); % 找到波动大于阈值的时刻
forecast_increase = significant_increase - 2; % 提前2分钟预测
% 9. 打印并存储预测结果
fprintf('显著减少的时刻及预测(提前5分钟):\n');
disp(data.Timestamp(forecast_decrease));
fprintf('显著增加的时刻及预测(提前2分钟):\n');
disp(data.Timestamp(forecast_increase));
% 10. 可视化波动强度和功率变化
figure;
subplot(2,1,1);
plot(data.Timestamp, total_power, '-b');
hold on;
plot(data.Timestamp, moving_avg_power, '-r');
title('总功率与过去30分钟平均功率');
xlabel('时间');
ylabel('功率');
legend('总功率', '过去30分钟平均功率');
subplot(2,1,2);
plot(data.Timestamp, k, '-g');
title('波动强度 k');
xlabel('时间');
ylabel('波动强度');
波动阈值t设置为0.1,可以进行修改
预测展示(只展示部分数据)
1.2 问题一(太阳能辐照强度预测)
图表一(经纬度位置图)
python绘制
import geopandas as gpd
import matplotlib.pyplot as plt
from shapely.geometry import Point
# 经纬度数据
coordinates = {
'sensor_1': (53.1532754254192, 8.16414535045624),
'sensor_2': (53.1530566746515, 8.16568493843079),
'sensor_4': (53.152976251295, 8.16516995429993),
'sensor_5': (53.1527414142317, 8.16302955150604),
'sensor_6': (53.152487274045, 8.1664627790451),
'sensor_7': (53.1525001419387, 8.16336214542389),
'sensor_8': (53.1524293684755, 8.16433310508728),
'sensor_9': (53.1523843307564, 8.16504120826721),
'sensor_10': (53.1523135571024, 8.16601753234863),
'sensor_11': (53.1520787164146, 8.16337823867798),
'sensor_13': (53.1520465463573, 8.16548109054565)
}
# 提取所有的经纬度
latitudes = [lat for lat, lon in coordinates.values()]
longitudes = [lon for lat, lon in coordinates.values()]
# 计算经纬度范围
min_lat = min(latitudes)
max_lat = max(latitudes)
min_lon = min(longitudes)
max_lon = max(longitudes)
# 创建一个GeoDataFrame
points = [Point(lon, lat) for lat, lon in coordinates.values()]
gdf = gpd.GeoDataFrame(geometry=points)
# 获取地图数据
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
# 创建绘图
fig, ax = plt.subplots(figsize=(10, 10))
# 绘制背景地图
world.plot(ax=ax, color='lightgray')
# 绘制传感器位置
gdf.plot(ax=ax, color='red', markersize=50, label='Sensors')
# 添加标签
for label, (lat, lon) in coordinates.items():
ax.text(lon, lat, label, fontsize=9, ha='right', color='black')
# 设置地图显示的经纬度范围
ax.set_xlim(min_lon - 0.001, max_lon + 0.001) # 适当扩展范围,避免点太靠边
ax.set_ylim(min_lat - 0.001, max_lat + 0.001)
# 设置标题
plt.title("Sensor Locations on the Map")
plt.xlabel("Longitude")
plt.ylabel("Latitude")
plt.legend()
# 显示地图
plt.show()
import folium
# 经纬度数据
coordinates = {
'sensor_1': (53.1532754254192, 8.16414535045624),
'sensor_2': (53.1530566746515, 8.16568493843079),
'sensor_4': (53.152976251295, 8.16516995429993),
'sensor_5': (53.1527414142317, 8.16302955150604),
'sensor_6': (53.152487274045, 8.1664627790451),
'sensor_7': (53.1525001419387, 8.16336214542389),
'sensor_8': (53.1524293684755, 8.16433310508728),
'sensor_9': (53.1523843307564, 8.16504120826721),
'sensor_10': (53.1523135571024, 8.16601753234863),
'sensor_11': (53.1520787164146, 8.16337823867798),
'sensor_13': (53.1520465463573, 8.16548109054565)
}
# 创建地图对象,初始位置设为数据点的中心位置
m = folium.Map(location=[53.1525, 8.164], zoom_start=15, control_scale=True)
# 向地图中添加背景(OpenStreetMap或其他底图)
folium.TileLayer('openstreetmap').add_to(m) # OpenStreetMap 背景
# 或者使用其他底图,比如:
# folium.TileLayer('Stamen Terrain').add_to(m) # Stamen Terrain 背景
# folium.TileLayer('Stamen Toner').add_to(m) # Stamen Toner 背景
# folium.TileLayer('CartoDB positron').add_to(m) # CartoDB positron 背景
# 在地图上添加传感器点
for sensor, (lat, lon) in coordinates.items():
folium.Marker([lat, lon], popup=sensor).add_to(m)
# 保存地图到HTML文件
m.save("sensors_map_with_background.html")
# 显示提示信息
print("地图已保存为 'sensors_map_with_background.html',打开该文件查看交互式地图。")
matlab代码绘制
% 经纬度数据
coordinates = struct(...
'sensor_1', [53.1532754254192, 8.16414535045624], ...
'sensor_2', [53.1530566746515, 8.16568493843079], ...
'sensor_4', [53.152976251295, 8.16516995429993], ...
'sensor_5', [53.1527414142317, 8.16302955150604], ...
'sensor_6', [53.152487274045, 8.1664627790451], ...
'sensor_7', [53.1525001419387, 8.16336214542389], ...
'sensor_8', [53.1524293684755, 8.16433310508728], ...
'sensor_9', [53.1523843307564, 8.16504120826721], ...
'sensor_10', [53.1523135571024, 8.16601753234863], ...
'sensor_11', [53.1520787164146, 8.16337823867798], ...
'sensor_13', [53.1520465463573, 8.16548109054565]...
);
% 提取所有的经纬度
latitudes = cellfun(@(x) x(1), struct2cell(coordinates));
longitudes = cellfun(@(x) x(2), struct2cell(coordinates));
% 计算经纬度范围
min_lat = min(latitudes);
max_lat = max(latitudes);
min_lon = min(longitudes);
max_lon = max(longitudes);
% 创建地图
figure;
% 设置地图显示的经纬度范围
geoplot(latitudes, longitudes, 'ro', 'MarkerFaceColor', 'r');
geobasemap('streets'); % 使用 OpenStreetMap(streets)底图
% 添加标签
for i = 1:length(coordinates)
text(longitudes(i), latitudes(i), sprintf('sensor_%d', i), 'FontSize', 9, 'Color', 'black');
end
% 设置标题
title('Sensor Locations on the Map');
% 保存地图到文件
saveas(gcf, 'sensor_map.png');
% 显示提示信息
disp("地图已保存为 'sensor_map.png',打开该文件查看地图。");
图表二和图表三(各传感器辐射度分布直方图和时间序列图)
各传感器辐照度分布直方图,提供了一个直观的视觉表示,展示了各个传感器测量的辐照度数据在不同范围内的分布情况。直方图的多色柱状条使得比较不同传感器的测量结果变得简单,从而可以评估它们之间的一致性和差异性。这对于确保传感器网络的可靠性和准确性至关重要,尤其是在需要精确测量的领域,如太阳能发电系统的效率评估。
各传感器太阳辐照度时间序列图,展示了辐照度随时间变化的动态过程。这幅图为研究者提供了辐照度在一天中甚至更长时间内的变化趋势,包括日变化、周期性波动以及可能的突发事件。通过观察这些时间序列,可以分析环境因素,如天气变化,对辐照度测量的影响,这对于理解数据背后的物理过程和提高太阳能预测模型的准确性具有重要意义。此外,时间序列图还有助于识别数据中的缺失值或记录错误,这些可能需要在进一步分析之前进行处理,以确保数据的完整性和分析结果的有效性。
% 1. 读取数据
file_path = 'S1.txt'; % 文件路径
% 尝试自动检测文件的导入选项
opts = detectImportOptions(file_path);
% 读取数据,避免指定具体格式
data = readtable(file_path, opts);
% 2. 确保时间戳列是数字并转换为 datetime 类型
data.timestamp = datetime(data.timestamp, 'ConvertFrom', 'posixtime');
% 3. 输出描述性统计
desc_stats = summary(data);
disp('描述性统计数据:');
disp(desc_stats);
% 4. 时间序列图
figure;
hold on;
for i = 2:width(data)
plot(data.timestamp, data{:, i}, 'DisplayName', data.Properties.VariableNames{i});
end
title('各传感器太阳辐照度时间序列图');
xlabel('时间');
ylabel('辐照度');
legend('show');
xtickangle(45);
hold off;
% 5. 绘制辐照度分布直方图
figure;
hold on;
for i = 2:width(data)
histogram(data{:, i}, 30, 'FaceAlpha', 0.5, 'DisplayName', data.Properties.VariableNames{i});
end
title('各传感器辐照度分布直方图');
xlabel('辐照度');
ylabel('频率');
legend('show');
hold off;
图表四和图表五(以sensor_1为例进行分析)
辐照度波动幅度随时间的变化曲线,设置了波动阈值
这张图表,用于分析和理解传感器1(sensor_1)在1993年6月1日至7月1日期间辐照度波动的情况。通过这张图表,我们可以观察到辐照度波动幅度的时间序列,这对于评估太阳能系统的稳定性和预测其性能至关重要。
首先,图表的横轴(X轴)记录了时间序列,从6月1日开始,一直持续到7月1日,为我们提供了一个连续的时间段来观察辐照度的变化。这种时间序列的展示方式使得我们能够识别出辐照度波动的任何周期性模式或趋势,这对于太阳能发电系统的调度和优化至关重要。
其次,纵轴(Y轴)表示的是波动幅度,这是通过计算辐照度与其过去30分钟滚动平均值之间的差异,并将其标准化为滚动平均值的比率得到的。这种标准化的波动幅度可以更准确地反映辐照度的相对变化,而不是绝对变化,这对于比较不同时间段或不同传感器的数据非常有用。
图表中的红色线条代表了sensor_1的波动幅度,它直观地展示了辐照度在每个时间点的波动情况。通过观察这些波动,我们可以识别出哪些时间段的辐照度波动较大,这可能是由于天气变化、云层遮挡或其他环境因素引起的。这些信息对于理解和预测太阳能资源的可用性至关重要。
此外,图表中的蓝色虚线表示了波动阈值,这是一个预先设定的基准,用于判断波动是否显著。当红色线条超过蓝色虚线时,这表明在那个特定的时间点,辐照度的波动超出了正常范围,可能需要进一步的调查或采取措施来应对。这种显著波动的识别对于异常事件的检测和响应非常关键。
通过这张图表,我们还可以进行数据质量的评估。如果发现某些时间段的波动异常高或异常低,这可能表明数据收集过程中存在问题,如传感器故障或数据记录错误。及时识别和解决这些问题对于确保数据的准确性和可靠性至关重要。
显著波动标记与时间的图像
这张图由两个子图组成,分别展示了sensor_1(传感器1)在1993年6月1日至7月1日期间的显著波动标记和辐照度数据,以及这些数据中显著波动点的详细情况。
首先,上图是一个时间序列图,显示了sensor_1在整个时间段内的显著波动标记。图中的绿色线条代表了显著波动的时间点,其中纵轴表示显著波动的标记,值为1表示在该时间点发生了显著波动。这个子图的作用是提供一个快速的视觉参考,帮助我们识别在整个观察期间哪些时间段内传感器记录到了显著的辐照度变化。这种显著波动可能由多种因素引起,包括天气变化、云层移动或其他环境因素。通过这个子图,我们可以迅速定位到可能需要进一步分析的时间段。
其次,下图是一个散点图,它展示了sensor_1在同一时间段内的辐照度变化。蓝色点表示常规的辐照度数据,而红色点则突出显示了那些被标记为显著波动的数据点。这个子图提供了辐照度数据的更详细视图,允许我们观察辐照度的实际变化,并识别出那些显著波动点与正常数据点之间的差异。这种可视化有助于我们理解辐照度的波动模式,以及这些波动如何与环境条件或其他因素相关联。
python代码编写
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# 读取数据
file_path = 'supplement_S1.txt'
data = pd.read_csv(file_path, sep='\s+', header=0, dtype={'timestamp': 'float64'}, low_memory=False)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用SimHei字体
plt.rcParams['axes.unicode_minus'] = False # 正确显示负号
# 确保时间戳列是数字并转换为 datetime 类型
data['timestamp'] = pd.to_datetime(data['timestamp'], unit='s', errors='coerce')
# 描述性统计分析
desc_stats = data.describe()
print("描述性统计数据:")
print(desc_stats)
# 计算过去30分钟的平均发电量并计算波动幅度
window_size = 30 # 过去30分钟的窗口
t = 0.5 # 设置波动幅度阈值t
for sensor in ['sensor_1', 'sensor_2', 'sensor_4', 'sensor_5', 'sensor_6']:
data[f'{sensor}_rolling_avg'] = data[sensor].rolling(window=window_size).mean()
data[f'{sensor}_fluctuation'] = abs(data[sensor] - data[f'{sensor}_rolling_avg']) / data[f'{sensor}_rolling_avg']
data[f'{sensor}_significant_change'] = np.where(data[f'{sensor}_fluctuation'] > t, 1, 0)
# 绘制波动幅度的时间序列图(单独显示)
plt.figure(figsize=(12, 4))
plt.plot(data['timestamp'], data['sensor_1_fluctuation'], label='sensor_1 波动幅度', color='r')
plt.axhline(y=t, color='b', linestyle='--', label='波动阈值')
plt.title('sensor_1 辐照度波动幅度')
plt.xlabel('时间')
plt.ylabel('波动幅度')
plt.xticks(rotation=45)
plt.legend(loc='upper right') # 指定图例位置
plt.tight_layout()
plt.show()
# 创建一个新的图形窗口用于显示第二个和第三个图表
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8))
# 绘制显著波动标记(第二个图表)
ax1.plot(data['timestamp'], data['sensor_1_significant_change'], label='sensor_1 显著波动', color='g')
ax1.set_title('sensor_1 显著波动标记')
ax1.set_xlabel('时间')
ax1.set_ylabel('显著波动')
ax1.legend(loc='upper right') # 指定图例位置
# 绘制显著波动的散点图(第三个图表)
ax2.scatter(data['timestamp'], data['sensor_1'], color='blue', label='sensor_1 辐照度', s=10)
ax2.scatter(data['timestamp'][data['sensor_1_significant_change'] == 1], data['sensor_1'][data['sensor_1_significant_change'] == 1], color='red', label='显著波动点', zorder=5)
ax2.set_title('sensor_1 辐照度及显著波动点')
ax2.set_xlabel('时间')
ax2.set_ylabel('辐照度')
ax2.legend(loc='upper right') # 指定图例位置
plt.tight_layout()
plt.show()
# 计算显著波动发生的时刻并进行预测
for sensor in ['sensor_1', 'sensor_2', 'sensor_4', 'sensor_5', 'sensor_6']:
data[f'{sensor}_predicted_change'] = data[f'{sensor}_significant_change'].shift(-1)
significant_changes = data[data[f'{sensor}_predicted_change'] == 1]
print(f"\n{sensor} 显著波动预测时刻:")
print(significant_changes[['timestamp', f'{sensor}_fluctuation']])
波动幅度 t = 0.5;窗口是30分钟;
预测展示(预测显著波动发生前的5分钟或2分钟)
图表六(各传感器辐照度箱线图)
从箱型图中可以看到大多数数据点集中在 Q1 和 Q3 之间,即大部分数据处于中间 50%范围内,这表明数据总体分布较为集中,波动较小。箱体的长度(IQR)较短,表明数据的波动性较低。中位数的横线位置可以帮助我们了解数据的偏态。如果中位数接近箱体的上边界,意味着数据分布偏向较大的值。如果接近下边界,则表示数据偏向较小的值。通过这个箱型图,中位数的位置能够告诉我们该功率数据的整体水平和分布趋势。
python代码绘制
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# 读取数据
file_path = 'supplement_S1.txt'
data = pd.read_csv(file_path, sep='\s+', header=0, dtype={'timestamp': 'float64'}, low_memory=False)
# 设置字体和负号显示
plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用SimHei字体
plt.rcParams['axes.unicode_minus'] = False # 正确显示负号
# 确保时间戳列是数字并转换为 datetime 类型
data['timestamp'] = pd.to_datetime(data['timestamp'], unit='s', errors='coerce')
# 更新传感器列表以包含所有传感器
sensors = ['sensor_1', 'sensor_2', 'sensor_4', 'sensor_5', 'sensor_6', 'sensor_7', 'sensor_8', 'sensor_9', 'sensor_10', 'sensor_11', 'sensor_13']
# 将数据转换为长格式
data_long = data.melt(id_vars='timestamp', value_vars=sensors, var_name='sensor', value_name='irradiance')
# 绘制箱线图
plt.figure(figsize=(14, 10)) # 根据传感器数量调整图形窗口大小
sns.boxplot(x='sensor', y='irradiance', data=data_long, palette='Set3') # 使用预设的调色板
plt.title('各传感器辐照度分布箱线图') # 设置标题
plt.ylabel('辐照度') # 设置Y轴标签
plt.xticks(rotation=45) # 旋转X轴标签,便于阅读
plt.tight_layout() # 调整子图间距
plt.show() # 显示图形

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)