【问题标题】:frequency as "index" in Pandas dataframe and dynamic extension频率作为 Pandas 数据帧中的“索引”和动态扩展
【发布时间】:2023-01-13 00:32:04
【问题描述】:

我正在做一个 RF 项目,工作流程如下:

  1. 定义所需频率扫描的startstopstep
  2. 计算每个频率的特定线路阻抗Z0和频率相关有效介电常数eef
  3. 为每个 f 计算传输矩阵ABCD
  4. 从 ABCD 计算散射参数 S(复值)
  5. 计算参数的大小
  6. 最后绘制它们

    目前,我已经通过在 for 循环中填充列表/numpy 数组来实现它。这可行,但当我想菊花链连接多个 ABCD 时,它很丑陋且需要大量劳动。 问题是调试困难(在上述步骤之间丢失临时结果。

    我认为一个解决方案可能是使用 pandas 但我很难实现以下必需品:

    1. 创建以频率为索引的数据框(f 的列也可能有效)
    2. “即时”扩展列以存储每个 f 的结果
    3. 为某些列单独设置dtype=,因为当前dtype=np.clongdouble是必需的(否则我在后面的计算中将 div 减为零)
    4. 一列包含一个 numpy 数组(abcd 矩阵)

      我四处搜索,但结果并没有阐明所需的概念和我的方法

      >>> import pandas as pd
      >>> start = int(100E6)
      >>> stop = int(1E9)
      >>> step = int(1E6)
      >>> df = pd.DataFrame(index=range(start,stop+step,step),columns=["z0","eef"])
      >>> df.index
      RangeIndex(start=100000000, stop=1001000000, step=1000000)
      >>> 
      
      

      当我尝试访问 df.index(1000)df[1000] 时抛出错误

【问题讨论】:

  • 您已经定义了一个最低索引为 100E6 的数据框,您会收到 df[1000] 的索引错误,因为您的数据名中不存在该索引。此外,最好使用 df.iloc[r] 按行访问 df,其中 r 是行号
  • 谢谢您的回答。我写了一个无法编辑的回复(太旧了)所以我删除了它。像f=100000000这样按频率访问行的解决方案是使用loc而不是iloc。 ``` df = pd.DataFrame(index=range(start,stop+step,step),columns=["foo","break","baz"]) df.loc[100000000] ``` 给出所需的输出。

标签: python pandas numpy


【解决方案1】:

为了使其更适合未来,可以创建一个函数来帮助计算给定的 S 参数f_startf_stopf_step,以及函数Z0eef。在这里我会考虑一个已经有函数Z0eef的。

让我们调用函数calc_s(cmets 使其不言自明)

import pandas as pd

def calc_s(f_start, f_stop, f_step, Z0, eef):

    # Create a dataframe with the frequency column
    df = pd.DataFrame({'f': pd.Series(range(f_start, f_stop, f_step))})

    # Calculate Z0 and eef and add them to the dataframe
    df['Z0'] = df['f'].apply(Z0)
    df['eef'] = df['f'].apply(eef)

    # Calculate the ABCD matrix for every frequency
    df['A'] = 1
    df['B'] = 2 * df['Z0'] * df['eef']**0.5
    df['C'] = 1
    df['D'] = -2 * df['Z0'] * df['eef']**0.5

    # Calculate the scattering parameters S
    df['S11'] = (df['A'] + df['B']) / (df['A'] - df['B'])
    df['S12'] = 2 * df['C'] / (df['A'] - df['B'])
    df['S21'] = 2 * df['C'] / (df['A'] - df['B'])
    df['S22'] = (df['A'] - df['B']) / (df['A'] + df['B'])

    # Calculate the magnitude of the scattering parameters
    df['S11_mag'] = df['S11'].apply(lambda x: x.real**2 + x.imag**2)**0.5
    df['S12_mag'] = df['S12'].apply(lambda x: x.real**2 + x.imag**2)**0.5
    df['S21_mag'] = df['S21'].apply(lambda x: x.real**2 + x.imag**2)**0.5
    df['S22_mag'] = df['S22'].apply(lambda x: x.real**2 + x.imag**2)**0.5

    return df

请注意,如果需要,一个 cal 总是会调整计算,或将其更改为一个人可能想要/需要的其他计算,无论是删除、添加……

现在,让我们用一些虚拟数据测试上面的函数

f_start = 1
f_stop = 100
f_step = 1
Z0 = lambda f: 50 # This is a dummy function that returns 50 for every f
eef = lambda f: 1 # This is a dummy function that returns 1 for every f
df = calc_s(f_start, f_stop, f_step, Z0, eef)

[Out]:
   f  Z0  eef  A      B  ...       S22   S11_mag   S12_mag   S21_mag   S22_mag
0  1  50    1  1  100.0  ... -0.980198  1.020202  0.020202  0.020202  0.980198
1  2  50    1  1  100.0  ... -0.980198  1.020202  0.020202  0.020202  0.980198
2  3  50    1  1  100.0  ... -0.980198  1.020202  0.020202  0.020202  0.980198
3  4  50    1  1  100.0  ... -0.980198  1.020202  0.020202  0.020202  0.980198
4  5  50    1  1  100.0  ... -0.980198  1.020202  0.020202  0.020202  0.980198

[5 rows x 15 columns]

【讨论】:

    【解决方案2】:

    闲逛了一会儿后,我对以下内容感到满意

    df = pd.DataFrame(columns=['Z0', 'eef', 'A', 'B', 'C',
                          'D', 's11', 's12', 's21', 's22'], index=f, dtype=bool)
        df.index.name = 'Frequency'
    

    f = [*range(start, stop+step, step)]。然后我通过df["A"].loc(f)访问必要的列/行。即使在进一步的计算中没有使用该列,我也会坚持这个方案,因为我很难区分具有(-out)特定列的 Dataframes。在此过程中,dtype= 扩展为 complex,但现在效果很好。

    【讨论】:

      猜你喜欢
      • 2016-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-07
      • 1970-01-01
      相关资源
      最近更新 更多