2016-03-21 6 views
0
f = pd.read_hdf('Sensor_Data.h5','f') 
pieces = [f[x: x + 360] for x in xrange(504649)] 
df = pd.concat(pieces) 

Утро все. У меня есть файл с 500 000 строк. Я хочу взять 360 строк из этого и каждый раз перемещать их по 1 строке. (Таким образом, у меня будет много данных.)Pandas Dataframe: Отсутствие памяти. Что лучше здесь?

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

EDIT: Чтобы добавить некоторый контекст, это файл .h5, и я использую dataframe pandas, чтобы попробовать и нарезать его таким образом. Я пытаюсь создать массив данных для подачи в глубокую нейронную сеть с использованием caffenet, хотя формат, который будет на этом этапе, будет неясным ...

Код работает для небольших объемов данных. Просто не для больших. Чтобы быть более ясным, что я пытаюсь сделать: импорт панды как э.р.

df = pd.DataFrame(np.random.randn(10,6)); df 

[отображает таблицу 6 х 10 случайных чисел] сейчас:

pieces = [df[x: x + 4] for x in xrange(7)] 
f = pd.concat(pieces) 
f 

Diplays новая таблица аналогична предыдущий, но расширенный. В настоящее время он имеет ряды 0,1,2,3,1,2,3,4,2,3,4,5,3,4,5,6 ...

Теперь «штуки» не являются кадром данных по сути, сам объект, но «список». Есть ли простой способ превратить все эти отдельные наборы данных (0,1,2,3), (1,2,3,4) и т. Д. В сам объект dataframe? (Вместо конкатенации их вместе в один dataframe

Я надеюсь, что это имеет смысл

+0

Мой предпочтительный способ обработки больших объемов данных с помощью ['numpy.memmap'] (http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.memmap.html) , Один недостаток заключается в том, что вам нужно преобразовать ваши данные в двоичный формат, который можно понять с помощью 'memmap', но после этого вы можете легко работать с огромными наборами данных. Вам действительно нужно хранить все эти избыточные данные для ваших фрагментов? Каково конечное использование этих срезов? Возможно, было бы лучше просто создать итератор. –

+1

Ну, вы в основном берете свои данные и умножаете их на 360, верно? Но этот окончательный блок данных заполнен множеством избыточных данных, что бессмысленно.Думаю, вы делаете это для последующих расчетов? Но есть лучшие способы сделать эти вычисления, чем тратить память. например перемещение/расширение функций, расширенное (фантастическое) индексирование и т. д. Я подозреваю, что вам нужно сделать, это подумать о том, как делать вычисления, а не о том, как расширить объем памяти. – JohnE

+0

Да, это для целей более поздних вычислений. Я отредактирую вопрос, чтобы быть немного яснее ... что я должен делать, учитывая новый контекст? –

ответ

0

Рассмотрите возможность использования h5py От the website:. «. Например, вы можете нарезать многотерабайтные наборы данных, хранящихся на диске, как если бы они были реальными массивами NumPy ».

0

Итак, у вас есть пара вопросов. Сначала самое простое: штука - это список, потому что вы создали его, используя понимание списка, это должен быть список объектов dataframe. использовать их в качестве отдельных объектов фрейма данных, которые вы можете просто индексировать в список (например, куски [0] и т. д.).

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

for x in xrange(504649): 
    result = my_func(df[x:x+360]) 

таким образом каждый срез отпускается после его использования. И, надеюсь, результат намного меньше кадра.

Вы также можете так же, как и выше, написать все наши фрагменты, чтобы отделить файлы cvs и прочитать их по мере необходимости.

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