Numpy(或 scipy)基于时间戳的时间序列值分箱
Numpy (or scipy) binning of time series values based on timestamps
我正在尝试根据时间戳对时间序列进行分箱(下采样)。例如:
import numpy as np
import pandas as pd
timestamps = np.linspace(0, 1000, 10000)
values = np.random.random(10000)
我通常将其转换为数据帧,并使用 cut(或 qcut)创建 bins:
timeseries_df = pd.DataFrame({"Timestamps": timestamps, "Values": values})
timeseries_df["Bins"] = pd.cut(timeseries_df["Timestamps"],100) #downsampling by two orders of magnitude
ds_timestamps = timeseries_df.groupby("Bins").max()["Timestamps"]
ds_values = timeseries_df.groupby("Bins").mean()["Values"]
这行得通,但我正在编写可以重用的函数,我想尽可能避免使用 pandas。我已经尝试实施建议的版本 here
ds_timestamps = np.linspace(timestamps.min(), timestamps.max(), 100)
digitized_timestamps = np.digitize(timestamps, ds_timestamps)
ds_values = [values[digitized_timestamps == i+1].mean() for i in range(len(ds_timestamps))]
这也有效,但速度极慢。还有其他方法吗?
如评论中所述,如果您不使用 Pandas 的主要顾虑是速度,我实际上建议使用它,因为它并不完全用 Python 编写,但它有很多使用 Cython(基本上是 C)编写的内部部分,所以它们非常非常快。
我正在尝试根据时间戳对时间序列进行分箱(下采样)。例如:
import numpy as np
import pandas as pd
timestamps = np.linspace(0, 1000, 10000)
values = np.random.random(10000)
我通常将其转换为数据帧,并使用 cut(或 qcut)创建 bins:
timeseries_df = pd.DataFrame({"Timestamps": timestamps, "Values": values})
timeseries_df["Bins"] = pd.cut(timeseries_df["Timestamps"],100) #downsampling by two orders of magnitude
ds_timestamps = timeseries_df.groupby("Bins").max()["Timestamps"]
ds_values = timeseries_df.groupby("Bins").mean()["Values"]
这行得通,但我正在编写可以重用的函数,我想尽可能避免使用 pandas。我已经尝试实施建议的版本 here
ds_timestamps = np.linspace(timestamps.min(), timestamps.max(), 100)
digitized_timestamps = np.digitize(timestamps, ds_timestamps)
ds_values = [values[digitized_timestamps == i+1].mean() for i in range(len(ds_timestamps))]
这也有效,但速度极慢。还有其他方法吗?
如评论中所述,如果您不使用 Pandas 的主要顾虑是速度,我实际上建议使用它,因为它并不完全用 Python 编写,但它有很多使用 Cython(基本上是 C)编写的内部部分,所以它们非常非常快。