LightningChart Python是知名图表控件公司LightningChart Ltd正在研发的 Python 图表,目前还未正式推出,感兴趣的朋友可以戳下方链接申请试用!
什么是结构健康监测 (SHM)?
结构健康监测 (SHM) 是指实施结构损伤检测策略的过程,SHM 涉及使用传感器和数据采集系统来收集有关结构随时间变化的状况的信息,然后分析这些数据以识别可能表明损坏或退化的任何变化或异常。
土木工程如何使用结构健康监测系统?
在土木工程中,SHM 系统监测各种类型的基础设施,包括桥梁、建筑物、水坝和隧道。这些系统使用一系列传感器(例如加速度计、应变计和温度传感器)来测量振动、变形和环境条件等参数,收集的数据可帮助工程师评估结构完整性并就维护和维修做出明智的决策。
为什么监测结构健康很重要?
监测结构健康状况至关重要,原因如下:
- 安全:通过检测潜在的结构故障,确保居住者和用户的安全。
- 成本效益维护:有助于有效规划维护活动,减少与意外维修相关的成本。
- 寿命延长:在问题变得严重之前进行处理,从而延长结构的使用寿命。
- 法规遵从性:协助遵守安全法规和标准。
什么是结构传感器?在SHM中的作用是什么?
结构传感器是用于测量与建筑物或基础设施结构完整性相关的物理量的设备,这些传感器通过提供应变、温度和加速度等参数的实时数据,在 SHM 中发挥着至关重要的作用。这些传感器收集的信息对于结构的综合矩阵分析至关重要,可以对建筑物完整性进行全面评估。
LightningChart Python
LightningChart Python 是一个强大的数据可视化工具,特别适用于结构完整性分析项目。其先进的图表功能使其非常适合显示来自结构健康监测(SHM)系统的实时数据,能够提供清晰且有洞察力的结构健康指标可视化表示。
功能和图表类型
LightningChart Python 提供了各种增强数据可视化的功能:
- 高性能:可以以最小的延迟呈现数百万个数据点。
- 自定义:为轴、系列和图表外观提供广泛的自定义选项。
- 实时数据更新:支持可视化的动态更新,使其成为实时监控的理想选择。
性能特点
LightningChart Python 针对性能进行了优化,即使处理大型数据集也能确保流畅且响应迅速的可视化。这使其适用于实时地震监测应用,其中及时的数据表示至关重要。
设置Python环境
要为该项目设置 Python 环境,您需要安装 Python 和必要的库。这包括安装 LightningChart Python 和 Pandas。您还可以在此处找到整个GitHub项目。以下是快速设置指南:
- 安装 Python:从官方网站下载并安装最新版本的 Python。
- 安装库:使用 pip 安装所需的库:pip install lightningchart pandas
所用库的概述
- LightningChart Python:用于创建高性能图表。
- Pandas:数据操作和分析的必备工具。
设置开发环境
通过创建新的项目目录并安装所需的库来设置您的开发环境,确保 LightningChart Python 已获得正确的许可和配置。
加载和处理数据
本项目中使用的数据来自Kumar Anjney和Koushik Roy提供的“实验剪切建筑模型的加速度时程数据”数据集,该数据集包含来自六层三维剪切建筑微型模型(比例为1:20)的动态楼层响应数据。
数据集包括“Damaged”和“Undamaged”文件夹,每个文件夹包含大约 20 个包含数据的 Excel 文件。然而,在调查这些文件时,发现它们之间的数据非常相似。
这表明同类型的测试可能进行了多次,由于缺少来自数据集来源的额外背景信息,我们在本项目中选择仅可视化“Damaged”文件夹中的第一个文件,以代表整个数据集。然而,数据访问、处理以及“Undamaged”数据的可视化内容已包含在notebook文件中。实验中使用的模型建筑图片如下:
了解剪力建筑
剪力建筑指的是主要依靠剪力墙支撑的结构,剪力墙是通过剪切和弯曲强度来抵抗横向力(如风力或地震力)的垂直构件。这些墙对于保持建筑物的稳定性和完整性至关重要,尤其是在高层建筑中。剪力建筑旨在有效地管理这些力,确保结构在动态荷载下不会发生显著变形。
本项目使用的数据集采用六层剪切建筑模型,每层建筑都有一个加速度计(传感器),共六个加速度计。这些传感器测量动态楼层响应,这对于评估建筑物的结构完整性至关重要。
加载数据文件
使用Pandas将数据文件读入DataFrame,以便于操作和分析。
import pandas as pd
# Define the path to the Excel file containing the data
dataPath = 'DmgData17thSept/SB17SEPDMR1.xlsx'
# Read the Excel file into a DataFrame using pandas
dmgData = pd.read_excel(dataPath)
# Display the first five rows of the DataFrame to get a quick look at the data
dmgData.head()
基本数据处理技术
清理并预处理数据以确保其可以进行分析。
# Drop rows with any missing values from the DataFrame
dmgDataCleaned = dmgData.dropna()
# Rename the columns of the DataFrame for better readability
dmgDataCleaned.columns = ['Time', 'Acceleration1', 'Acceleration2', 'Acceleration3', 'Acceleration4', 'Acceleration5', 'Acceleration6']
# Convert all values in the DataFrame to numeric type (if they are not already)
dmgDataCleaned.apply(pd.to_numeric)
# Display the first ten rows of the cleaned DataFrame to inspect the data
dmgDataCleaned.head(10)
使用 LightningChart Python 可视化数据
我们将使用 LightningChart Python 创建加速度数据的波形图。下面是正在创建仪表板的notebook文件中的两个代码单元格。
import lightningchart as lc
lc.set_license("LICENSE-KEY")
# Create a dashboard object with a specified number of columns and rows, and a light theme
dashboard = lc.Dashboard(columns=2, rows=1, theme=lc.Themes.Light)
# Opens and initializes dashboard before adding the data in the cell below, hence the live=True
dashboard.open(live=True)
# Extract the time and acceleration data from the DataFrame
time = dmgDataCleaned['Time'].tolist()
time = [x * 1000 for x in time] # Convert time to milliseconds
# Extract acceleration data for each sensor and convert to lists
acceleration1 = dmgDataCleaned['Acceleration1'].tolist()
acceleration2 = dmgDataCleaned['Acceleration2'].tolist()
acceleration3 = dmgDataCleaned['Acceleration3'].tolist()
acceleration4 = dmgDataCleaned['Acceleration4'].tolist()
acceleration5 = dmgDataCleaned['Acceleration5'].tolist()
acceleration6 = dmgDataCleaned['Acceleration6'].tolist()
# Grouped chart (overlay of all sensors' data)
chart1 = dashboard.ChartXY(column_index=0, row_index=0)
chart1.set_title('Damaged Acceleration Data - Sensors Overlaid')
chart1.get_default_x_axis().set_title('Time').set_tick_strategy('DateTime', 1600342203000)
chart1.get_default_y_axis().set_title('m/s²')
# Add line series for each sensor to the grouped chart
series_1 = chart1.add_line_series().append_samples(x_values=time, y_values=acceleration1)
series_1.set_name('Sensor 1')
series_2 = chart1.add_line_series().append_samples(x_values=time, y_values=acceleration2)
series_2.set_name('Sensor 2')
series_3 = chart1.add_line_series().append_samples(x_values=time, y_values=acceleration3)
series_3.set_name('Sensor 3')
series_4 = chart1.add_line_series().append_samples(x_values=time, y_values=acceleration4)
series_4.set_name('Sensor 4')
series_5 = chart1.add_line_series().append_samples(x_values=time, y_values=acceleration5)
series_5.set_name('Sensor 5')
series_6 = chart1.add_line_series().append_samples(x_values=time, y_values=acceleration6)
series_6.set_name('Sensor 6')
# Set the line thickness for each series in the grouped chart
for series in [series_1, series_2, series_3, series_4, series_5, series_6]:
series.set_line_thickness(2)
# Add a legend to the grouped chart
chart1.add_legend(data=chart1)
# Stacked Chart (each sensor's data on a separate Y-axis)
chart2 = dashboard.ChartXY(column_index=1, row_index=0)
chart2.set_title('Damaged Acceleration Data - Sensors Stacked')
chart2.get_default_x_axis().set_title('Time').set_tick_strategy('DateTime', 1600342203000)
# Remove the default Y-axis since we will add custom Y-axes for each series
chart2.get_default_y_axis().dispose()
# Function to add a series to the chart with a stacked Y-axis
def add_series_with_stacked_y_axis(chart, stack_index, x_values, y_values, title):
# Add a new Y-axis with the specified stack index
axis_y = chart.add_y_axis(stack_index=stack_index)
# Set margins for the Y-axis (no margins for the first and last axes)
axis_y.set_margins(15 if stack_index > 0 else 0, 15 if stack_index < 5 else 0)
# Set the title for the Y-axis
axis_y.set_title(title=title)
# Set the interval for the Y-axis and stop after the specified range
axis_y.set_interval(-100, 100, stop_axis_after=True)
# Add a line series to the chart using the newly created Y-axis
series = chart.add_line_series(y_axis=axis_y, data_pattern='ProgressiveX')
# Append the data to the series
series.append_samples(x_values=x_values, y_values=y_values)
# Set the name and line thickness for the series
series.set_name(title)
series.set_line_thickness(2)
# Add each sensor's data to the stacked chart with its own stacked Y-axis
add_series_with_stacked_y_axis(chart2, 0, time, acceleration1, 'Sensor 1')
add_series_with_stacked_y_axis(chart2, 1, time, acceleration2, 'Sensor 2')
add_series_with_stacked_y_axis(chart2, 2, time, acceleration3, 'Sensor 3')
add_series_with_stacked_y_axis(chart2, 3, time, acceleration4, 'Sensor 4')
add_series_with_stacked_y_axis(chart2, 4, time, acceleration5, 'Sensor 5')
add_series_with_stacked_y_axis(chart2, 5, time, acceleration6, 'Sensor 6')
此代码创建了一个包含两个图表的仪表板:一个图表叠加了所有六个传感器的数据,另一个图表在单独的 Y 轴上显示了每个传感器的数据。此可视化提供了加速度数据的全面视图,使分析和比较每个传感器的响应变得更加容易。
自定义可视化
调整图表属性以根据您的要求定制可视化效果。
最终结构完整性分析 Python 应用程序
传感器数据的反思
分析数据集后,我们发现传感器 6 有一个值得注意的现象。与其他传感器相比,传感器 6 测量的值似乎更高,而其他传感器的测量值大多几乎相同。这种差异可能是由以下几个因素造成的:
- 传感器6附近的冲击或力:较高的数值可能是由于在传感器6处或其附近发生的冲击或作用力引起的。
- 传感器灵敏度:这也可能是因为传感器6比其他传感器更敏感,可能需要重新校准。
- 结构柔性:由于结构在更高层次的柔性增加,位于建筑顶部(传感器6所在位置)测得的加速度可能会更高。
值得注意的是,该数据集来自实验环境。在现实场景中,这样的读数需要进一步监控甚至现场访问,以确保数据的准确性和传感器的完整性。
总结
在本项目中,我们设置了Python环境,加载并处理了结构健康监测数据,并使用LightningChart Python进行了可视化。LightningChart Python 提供了先进的图表功能,这对于可视化复杂数据至关重要。整个过程包括读取数据文件、清理和预处理数据以及创建有洞察力的可视化图表。