【发布时间】:2020-11-09 23:22:20
【问题描述】:
我有一个时间序列列表(=pandas 数据帧),并希望为每个时间序列(设备的)计算矩阵配置文件。 一种选择是迭代所有设备——这似乎很慢。 第二种选择是按设备分组 - 并应用 UDF。现在的问题是,UDF 将返回 1:1 行,即不是每个组的单个标量值,而是将输出相同数量的行作为输入。
当返回 1:1(或至少非标量值)时,是否仍然可以以某种方式对到达组的此计算进行矢量化?
import pandas as pd
df = pd.DataFrame({
'foo':[1,2,3], 'baz':[1.1, 0.5, 4], 'bar':[1,2,1]
})
display(df)
print('***************************')
# slow version retaining all the rows
for g in df.bar.unique():
print(g)
this_group = df[df.bar == g]
# perform a UDF which needs to have all the values per group
# i.e. for real I want to calculate the matrixprofile for each time-series of a device
this_group['result'] = this_group.baz.apply(lambda x: 1)
display(this_group)
print('***************************')
def my_non_scalar1_1_agg_function(x):
display(pd.DataFrame(x))
return x
# neatly vectorized application of a non_scalar function
# but this fails as: Must produce aggregated value
df = df.groupby(['bar']).baz.agg(my_non_scalar1_1_agg_function)
display(df)
【问题讨论】:
-
为此,我们可能需要查看 UDF 的详细信息。
-
当然:gist.github.com/geoHeil/7344932b27f05bfaab551b3b948ac2c5 查看生成示例数据集并使用
stumpy.stumpUDF 的代码。 -
我猜第二个(不接受)答案:stackoverflow.com/questions/42171132/… 也应该在这里工作并试一试
-
stumpy.stump是否返回单个标量值? Docs 表示它返回 4 列的ndarray。请发布一次调用的示例输出以及您需要提取的单个标量值。