我开发了一个需要校准100万个数据的程序,我想对它进行矢量化以获得时间性能。
我有一个数据框的列:['time', 'raw_data'],我想创建一个新的列与校准的数据
我有另一个数据框架,其中我有校准数据。数据框由以下列组成:['calibration_name', 'raw_value', 'calibrated_value']
现在我开发了一个检索calibrated_value的函数,我可以使用apply方法来实现:
def calibrate(value, calibration):
df_calibrations = pd.read_csv('calibration_data.csv', usecols=['calibration_name', 'raw_value', 'calibrated_value'])
y_out = df_calibrations.loc[df_calibrations ['calibration_name'] == value]['calibrated_value'].iloc[0]
df = pd.read_csv('data_to_calibrate.csv', usecols=['time', 'raw'])
calibration = 'calibration_name'
df['eng'] = df['raw'].apply(calibrate, calibration=calibration)
现在我的代码工作得很好,但我想提高性能,所以我决定向量化为:
df['eng'] = calibrate(df['raw'], calibration)
然而,我得到一个错误,如:
('Lengths must match to compare', (11,), (7630,))
我想不出一个向量化这行的解决方案:
y_out = df_calibrations.loc[df_calibrations ['calibration_name'] == value]['calibrated_value'].iloc[0]
有办法吗?
data_to_calibrate.csv:
time, raw
1571348671638000000, 1
1571348676493000000, 3
1571348681180000000, 2
calibration_data.csv:
calibration_name, raw_value, raw_value
XXXX01 0 A
XXXX01 1 B
XXXX01 2 C
XXXX01 3 D
通过合并公共列,您可以以向量化的方式执行所有必要的业务逻辑
data_to_calibrate = data_to_calibrate.merge(calibration_data, how='left', left_on='raw', right_on='raw_value')
data_to_calibrate.loc[data_to_calibrate['raw_value'].notna(), 'time'] = data_to_calibrate['raw_value']