我有一个看起来像这样的parquet数据集(我使用的是polars,但任何dataframe库都可以):
df = pl.DataFrame(
{
"match_id": [
1, 1, 1,
2, 2, 2, 2,
3, 3, 3, 3,
],
"team_id": [
1, 2, 2,
1, 1, 2, 2,
1, 2, 2, 3,
],
"player_name": [
"kevin", "james", "kelly",
"john", "jenny", "jim", "josh",
"alice", "kevin", "lilly", "erica",
],
}
)
我想通过match_id和测试训练分割分组,这样80%的匹配在训练集中,其余的在测试集中。比如说
group_df = df.group_by(["match_id"])
train, test = group_split(group_df, test_size=0.20)
我需要一个python解决方案,最好是dask,pandas或其他数据框架库。目前pandas不支持惰性求值,因为数据集非常大。因此,使用Pandas似乎是不可能的。另一方面,Dask不支持任何sklearn.model_selection
拆分器,因为它不支持基于整数的索引。
理想情况下,我只需要一个简单的GroupShuffleSplit
和dask。有没有其他的库支持这个?如果是这样,我该如何以懒惰的方式使用 parquet 呢?
5条答案
按热度按时间bkhjykvo1#
也许像这样的一些会为你工作。
然而,这不是一个完美的答案,它试图解决大数据量的问题。
在该解决方案中,GroupShuffleSplit适用于数据的每个分区,但不适用于孔数据集,并且由于使用了match_id.unique,因此train/test可能根本不是20/80大小。
解决方案
使用此数据测试的解决方案
w41d8nur2#
vsaztqbk3#
如果您的主要目标是在保留组的同时拆分数据,并且您希望使用惰性计算引擎,那么Dask确实是一个不错的选择。
我的方法是手动的,不像使用
GroupShuffleSplit
那样优雅,但它可以达到目的,但如果您的数据已经在Parquet文件中,您可以使用dd.read_parquet()
将其直接读入Dask DataFrame。对于.compute()
方法,它将触发Dask中的实际计算,在此之前,一切都只是一个懒惰的操作。tquggr8v4#
如果您只想使用GroupBy方法,这里有一种方法可以实现。
相同的示例输出为
你也可以通过使用
group_names
变量来添加 Shuffle 和其他功能,为了简洁起见,这里没有包括在内。jutyujz05#
您可以使用
dask.dataframe
对Parquet数据集执行分组和拆分操作。下面是一个示例代码片段,它应该可以完成您所描述的内容:此代码使用
dask.dataframe
加载Parquet文件并执行分组和拆分操作。dask.model_selection
中的GroupShuffleSplit
类用于将数据分为训练集和测试集。random_state
参数设置为42以确保再现性。生成的训练和测试 Dataframe 将是dask Dataframe ,然后您可以将其用于进一步的处理或建模任务。请注意,由于您正在处理大型数据集,因此建议使用dask Dataframe 而不是pandas Dataframe 以避免内存限制。