#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 столбцов данных. К сожалению, это не то, что я ищу. Если вы посмотрите на вопрос, а также на изображение формата, я бы хотел, чтобы данные каждого файла можно было идентифицировать по его ярлыку. Одна строка для времени, затем все данные о напряжении ниже, с конечной целью в конце (папка, в которой сохранен файл).