我一直在使用CSV数据来实现我的脚本,并希望将数据采样到两个数据集中:
我想以85%和15%的分区对数据集进行采样,并希望输出两个CSV文件Test.csv和Train.csv
我希望它在基础Python中做,并且不想使用任何其他外部模块,如Numpy,SciPy,Pandas或Scikitlearn。任何人都可以帮助我按百分比随机抽样数据。此外,我将获得可能具有随机观察数的数据集。到目前为止,我刚刚阅读了有关Pandas和其他各种模块的数据,以百分比为基础对数据进行采样,并且没有针对我的问题找到任何具体的解决方案。
此外,我想在两个文件中保留CSV的标题。因为标题会使每一行都可访问,并可用于进一步分析。
答案 0 :(得分:2)
使用random.shuffle
创建数据集的随机排列,并根据需要对其进行切片:
import random
random.shuffle(data)
train = data[:int(len(data)*0.85)]
test = data[len(train):]
由于您请求了一个特定的解决方案,将一个可能很大的CSV文件划分为两个文件用于培训和测试数据,我还将展示如何使用类似于上述一般方法的方法来完成:
import random
# Count lines
with open('data.csv','r') as csvf:
linecount = sum(1 for lines in csvf if line.strip() != '')
# Create index sets for training and test data
indices = list(range(linecount))
random.shuffle(indices)
ind_test = set(indices[:int(linecount*0.15)])
del indices
# Partition CSV file
with open('data.csv','r') as csvf, open('train.csv','w') as trainf, open('test.csv','w') as testf:
i = 0
for line in csvf:
if line.strip() != '':
if i in ind_test:
testf.write(line.strip() + '\n')
else:
trainf.write(line.strip() + '\n')
因此,我假设CSV文件每行包含一个观察值。
这将创建准确的85:15分割。如果不太准确的分区对你来说是好的,那么Peter Wood的解决方案会更有效率。
答案 1 :(得分:2)
使用random
中的random module功能在0
和1
之间获得均匀分布的随机数。
如果> .85
写入训练数据,则写入测试数据。请参阅How do I simulate flip of biased coin in python?。
import random
with open(input_file) as data:
with open(test_output, 'w') as test:
with open(train_output, 'w') as train:
header = next(data)
test.write(header)
train.write(header)
for line in data:
if random.random() > 0.85:
train.write(line)
else:
test.write(line)