下面是我整理的一部分代码,短短几行,却轻易地就将不合格的数据可视化,比起C++不知简化了多少倍,突然感觉到了Python的功强大,就想分享一下。
以下是效果图:
以下是部分代码:
# 读取数据文件
data = pd.read_csv(file_path)
# 检查必要列是否存在
if 'Lateral_Offsets(m)' not in data.columns :
print(f"文件 {file_name} 缺少必要列,跳过。")
continue
# 检查偏移值是否超出范围
lateral_offsets = data['Lateral_Offsets(m)']
out_of_range_offsets = lateral_offsets.abs() > offset_limit
# 如果有任一条件不满足,将文件加入不合格列表并绘图
if out_of_range_offsets.any() :
invalid_files.append(file_path)
# 绘制图形:偏移量
plt.figure(figsize=(12, 6))
plt.subplot(2, 1, 1)
plt.plot( #plt.plot():用于绘制线条图(折线图)
lateral_offsets.index,
lateral_offsets,
label='Lateral Offsets',
color='blue'
)
plt.scatter( #plt.scatter():用于绘制散点图。
lateral_offsets.index[out_of_range_offsets],
lateral_offsets[out_of_range_offsets],
color='red',
label='Out of Range Offsets',
zorder=5
)
plt.axhline(y=offset_limit, color='green', linestyle='--', label='Upper Limit') #plt.axhline():用于绘制水平线
plt.axhline(y=-offset_limit, color='green', linestyle='--', label='Lower Limit')
plt.title(f"Lateral Offsets for {curve_name} - {file_name}")
plt.xlabel("Index")
plt.ylabel("Lateral Offset (m)")
plt.legend()
plt.grid()
# 显示图形
plt.tight_layout()
plt.show()
了解一些C++的应该知道,要想实现相同的功能可能需要手动遍历数据数组,再检查每个值是否满足条件,然后存储满足条件的索引和数据点,最后使用图形库绘制这些点,非常麻烦。
最后总结一下这段代码相比C++的神奇之处:
- Pandas的数据处理能力:
- pd.read_csv(file_path):一行代码就能读取CSV文件并将其内容加载到一个DataFrame对象中。
- data.columns:轻松访问DataFrame的列名,便于检查必要列是否存在。
- data['Lateral_Offsets(m)']:通过列名直接访问数据,无需循环遍历。
- 布尔索引:
- out_of_range_offsets = lateral_offsets.abs() > offset_limit:一行代码就生成了一个布尔Series,标识了哪些偏移量超出了范围。
- matplotlib的绘图能力:
- plt.plot()、plt.scatter()和plt.axhline():这三个函数分别用于绘制线条图、散点图和水平线,它们能够自动处理数据索引和数据值,无需手动循环。
- plt.figure()和plt.subplot():用于设置图形的大小和布局,同样非常直观。
- 条件判断和列表操作:
- if out_of_range_offsets.any():一行代码就能检查是否有任何偏移量超出了范围。
- invalid_files.append(file_path):将不合格的文件路径添加到列表中,无需手动管理内存或处理复杂的数据结构。
- 布尔索引筛选(最神奇之处):
- lateral_offsets.index[out_of_range_offsets]和lateral_offsets[out_of_range_offsets],:两行代码就能分别利用布尔索引从索引和数据中筛选出超出范围的部分(只有那些对应True值的索引和数据点会被选中)
太神奇了,这也许就是为什么Python在科学计算、数据分析、机器学习等领域如此受欢迎的原因之一。