Есть ли эффективный способ преобразования списков DataFrames в массивы Numpy? - PullRequest
0 голосов
/ 16 октября 2019

В настоящее время у меня есть данные временных рядов, которые я разбил на партии для использования с моделями глубокого обучения. Весь имеющийся у меня CSV-файл имеет размер (33000, 149), и я пытаюсь сделать из этих данных пакеты, состоящие из еще меньших мини-пакетов размером (100, 40), в виде скользящего окна.

Общие данные, которые у меня будут - это вложенный словарь, который выглядит примерно так:

data[fold][day][batch][minibatch]
  1. fold относится к тому, какой CSV-файл у нас (есть 9 файлов),
  2. day относится к тому, в какой день мы находимся (общее количество партий будет разделено поровну в зависимости от количества дней),
  3. batch - это партии, которые составляют один день. ,
  4. minibatch - это, по сути, список, содержащий 32 из этих «окон», каждое из которых имеет размер (100, 40).

Например, если первый CSV-файл содержит 33 000 строк,тогда я бы:

  1. Перебрать строки и установить счетчик, который будет считаться до 32.
  2. Как только счетчик достигнет 32, я добавляю список minibatches в список batch.
  3. После добавления всех этих мини-пакетов я вычисляю, насколько большойПакет должен равномерно соответствовать числу дней.

Код, который я написал, выглядит примерно так:

batches = []
minibatches = np.empty(shape=(32, 100, 41))
count = 1

df = data[0] # First CSV file DataFrame.

start = time.time()
idx_end = df.shape[0] - 100
for idx in range(idx_end):
    dataframe = df.iloc[idx:(idx + 100)] # Get 100 rows for each window.
    minibatches[count - 1] = dataframe # Append the window to the corresponding index.
    if count == 32: # Append the minibatches to batch once it reaches 32.
        batches.append(minibatches)
        minibatches = np.empty(shape=(32, 100, 41))
        count = 0
    count += 1

end = time.time() - start
print('Took about {0:.2f} seconds.'.format(end))

Весь этот блок кода занял 1805 секунд (30 минут), что, честно говоря, очень неожиданно. Перед использованием np.empty я использовал обычные списки, и производительность была намного, намного лучше (обычно менее 30 секунд).

Причина, по которой я попробовал этот код, заключается в том, что если я хочу передать данные вмодели, данные должны иметь размер (32, 100, 40), и я не мог придумать какие-либо другие методы для преобразования списка, содержащего DataFrames, в массив Numpy.

Существует ли более эффективный способ преобразования списков, содержащих DataFrames, вNumpy массивы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...