2016-03-15 1 views
3

Я использую данные CSV реализовать мои сценарии и хотел попробовать эти данные в двух наборах данных:Python: как пробовать данные в наборах данных Test and Train?

  1. Test Data
  2. Поезд данных

я хочу попробовать наборы данных 85% и 15% и хотите вывести два файла CSV. Test.csv и Train.csv

Я хочу, чтобы это было сделано в базовом Python и вы не хотите использовать какой-либо другой внешний модуль, такой как Numpy, SciPy, Pandas или Scikitlearn , Может ли кто-нибудь помочь мне в случайной выборке данных в процентах. Более того, мне будут предоставлены наборы данных, которые могут иметь случайное число наблюдений. До сих пор я только что прочитал о Pandas и различных других модулях, чтобы пробовать данные по процентам и не получил никакого конкретного решения для моей проблемы.

Кроме того, я хочу сохранить заголовки CSV в обоих файлах. Поскольку заголовки будут делать каждую строку доступной и могут использоваться в дальнейшем анализе.

+0

Ваше сообщение очень широкое. Подробно о том, что вы уже пробовали. Используйте вопросительный знак, чтобы уточнить, какой вопрос вы задаете. –

+0

@MartinCowie Я только что изучил веб-поиск. Пока ничего не пробовал. Был поиск логики, и я хочу создать два файла из существующего файла. 'Test.csv' и' Train.csv' из masterfile 'data.csv', я хочу, чтобы 85% данных были в' test.csv' и оставались 15% -ными данными в 'train.csv' –

ответ

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) 
+0

csv.writer не имеет объекта с именем 'write', я думаю, что это должны быть стираторы? –

+0

Извините, исправлено –

+0

hatsoff! но данные также содержат заголовки. и заголовки вошли в один файл и не были во втором. любой способ сохранить заголовки в обоих файлах –

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. Если для вас подходят менее точные разделы, решение Питера Вуда будет намного более эффективным.

+0

. Я желаю, чтобы это работало с данными CSV тоже? –

+0

Что вы подразумеваете под "CSV data"? Вы не упомянули, как вы храните свои данные в вопросе, поэтому я просто предположил, что «данные» представляют собой последовательность наблюдений. – Callidior

+0

Мне жаль, если я не упомянул. Но на данный момент мои данные находятся в формате CSV, и я хочу соответствующим образом опробовать данные. но в любом случае спасибо. :) –

Смежные вопросы