python数据处理实战:工作中的小案例之溃缩能计算

本人实际工作中,需要对样品进行检测,其中一项检测为溃缩能检测,就是对样品进行压力试验,根据输出的应力-压溃度曲线,来计算溃缩能。由于实际曲线无法给定具体函数,也就无法用积分公式解决,只能根据积分定义中的概念来解决(不清楚可以百度回顾下相关知识)
数据处理工具基本都能解决这个问题:Excel、Origin、Python等,但用Python更容易实现自动化批量处理,后期可以通过扩展实现自动化输出报表(自己暂时没这个实力)。
本文使用Jupyter Notebook进行数据处理
废话少说,咱们进入正题!!

1.初次实现

以下只是实现了一个文件的处理,没有什么复杂的操作,基本就是pandas的日常操作,并且数据也相对干净,刚开始进行pandas学习的童鞋可以用来练练手。

先用python读取其中的一个文件,看一下数据的分布情况。
读取文件时,需要多尝试几次,遇到的问题如下:
1.crv文件我都没听说过,不知道和csv有没有关系,尝试着用pd.read_csv进行读取;2.编码不同,默认是采用utf-8进行,而该文件用gbk
3.数据列名没有自动推断,需自己添加;
4.分隔符为"\t";
5.数据列名和实际记录数据不在一列中,是错位的,需要进行必要的清洗,使数据简洁直观

import numpy as np
import pandas as pd
from scipy import integrate
import math
# 读取文件
file = pd.read_csv('demo.crv',encoding='gbk',header=1,sep='\t')
# 查看数据前几行
file.head()
# 查看数据汇总信息
file.info()
# 查看数据缺失情况
file.notnull().sum()
# 试验设备上冲头半径
r = 25.4
# 计算溃缩能的常量部分,即冲头圆面积,并进行单位换算
prefix = math.pi * pow(r,2) *0.1
# 创建一个list,用来存储列名
cols = ['试验力','变形','横向变形','位移','应力','应变','时间']
# 删除所有值为NaN的列
file.dropna(axis=1,inplace=True)
# 对file中的列进行重命名
file.columns = cols
# 增加列名为压溃度的一列,把应变转化为压溃度
file['压溃度'] = file['应变']/100
# 根据要求,筛选出压溃度小于0.5的数据,并提取我们要计算的列
data = file[file['压溃度'] < 0.5][['应力','压溃度']]
# scipy中在无法确认积分函数的前提下,可用下面函数来对给定序列进行积分
result = integrate.trapz(data.iloc[0],data.iloc[-1])
# 计算溃缩能
energy = result * prefix
print(energy)

2.再次实现

再次实现的内容也很简单,就是能对文件夹下的文件进行批量处理。只需要再导入os模块就行,具体实现如下:

import numpy as np
import pandas as pd
from scipy import integrate
import math,os

# 文件夹绝对路径
file_path = r'C:\Users\ZL\Desktop\demo'
# 遍历该文件夹下的所有文件,返回list,内容为文件名
root = os.listdir(file_path)
files = []
# 路径拼接,得到每个文件的绝对路径,放到files列表中
for i in range(len(root)):
    files.append(os.path.join(file_path,root[i]))

r = 25.4
prefix = math.pi * pow(r,2) *0.1
cols = ['试验力','变形','横向变形','位移','应力','应变','时间']

# 定义能量计算函数
def half_energy(file):
"""
该函数用来计算试样吸收的总能量
"""
    file.dropna(axis=1,inplace=True)
    file.columns = cols
    file['压溃度'] = file['应变']/100
    data = file[file['压溃度'] < 0.5][['应力','压溃度']]
    result = integrate.trapz(data.iloc[0],data.iloc[-1])
    energy = result * prefix
    return energy

# 遍历每个文件,计算其吸收的能量
for file in files:
    print(file,half_energy(file),sep='\n')

3.改进之处

以上操作基本能满足日常的工作需求,但我感觉还有较大提升之处,如:列名可以用正则表达式进行提取,而不是手动键入;本人能力水平有限,后期随着学习以及认识的加深,可能写出更好的处理方式,现在暂且这样吧!

如果有需要原始数据的或者其他参考书籍的可以关注,联系我!

发布了9 篇原创文章 · 获赞 0 · 访问量 277
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览