【发布时间】:2021-09-03 12:09:08
【问题描述】:
如果标题含糊不清,我深表歉意,但我已尽力而为。在任何情况下,我都有一个包含三列的数据框,一列包含日期时间值(用于观察时间),另一列包含范围(与进行观察的仪器的距离),最后一个包含观察强度。该数据的散点图如下所示:
我需要过滤掉随机孤立的“椒盐”观察结果,并计划使用中值过滤器来执行此操作。但是,我不知道该怎么做。我试图创建一个包含根据时间和范围索引的强度值的二维数组。所以 00:00 UT 对应于第 0 行,0 km 对应于第 0 列,依此类推……空位包含 NaN。然后我将中值滤波器(scipy 的 medfilt:scipy.ndimage.median_filter)应用到这个二维数组。
我的问题是它似乎效率低下,因为我必须遍历大量数据来创建数组。当然,将过滤后的二维数组转换为对应的一维序列也很困难。
这是我用来获取二维数组的代码
def get2DData(df, filt_size):
'''
Implementing this method: We want a 2D array that stores all the LoS
velocities, so that we can ultimately apply median filtering to it.
To do this, iterate over all unique datetime values and all unique range values,
assigning LoS velocity values to the appropriate positions in a 2D array.
'''
arr = np.empty((len(df['time'].unique()), len(df['slist'].unique()), ))
arr[:] = np.nan
times_ = sorted(df['time'].unique())
times_index = np.arange(len(times_))
range_ = sorted(df['slist'].unique())
range_index = np.arange(len(range_))
times_dict = {A: B for A, B in zip(times_, times_index)}
range_dict = {A: B for A, B in zip(range_, range_index)}
times_dict_rev = {A: B for A, B in zip(times_index, times_)}
range_dict_rev = {A: B for A, B in zip(range_index, range_)}
for dt, rng_, v in zip(df['time'].values, df['slist'].values, df['v'].values):
arr[times_dict[dt]][range_dict[rng_]] = v
medfilt_arr = applyFilt(arr,filt_size)
dt_list = []
rng_list = []
v_list = []
for ix,iy in np.ndindex(medfilt_arr.shape):
dt_list.append(times_dict_rev[ix])
rng_list.append(range_dict_rev[iy])
v_list.append(medfilt_arr[ix][iy])
df_filtered = pd.DataFrame({'time': dt_list, 'slist': rng_list,'v': v_list})
return arr, df_filtered
【问题讨论】:
-
因此,如果我理解正确,您的目标是计算每个时间步长的所有范围内的中值强度?为此,您是否尝试找到一种有效的方法来构建二维数组?
-
是的!这似乎是准确的,尽管我认为我不会计算每个时间步长的所有范围内的强度。我正在使用 3x3 中值滤波器(目前)。但最重要的部分是构建二维数组,是的。
-
如果我们能看到您尝试过的代码可能会有所帮助
标签: python pandas numpy scipy vectorization