无需放回的随机样本,同时保持表格数据的自然顺序

Random sample without replacement while maintaining natural order of tabular data

我有不是单调递增的时间序列数据,所以调用sort/shuffle是不可能的。

我想随机抽取n%的数据,同时保持相对顺序,作为验证集或测试集,可以表示为:

my_ndarray = [ 1, 20, 10, 3, 90, 5, 80, 50, 4, 1] # (number of samples = 1645, number of timesteps = 10, number of features = 7)
# custom_train_test_split()
train = [1, 20, 90, 5, 50, 4, 1]
valid = [10, 3, 80]

如果能提供有关如何有效执行此操作的指导,我将不胜感激。据我了解 Java 样式迭代在 Python 中效率低下。我怀疑 3D 布尔值 table mask 将是 pythonic 和矢量化方式。

这行得通。我设置 test_size=0.4 以便 40% 的行位于 test_df 中。这假设您的数据框在左侧具有所有特征列,在右侧具有响应列。

x = df[features_columns_names_list]
y = df[response_column_name]

X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.4)

train_df = pd.concat([X_train, y_train], axis=1).sort_index(axis = 0)
test_df = pd.concat([X_test, y_test], axis=1).sort_index(axis = 0)

解决方案可能如下所示:

  • 向数组添加一个临时的额外维度,您可以在其中为数组中的每个项目添加索引。
  • 随机排列数组。
  • 取出数组的所需部分,然后按维度对每个部分进行排序。
  • 删除所选部分的临时尺寸。

这是使用普通 Python 列表的解决方案:

my_ndarray = [ 1, 20, 10, 3, 90, 5, 80, 50, 4, 1] 
# Add temporary dimension by converting each item 
# to a sublist, where the index is the first element of each sublist
nda=[[i,my_ndarray[i]] for i in len(my_ndarray)]
np.random.shuffle(nda)
# Training data is the first 7 items
traindata=nda[0:7]
traindata.sort()
traindata=[x[1] for x in traindata]
# Test data is the rest
testdata=nda[7:10]
testdata.sort()
testdata=[x[1] for x in testdata]