Python 电导率计算:从CSV数据到结果分析
import numpy as np import pandas as pd
def load_data(pandas_dir): '读取CSV数据并进行预处理' raw_data = pd.read_csv(pandas_dir, encoding='utf-8') regular_data = {'name': [], 'magnitude': [], 'phase': [], 'frequency': []} freq_list = [1, 2, 3, 7, 11, 17, 23, 31, 43, 61, 89, 127, 179, 251, 349]
for it in freq_list:
regular_data['name'].extend(
raw_data['name'] + raw_data['name'].isin(['saline']) * raw_data['property']
) # 盐水考虑浓度属性,脑脊液不考虑, 在新数据中命名为盐水+浓度
regular_data['magnitude'].extend(raw_data[str(it) + 'kHz_mag'])
regular_data['phase'].extend(raw_data[str(it) + 'kHz_ang'])
for i in range(raw_data.shape[0]):
regular_data['frequency'].append(it)
regular_data['logFreq'] = np.log10(regular_data['frequency']) # 将频率以对数形式展现
regular_data['R'] = np.array(regular_data['magnitude']) * np.cos(
np.array(regular_data['phase']) * 3.14 / 180
) # np.cos默认弧度
regular_data['X'] = np.array(regular_data['magnitude']) * np.sin(
np.array(regular_data['phase']) * 3.14 / 180
)
regular_data['logMag'] = np.log10(regular_data['magnitude']) # 在bode图中,幅度也是用对数表示的
# 创建电导率空列表保持行数一致
regular_data['conductivity'] = [0] * raw_data.shape[0] * len(freq_list)
df = pd.DataFrame(regular_data)
generate_conductivity(df)
return df
def generate_conductivity(df): '利用已知浓度盐水的R和电导率映射关系计算待测物体的电导率' conductivity_list = [976, 1987, 3850, 5650, 7450, 9238] # 该电导率列表对应浓度为0.1,0.5的盐水 concentration_list = [0.05, 0.10, 0.2, 0.3, 0.4, 0.50] saline_real_dict = {} # 每个频率,每个浓度的盐水的实部,其中同浓度对应同一个电导率
for it in df['frequency'].unique(): # 对每一个频率
one_freq_saline_real_list = []
for con in concentration_list:
saline_concentration = 'saline' + format(con, '.2f')
filted_df = df[
df['frequency'].isin([it]) * df['name'].isin([saline_concentration])
]
avg = np.mean(filted_df['R'])
one_freq_saline_real_list.append(avg)
saline_real_dict[it] = one_freq_saline_real_list
df['conductivity'] += df['frequency'].isin([it]) * np.interp(
df['R'], one_freq_saline_real_list[::-1], conductivity_list[::-1]
)
def save_20230213NO1_conductivity(): '将处理后的数据保存到CSV文件' df = load_data(pandas_dir='./2023_2_13No1/2023_2_13_12.csv') filtered_df = df[~df['name'].isin(['air'])] rslt_df = filtered_df[filtered_df['property'].str.contains('A|B|C|D|E|F|G|H') & filtered_df['name'].str.contains('saline|normal|tumor|peritumor')] rslt_df.to_csv('2023_2_13No1_data1.csv', index=True)
def calculate_conductivity(freq_list): '计算特定条件下肿瘤组织的平均电导率' df = pd.read_csv('2023_2_13No1_data1.csv', index_col=0) my_df = [] for i in range(len(freq_list)): the_df = df[ (df['name'] == 'tumor') & (df['property'] == 'A|B|C|D|E|F|G|H') & (df['frequency'] == freq_list[i]) & (df['conductivity'] > 0) ] my_df.append(the_df)
result = []
for item in my_df:
result.append((sum(item['conductivity'])) / (item.shape[0]))
df_result = pd.DataFrame({'frequency': freq_list, 'conductivity': result})
df_result.to_csv('2023_2_13No1_data2.csv', index=False)
freq_list = [1, 2, 3, 7, 11, 17, 23, 31, 43, 61, 89, 127, 179, 251, 349] save_20230213NO1_conductivity() calculate_conductivity(freq_list)
原文地址: https://www.cveoy.top/t/topic/jtHP 著作权归作者所有。请勿转载和采集!