Ускорить очистку и преобразование данных в списке фреймов данных в Python с помощью поляров/панд?Python

Программы на Python
Anonymous
 Ускорить очистку и преобразование данных в списке фреймов данных в Python с помощью поляров/панд?

Сообщение Anonymous »

Как я могу перебирать большой список кадров данных Polars/Pandas в Python с очень быстрым временем вычислений, одновременно выполняя очистку/преобразование данных для каждого кадра данных?
Моя проблема: у меня есть огромный список файлов CSV (например, ~ 1 КБ), каждый файл размером около 20 МБ. Я преобразовал каждый из этих CSV-файлов в фреймы данных (я пробовал как pandas, так и полярные файлы, просто чтобы увидеть разницу во времени вычислений) и применил некоторые преобразования для очистки данных для каждого фрейма данных.
Каков эффективный способ сделать это, поскольку в настоящее время мое общее время вычислений, если я использую понимание списка, карту или даже циклы, составляет ~ 3 минуты для преобразования всех ~ 1 тыс. CSV-файлов в фреймы данных и ~ 2 минуты для выполнять преобразование для каждого кадра данных (т.е. 2x 1K = 2K минут для всех кадров данных 1K)? (Я использую Python3.11)
Ниже приведены более подробные сведения о том, что я пробовал до сих пор.
Фрагмент моего CSV (здесь упоминается только несколько строк и столбцов, чтобы дать представление), который преобразуется в фрейм данных, выглядит следующим образом (мой фактический CSV имеет ~ 10 тыс. строк и 400 столбцов в файле)

Код: Выделить всё

df = pl.from_repr("""
┌───────┬───────────────┬────────────────────┐
│ Index ┆ A             ┆ B                  │
│ ---   ┆ ---           ┆ ---                │
│ i64   ┆ str           ┆ str                │
╞═══════╪═══════════════╪════════════════════╡
│ 0     ┆ 203 X 345 457 ┆ 346 X X 457 45 46  │
│ 0     ┆ 11 22 44 890  ┆ 22 33 44 88 90 100 │
│ 0     ┆ X X 456 44 90 ┆ null               │
│ 1     ┆ null          ┆ 33 456 99 10 10 11 │
│ 1     ┆ null          ┆ null               │
└───────┴───────────────┴────────────────────┘
""")
По сути, я хочу преобразовать их во что-то вроде этого:

Код: Выделить всё

┌───────┬─────────────────────────────────┬────────────────────────────────────────┐
│ Index ┆ A                               ┆ B                                      │
│ ---   ┆ ---                             ┆ ---                                    │
│ i64   ┆ list[f64]                       ┆ list[f64]                              │
╞═══════╪═════════════════════════════════╪════════════════════════════════════════╡
│ 0     ┆ [203.0, null, 345.0, 457.0]     ┆ [346.0, null, null, 457.0, 45.0, 46.0] │
│ 0     ┆ [11.0, 22.0, 44.0, 890.0]       ┆ [22.0, 33.0, 44.0, 88.0, 90.0, 100.0]  │
│ 0     ┆ [null, null, 456.0, 44.0, 90.0] ┆ null                                   │
│ 1     ┆ null                            ┆ [33.0, 456.0, 99.0, 10.0, 10.0, 11.0]  │
│ 1     ┆ null                            ┆ null                                   │
└───────┴─────────────────────────────────┴────────────────────────────────────────┘
Мой код (в полярах) пока выглядит так:

Код: Выделить всё

import polars as pl

def convertdf(input):
return pl.read_csv(input)

def applycast(df,col):
dfcast     = df.explode(col).select('Index',pl.col(col)).with_columns(pl.col(col).is_not_null()).then(pl.col(col).cast(pl.Float64,strict=False))).group_by('Index').agg(pl.col(col)).sort('Index')
df = df.replace(col,    dfcast[col])
return df

def datatransform(df):
df =     df.select(df.columns[1:]).select(pl.col(pl.String).str.split(' '))
df = df.pipe(lambda df : reduce(lambda df,col: applycast(df,col), df.columns,df))
return df

csvfiles = ['input1.csv', 'input2.csv', 'input3.csv',....'input1000.csv']
df_files = list(map(convertdf, csvfiles)) #Time taken: 3mins
dftransformedfiles = [df.pipe(datatransform) for df in df_files] #Time taken: ~2K mins
По сути, как вы можете видеть, я использую понимание списка для перебора каждого файла CSV. Есть ли способ выполнить это параллельно?
Есть ли способ применить функцию «applycast()» ко всем столбцам за один раз? Поскольку в настоящее время я просматриваю каждый столбец, что, как мне кажется, является причиной того, что это занимает гораздо больше времени. Хотя содержимое каждого столбца у меня разное, но тип данных — List[str], который необходимо преобразовать в List[f64].
Я пытался объединить все кадры данных перед применением datatransform(), но объединение заняло еще больше времени. Я думал об использовании API «Ray» для параллельного выполнения, но он не поддерживает последнюю версию Python3.11. Как я могу сократить время вычислений или какой способ лучше всего перебирать несколько столбцов или несколько списков кадров данных/csv?

Подробнее здесь: https://stackoverflow.com/questions/763 ... ython-usin

Вернуться в «Python»