Эффективная загрузка и хранение данных с помощью Dask путем изменения одного столбца за раз

#python #pandas #csv #dask

#python #pandas #csv #dask

Вопрос:

Я нахожусь в процессе реализации анализатора csv с использованием фреймов данных Dask и pandas. Я бы хотел, чтобы он загружал только те столбцы, которые ему нужны, чтобы он хорошо работал и не требовал загрузки больших объемов данных.

В настоящее время единственный метод, который я нашел для записи столбца в фрейм данных parquet / Dask, — это загрузка всех данных в виде фрейма данных pandas, изменение столбца и преобразование из pandas.

 all_data = self.data_set.compute()              # Loads all data, compute to pandas dataframe
all_data[column] = column_data                  # Modifies one column
self.data_set = dd.from_pandas(all_data, npartitions=2) # Store all data into dask dataframe
  

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

Я удалил большую часть кода, но вот пример функции, которая предназначена для нормализации данных только для одного столбца.

 import pandas as pd
import dask.dataframe as dd

def normalise_column(self, column, normalise_type=NormaliseMethod.MEAN_STDDEV):
  column_data = self.data_set.compute()[column] # This also converts all data to pd dataframe
  
  if normalise_type is NormaliseMethod.MIN_MAX:
    [min, max] = [column_data.min(), column_data.max()]
    column_data = column_data.apply(lambda x: (x - min) * (max - min))

  elif normalise_type is NormaliseMethod.MEAN_STDDEV:
    [mean, std_dev] = [column_data.mean(), column_data.std()]
    column_data = column_data.apply(lambda x: (x - mean) / std_dev)

  all_data = self.data_set.compute()
  all_data[column] = column_data
  self.data_set = dd.from_pandas(all_data, npartitions=2)
  

Может кто-нибудь, пожалуйста, помочь мне сделать это более эффективным для больших объемов данных?

Ответ №1:

Из-за двоичной природы формата parquet и того, что сжатие обычно применяется к фрагментам столбцов, никогда невозможно обновить значения столбца в файле без полного цикла загрузки-обработки-сохранения (количество байтов не останется постоянным). По крайней мере, Dask должен позволить вам выполнять это раздел за разделом, не нарушая память.

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