在dask中改组数据

时间:2017-10-20 03:54:28

标签: python dask

这是来自Subsetting Dask DataFrames的后续问题。我希望在将 dask dataframe 中的数据分批发送到ML算法之前对其进行混洗。

该问题的答案是做以下事情:

for part in df.repartition(npartitions=100).to_delayed():
    batch = part.compute()

然而,即使我要改变批次的内容,我也有点担心这可能不太理想。数据是一个时间序列集,因此数据点在每个分区内都是高度相关的。

我最理想的是:

rand_idx = np.random.choice(len(df), batch_size, replace=False)
batch = df.iloc[rand_idx, :]

哪个适用于熊猫,但不适用于dask。有什么想法吗?

编辑1:潜在解决方案

我试过

train_len = int(len_df*0.8)
idx = np.random.permutation(len_df)
train_idx = idx[:train_len]
test_idx = idx[train_len:]
train_df = df.loc[train_idx]
test_df = df.loc[test_idx]

但是,如果我尝试执行train_df.loc[:5,:].compute(),则返回124451行数据帧。所以显然使用dask错误。

4 个答案:

答案 0 :(得分:4)

我建议在数据框中添加一列随机数据,然后使用它来设置索引:

df = df.map_partitions(add_random_column_to_pandas_dataframe, ...)
df = df.set_index('name-of-random-column')

答案 1 :(得分:2)

我最近遇到了相同的问题,并使用了pull request

中引入的dask数组和shuffle_slice提出了另一种方法

它洗了整个样本

import numpy as np
from dask.array.slicing import shuffle_slice

d_arr = df.to_dask_array(True)
df_len = len(df)
np.random.seed(42)
index = np.random.choice(df_len, df_len, replace=False)
d_arr = shuffle_slice(d_arr, index)

并转换回dask数据框

df = d_arr.to_dask_dataframe(df.columns)

对我来说,它适用于大型数据集

答案 2 :(得分:1)

如果您尝试将数据框划分为培训和测试子集,sklearn.model_selection.train_test_split 就是pandas.DataFrame,它与dask一起使用。 (以there为例)

对于与dklearn一起使用的情况,您可能会对库from dklearn.cross_validation import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y,test_size=0.2) 感兴趣,这似乎可以实现此功能。

  

为此,我们可以使用train_test_split函数,它可以反映出来   scikit-learn同名的功能。我们会阻止20%的人   行:

dklearn

更多信息here

注意:我没有使用>>> a, b = df.random_split([0.5, 0.5]) 执行任何测试,这只是我遇到的一件事,但我希望它可以提供帮助。

编辑: dask.DataFrame.random_split怎么办?

  

实施例

     

50/50分裂

>>> a, b, c = df.random_split([0.8, 0.1, 0.1], random_state=123)
     

80/10/10分裂,一致的random_state

{{1}}

对ML应用程序的使用进行了说明here

答案 3 :(得分:0)

对于这里的人来说,他们实际上只是想像标题所暗示的那样对行进行洗牌:
这很昂贵

import numpy as np
random_idx = np.random.permutation(len(sd.index))
sd.assign(random_idx=random_idx)
sd = sd.set_index('x', sorted=True)