SL_Only,pandas数据帧,包含来自13K位置(记录)的三个发射器的信号。SL_Only形状为13722x3所有数据类型均为numeric。TxID_L,pandas dataframe,shape is 3x10包含SL_Only中三个发射器的10个参数。
F_BW = 700,2100,step_size=200 CF = 20,120,step_size= 5 TxID = str,可以是任何值SC_SL = best of TxID
除了TxIDs之外,所有的值都是numeric
SC_SL = '<Best column_name from SL_Only>'
row_arr = []
for _, r in tqdm(SL_Only.iterrows()):
max_rsrp = SL_Only[SC_SL][_]
max_txid = (r == max_rsrp).T.idxmax()
paramax_cf = TxID_L[TxID_L['TxID'] == max_txid]['CF'].values
paramax_bw = TxID_L[TxID_L['TxID'] == max_txid]['F_BW'].values
col_arr = []
for c in SL_Only.columns.values:
rsrp = r[c]
txid = (r == rsrp).T.idxmax()
param_cf = TxID_L[TxID_L['TxID'] == txid]['CF'].values
param_bw = TxID_L[TxID_L['TxID'] == txid]['F_BW'].values
calc = rsrp + 10*np.log10(abs((paramax_cf+0.5*paramax_bw - param_cf+0.5*param_bw)/paramax_bw))
col_arr.append(calc[0])
row_arr.append(col_arr)row_arr需要1.5分钟来处理,而在Mathcad中只需要几分之一秒(我还没有用过它,但我的经理告诉我它是这样工作的。)
你能找出代码中的错误,这样处理起来就更省时了吗?
发布于 2021-11-21 05:14:08
我已经写了一些生成假输入的代码,这至少允许我在没有修改的情况下运行您发布的代码:
import numpy as np
import pandas as pd
TxIDs = ['sensor1', 'sensor2', 'sensor3']
params = ['CF', 'F_BW']
nsensors = len(TxIDs)
nmeasurements = 13722
SL_Only = pd.DataFrame(np.random.uniform(size=(nmeasurements, nsensors)), columns=TxIDs)
TxID_L = pd.DataFrame(np.random.uniform(size=(nsensors, len(params))), columns=params)
TxID_L['TxID'] = TxIDs
SC_SL = 'sensor1'在这些定义之后,运行您的代码(在我的机器上大约需要45秒)生成一个列表row_arr的列表。为了比较结果,我定义
old_result = pd.DataFrame(row_arr, columns=SL_Only.columns.values)下面的代码复制了您的结果,大约需要0.2秒:
TxID_L.set_index('TxID', inplace=True)
paramax_cf = TxID_L.loc[SC_SL, 'CF']
paramax_bw = TxID_L.loc[SC_SL, 'F_BW']
param_bw = TxID_L.loc[:, 'F_BW']
param_cf = TxID_L.loc[:, 'CF']
new_result = SL_Only + 10*np.log10(abs((paramax_cf+0.5*paramax_bw - param_cf+0.5*param_bw)/paramax_bw))为了确认这一点,我确实
(new_result - old_result).abs().values.max()我每次运行这段代码都会返回0。
关键的见解是尽可能多地只做一次,而不是循环,并使用Pandas提供的矢量化操作。
https://stackoverflow.com/questions/70019327
复制相似问题