Python SNSData 类:从 CSV 文件读取数据并生成电导率数据

该代码定义了一个名为 SNSData 的类,用于从 CSV 文件读取数据并生成电导率数据。

类定义

class SNSData:
    def __init__(self, pandas_dir=""):#open 文件夹
        if os.path.isfile(pandas_dir):
            self.path = pandas_dir
        else:
            raise FileNotFoundError('File not found:' + pandas_dir)
        self.raw_data = pd.read_csv(self.path, encoding="utf-8")
        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)  # np.cos默认弧度
        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"])  # 在bode图中,幅度也是用对数表示的
        '下面利用已知浓度盐水的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]  # 该电导率列表对应浓度为0.1,0.5的盐水
        concentration_list = [0.05, 0.10, 0.2, 0.3, 0.4, 0.50]
        saline_real_dict = {}  # 每个频率,每个浓度的盐水的实部,其中同浓度对应同一个电导率

        # 在这里,首先过滤出同一个频率下的所有盐水的real part,然后对同一个浓度的realpart求平均值,这里有七个浓度,将七个平均值打包为一个列表,作为子列表添加入saline_real_list
        for it in self.freq_list:  # 对每一个频率
            one_freq_saline_real_list = []  # 打包用的子列表

            for con in concentration_list:
                # 这里依次为0.05, 0.1, 0.2, 0., 0.4, 0.6的盐水的real part平均值
                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"])  # 求筛选出来的下R的平均值
                one_freq_saline_real_list.append(avg)

            saline_real_dict[it] = one_freq_saline_real_list  # 每一个频率下都有了一个浓度对应的real part列表
            # real part和电导率建立起映射关系,对于单个频率,one_freq_saline_real_list作为x轴,conductivity作为y轴,用np.interp方法, 寻找R对应的电导率
            self.df["conductivity"] += self.df["frequency"].isin([it]) * np.interp(self.df["R"],
                                                                                    one_freq_saline_real_list[::-1],
                                                                                    conductivity_list[
                                                                                    ::-1])  # interp要求x轴为递增序列,因此此处倒序输入

    def get_df(self):
        return self.df
    print(os.getcwd())
def save_20230213NO1_conductivity(path):
     # df = pd.DataFrame(regular_data)
    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


# snsdata = SNSData()
# snsdata.save_20230213NO1_conductivity()
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

snsdata = SNSData(pandas_dir='./2023_2_13No1/2023_2_13_12.csv')#jiu'zhe'yi'ge'wen'ti'dui'ba
save_20230213NO1_conductivity('./2023_2_13No1/2023_2_13_12.csv')
calculate_conductivity('./2023_2_13No1/2023_2_13_12.csv')
snsdata = SNSData(pandas_dir='./2023_2_13No1/2023_2_13_12.csv')
df = snsdata.get_df()
df
为什么我的df数据中conductivity没有数据,应该如何修改内容:根据代码,可以看到在SNSData类的构造函数中,生成conductivity的过程是通过调用generate_conductivity方法实现的。因此,如果在调用get_df方法之前没有先调用generate_conductivity方法,那么conductivity列就会全为0。因此,可以尝试在调用get_df方法之前,先调用generate_conductivity方法,即:

```python
snsdata = SNSData(pandas_dir='./2023_2_13No1/2023_2_13_12.csv')
snsdata.generate_conductivity()
df = snsdata.get_df()

这样就可以得到包含conductivity数据的DataFrame了。


**代码说明**

* `__init__` 方法:
    * 从 CSV 文件读取数据并存储在 `raw_data` 属性中。
    * 初始化 `regular_data` 属性,用于存储处理后的数据。
    * 定义频率列表 `freq_list`。
    * 将原始数据中的信息填充到 `regular_data` 属性中,包括名称、属性、幅度、相位和频率。
    * 计算对数频率和对数幅度。
    * 初始化 `conductivity` 列,并将其设置为全 0。
    * 使用 `pd.DataFrame` 将 `regular_data` 属性转换为 Pandas 数据帧。
    * 调用 `generate_conductivity` 方法生成电导率数据。
* `generate_conductivity` 方法:
    * 利用已知浓度盐水的 R 和电导率映射关系来得到待测物体的电导率。
    * 创建一个字典 `saline_real_dict`,存储每个频率、每个浓度的盐水的实部。
    * 循环遍历频率列表,对每个频率下的所有盐水的实部求平均值,并将平均值存储在 `saline_real_dict` 字典中。
    * 使用 `np.interp` 方法,根据实部和电导率的映射关系,计算出每个数据的电导率。
* `get_df` 方法:
    * 返回包含所有数据的 Pandas 数据帧。

**代码使用方法**

```python
snsdata = SNSData(pandas_dir='./2023_2_13No1/2023_2_13_12.csv')
snsdata.generate_conductivity()
df = snsdata.get_df()

这段代码将创建一个 SNSData 对象,并从指定的 CSV 文件读取数据。然后,它将调用 generate_conductivity 方法生成电导率数据,最后使用 get_df 方法返回包含所有数据的 Pandas 数据帧。

注意

  • 该代码中使用的映射关系需要根据实际情况进行调整。
  • save_20230213NO1_conductivitycalculate_conductivity 函数是用于处理数据的辅助函数,可以根据需要进行修改。

总结

该代码定义了一个用于从 CSV 文件读取数据并生成电导率数据的 SNSData 类。该类使用 Pandas 库进行数据处理,并包含了生成电导率数据的映射关系。使用该类,可以轻松地从 CSV 文件读取数据,并计算出每个数据的电导率。

Python SNSData 类:从 CSV 文件读取数据并生成电导率数据

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

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