Добавьте несколько csv-файлов из разных подкаталогов в один большой файл

#python #machine-learning #append #tensor

Вопрос:

В настоящее время я создаю систему обнаружения жестов с использованием метода машинного обучения случайного леса с использованием солнечных панелей. У меня есть 6 различных жестов (по часовой стрелке, свайп, раскрытый кулак и т. Д.). Я собрал данные по каждому жесту от 2 участников. Хотя я изо всех сил пытаюсь сосредоточиться на загрузке и организации данных для моего проекта, готовых для обучения, тестирования и проверки.

Оба участника повторили каждый жест по 30 раз. Программное обеспечение PicoScope, которое я использовал, записывало две переменные: Время и напряжение. Все это сохраняется в файле csv. Время является постоянной величиной во всех файлах, но напряжение меняется в зависимости от выполняемого выше жеста.

У меня есть несколько файлов, сохраненных в нескольких папках. Вот как изложены мои данные:

  • В настоящее время у меня есть две папки: участник 1, участник 2.
  • В папках участников есть еще 6 папок для представления каждого выполненного ими жеста (по часовой стрелке, свайп, открытый кулак и т. Д.).
  • В каждой папке с жестами находится 30 csv-файлов, которые представляют собой 30 повторений этого конкретного жеста
  • Затем csv-файлы содержат два столбца, Время и напряжение с 15 007 точками данных. Цель классифицируется по папке, в которой она хранится

Например — Участник 1/По часовой стрелке/Clockwise_23.csv

Я оставлю ссылку на набор данных здесь: ссылка на набор данных

Я никогда раньше не работал с несколькими файлами для машинного обучения, я считаю, что должен добавить все файлы вместе, прежде чем вводить их в модель машинного обучения. Я загружу изображение того, как, по моему мнению, должны выглядеть эти данные. Слева показано, как данные выглядят в настоящее время, справа-как данные должны быть отформатированы? формат

Я изучал приложение, но я не видел ничего близкого к этой сложности. У меня есть несколько подкаталогов. Я хотел бы получить набор данных со всеми csv-файлами со временем, напряжением и результирующей целью жеста. Его цель жеста можно найти по папке, в которой он сохранен. Может ли кто-нибудь помочь мне с этим?

Мне удалось добавить все файлы вместе, но в настоящее время все файлы добавляются под одними и теми же двумя заголовками, в результате чего у меня остается 5507348 столбцов. Я бы хотел, чтобы данные каждого файла можно было идентифицировать по его собственной метке. Одна строка для времени, затем все данные о напряжении ниже, с конечной целью в конце (папка, в которой сохранен файл).

Комментарии:

1. По сути, вы хотите указать путь к файлу (например, Участник 1/По часовой стрелке/Часовой Стрелке_23) в качестве 3 крайних левых столбцов в вашем выходном файле, за которыми следуют столбцы, уже содержащиеся в этом файле. Если вы можете решить, как перечислить все файлы (посмотрите os.path.walk() ), то у вас есть значения для этих 3 столбцов, а также имя файла для сканирования. Прочитайте каждый файл по очереди, добавьте идентифицирующие столбцы и запишите помеченные данные в один файл. csv Модуль справится с этим довольно просто. Вам, без сомнения, скажут «использовать pandas «, но с таким количеством данных у вас может закончиться память или время.

Ответ №1:

Если я правильно понимаю, вы хотите просмотреть каждый подкаталог и объединить все файлы в больший фрейм данных.

В приведенном ниже коде я начинаю с создания пустого фрейма данных, затем прохожу через 2 слоя подкаталогов, а затем начинаю читать файлы. Это будет циклически проходить через каждые только 2 слоя подкаталогов и попытается прочитать все файлы на этом уровне во временном фрейме данных, прежде чем объединить все в конечный соответствующий фрейм данных.

 from pathlib import Path
import os
import pandas as pd

df = pd.DataFrame()

rootpathsting= 'C:UsersYourNameRootDir'
rootdir = Path(rootpathsting)
level_1_dirs = [f for f in os.listdir(rootdir) if os.path.isdir(os.path.join(rootdir, f))]

for l1dir in level_1_dirs:
    print('Dir: ', l1dir)
    l1dirpathstring = rootpathsting   '\'   l1dir
    l1dirpath = Path(l1dirpathstring)
    level_2_dirs = [f for f in os.listdir(l1dirpath) if os.path.isdir(os.path.join(l1dirpath, f))]
    for l2dir in level_2_dirs:
          print('Dir: ', l2dir)
          l2dirpathstring = l1dirpathstring   '\'   l2dir
          l2dirpath = Path(l2dirpathstring)
          onlyfiles = [f for f in os.listdir(l2dirpath) if os.path.isfile(os.path.join(l2dirpath, f))]
          for f in onlyfiles:
                print('File: ', f)
                # I think you want the header of the dataframe to have columns for Time and Channel A and you want to skip reading some other rows... 
                temp_df = pd.read_csv(f, header=1, skiprows=[0, 2, 3])
                display(temp_df)
 

Редактировать
После этого момента я предполагаю, что temp_df это выглядит так:

      Time  Channel A
0    ##    ##
1    ##    ##
2    ##    ##
 

Если вы хотите добавить идентификацию файла, вы можете добавить мультииндекс в фрейм данных, например…

 temp_df = pd.concat({f:temp_df})

# output:
                           Time  Channel A
anti_clockwise_01     0    ##    ##
                      1    ##    ##
                      2    ##    ##
 

Тогда вы сможете объединить все в один фрейм данных. Я думаю, что это приведет к созданию фрейма данных с 2 индексами(имя файла и строка#) и 2 столбцами (Время и канал A).

 df = pd.concat([df, temp_df], axis=1)
 

Комментарии:

1. Это объединяет все файлы в 2 строки. Создание 5507348 столбцов данных. К сожалению, это не то, что я ищу. Если вы посмотрите на вопрос, а также на изображение формата, я бы хотел, чтобы данные каждого файла можно было идентифицировать по его ярлыку. Одна строка для времени, затем все данные о напряжении ниже, с конечной целью в конце (папка, в которой сохранен файл).