矢量化 Pandas 中的漂移变化

问题描述 投票:0回答:1

这是Python代码

t0 = df['Temperature'].iloc[0] # Dataframe df with column 'Temperature' is already given
df['DriftedTemp'] = None

for i in range(1,len(df)):
    if(np.abs(df['Temperature'].iloc[i] - t0) > toffset): # toffset is a parameter that is given
        df['DriftedTemp'].iloc[i] = df['Temperature'].iloc[i]
        t0 = df['Temperature'].iloc[i]

它会计算出温度从之前记录的值漂移超过“toffset”时的行,并用这个新值更新该行的“DriftedTemp”列,并将“t0”更新为某个位置的“温度”发生漂移的点。

此类代码的问题在于,当前值取决于在前一行中求值时的前一个值。矢量化将每一列视为矢量,因此前一行的更改状态不会通过简单的矢量化反映出来。

这可以使用 while 循环和矢量化来实现,但我无法想到没有任何循环的简单矢量化技术来完成相同的任务。

python pandas numpy vectorization
1个回答
0
投票

矢量化可能是不可能的,因为漂移的计算取决于之前的漂移状态,据说这是使用

numba
的一个很好的用例,基本上创建一个带有逻辑的函数,然后用numba对其进行编译以实现类似C的速度.

import numba

@numba.njit
def drift(temperatures, toffset):
    drift = np.full_like(temperatures, fill_value=np.nan, dtype='float')

    for i, t in enumerate(temperatures):
        if i == 0:
            t0 = t        
        elif abs(t - t0) > toffset:
            t0 = drift[i] = t

    return drift


df['DriftedTemp'] = drift(df['Temperature'].to_numpy(), 2)
© www.soinside.com 2019 - 2024. All rights reserved.