import os
import pandas as pd
import numpy as np
from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rows

class SNSData:
    def __init__(self, pandas_dir=''):
        if os.path.isfile(pandas_dir):
            self.path = pandas_dir
        else:
            raise FileNotFoundError('File not found:' + pandas_dir)
        
        #尝试使用不同的编码格式打开文件
        try:
            self.raw_data = pd.read_csv(self.path, encoding='utf-8')
        except UnicodeDecodeError:
            try:
                self.raw_data = pd.read_csv(self.path, encoding='gbk')
            except UnicodeDecodeError:
                raise FileNotFoundError(f'无法解码文件:{pandas_dir},请检查文件编码格式')

        self.regular_data = {'name': [], 'property':[],  'magnitude': [], 'phase': [], 'frequency': []}
        self.freq_list = [1, 2, 3, 7, 11, 17, 23, 31, 43, 61, 89, 127, 179, 251, 349]

        for it in self.freq_list:
            self.regular_data['name'].extend(self.raw_data['name'])
            self.regular_data['property'].extend(self.raw_data['property'])  
            self.regular_data['magnitude'].extend(self.raw_data[str(it) + 'kHz_mag'])
            self.regular_data['phase'].extend(self.raw_data[str(it) + 'kHz_ang'])
            for i in range(self.raw_data.shape[0]):
                self.regular_data['frequency'].append(it)

        self.regular_data['logFreq'] = np.log10(self.regular_data['frequency'])  
        self.regular_data['R'] = np.array(self.regular_data['magnitude']) * np.cos(
            np.array(self.regular_data['phase']) * 3.14 / 180)  
        self.regular_data['X'] = np.array(self.regular_data['magnitude']) * np.sin(
            np.array(self.regular_data['phase']) * 3.14 / 180)
        self.regular_data['logMag'] = np.log10(self.regular_data['magnitude'])  
        '''下面利用已知浓度盐水的R和电导率(conductivity)映射关系来得到待测物体的电导率'''
        
        self.regular_data['conductivity'] = [0] * self.raw_data.shape[0] * len(self.freq_list)
        self.df = pd.DataFrame(self.regular_data)
        self.generate_conductivity()

        '''重新整理完数据后,整合至pandas数据帧,用get_df方法可以返回该pandas数据帧'''

    def generate_conductivity(self):
        '''
        映射关系如下
        利用给出的盐水和电导率表自己先写个映射关系
        '''
        conductivity_list = [976, 1987, 3850, 5650, 7450, 9238]  
        concentration_list = [0.05, 0.10, 0.2, 0.3, 0.4, 0.50]
        saline_real_dict = {}  

        
        for it in self.freq_list:  
            one_freq_saline_real_list = []  

            for con in concentration_list:
                
                saline_concentration = 'saline' + format(con, '.2f')
                filted_df = self.df[
                    self.df['frequency'].isin([it]) * self.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  
            
            self.regular_data['conductivity'] += self.df['frequency'].isin([it]) * np.interp(self.df['R'],
                                                                                   one_freq_saline_real_list[::-1],
                                                                                   conductivity_list[
                                                                                   ::-1])  

    def get_df(self):
        return self.df

def save_20230213NO1_conductivity(path):
    snsdata = SNSData(pandas_dir=path)
    df = snsdata.get_df()
    
    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')]
    wb = Workbook()
    ws = wb.active
    for r in dataframe_to_rows(rslt_df, index=True, header=True):
        ws.append(r)
    wb.save('2023_2_13No1_data1.csv')
    return None


def calculate_conductivity(path):
    df = pd.read_csv( '2023_2_13No1_data1.csv')
    index = [1, 2, 3, 7, 11, 17, 23, 31, 43, 61, 89, 127, 179, 251, 349]
    my_df = []
    for i in range(len(index)):
        the_df = df[(df['name'] == 'tumor') & (df['property'] == 'A|B|C|D|E|F|G|H') & (df['frequency'] == index[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({'result': result})
    df_result.to_csv('2023_2_13No1_data2.csv', index=False)
    return None


if __name__ == '__main__':
    snsdata = SNSData(pandas_dir='./2023_2_13No1/2023_2_13_12.csv')
    save_20230213NO1_conductivity('./2023_2_13No1/2023_2_13_12.csv')
    calculate_conductivity('./2023_2_13No1/2023_2_13_12.csv')
Python 数据处理:使用 Pandas 和 Numpy 计算电导率

原文地址: https://www.cveoy.top/t/topic/jvvX 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录