Моя проблема: у меня есть огромный список файлов 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
Есть ли способ применить функцию «applycast()» ко всем столбцам за один раз? Поскольку в настоящее время я просматриваю каждый столбец, что, как мне кажется, является причиной того, что это занимает гораздо больше времени. Хотя содержимое каждого столбца у меня разное, но тип данных — List[str], который необходимо преобразовать в List[f64].
Я пытался объединить все кадры данных перед применением datatransform(), но объединение заняло еще больше времени. Я думал об использовании API «Ray» для параллельного выполнения, но он не поддерживает последнюю версию Python3.11. Как я могу сократить время вычислений или какой способ лучше всего перебирать несколько столбцов или несколько списков кадров данных/csv?
Подробнее здесь: https://stackoverflow.com/questions/763 ... ython-usin