У меня есть список из n значений (в моем случае n=19), и я хочу сгенерировать все возможные комбинации этих значений. Моя цель — использовать каждую комбинацию в качестве фильтра для кадра данных Polars, перебирать комбинации, выполнять некоторые функции и сохранять результаты в новый кадр данных.
Однако, поскольку n=19 , это дает 19! комбинации, которые перегружают мою оперативную память. Перебирать такое большое количество комбинаций непрактично из-за ограничений памяти.
Как я могу эффективно выполнить эти вычисления, не потребляя слишком много оперативной памяти? Есть ли способ уменьшить использование памяти или обработать это итеративно, не сохраняя все в памяти одновременно? Есть какие-нибудь предложения по оптимизации этого рабочего процесса с помощью Polars?
Мой текущий подход:
import polars as pl
import itertools
states = ["a", "b", "c", "d"]
df = pl.DataFrame({
"ID": [1, 2, 3, 4, 5, 6,7,8,9,10],
"state": ["b", "b", "a", "d","a", "b", "c", "d","c", "d"],
"Value" : [3,6,9,12,15,18,21,24,27,30],
})
all_combinations = []
for r in range(1,len(states)+1):
all_combinations.extend(itertools.combinations(states, r))
def foo(df):
return(
df
)
new_rows = []
for i in range(len(all_combinations)):
df_filtered = df.filter(pl.col("state").is_in(all_combinations[i]))
df_func = foo(df_filtered)
x = df_func.shape[0]
new_rows.append({"loop_index": i, "shape": x})
df_final = pl.DataFrame(new_rows)
df_final
РЕДАКТИРОВАТЬ: Спасибо за отзыв! Я понял, что мой нынешний подход не оптимален. Скоро я опубликую новый вопрос с полным контекстом.
EDIT2: вот ссылка с полным контекстом
У меня есть список из n значений (в моем случае n=19), и я хочу сгенерировать все возможные комбинации этих значений. Моя цель — использовать каждую комбинацию в качестве фильтра для кадра данных Polars, перебирать комбинации, выполнять некоторые функции и сохранять результаты в новый кадр данных. Однако, поскольку n=19 , это дает 19! комбинации, которые перегружают мою оперативную память. Перебирать такое большое количество комбинаций непрактично из-за ограничений памяти. Как я могу эффективно выполнить эти вычисления, не потребляя слишком много оперативной памяти? Есть ли способ уменьшить использование памяти или обработать это итеративно, не сохраняя все в памяти одновременно? Есть какие-нибудь предложения по оптимизации этого рабочего процесса с помощью Polars? Мой текущий подход: [code]import polars as pl import itertools
for r in range(1,len(states)+1): all_combinations.extend(itertools.combinations(states, r))
def foo(df): return( df )
new_rows = []
for i in range(len(all_combinations)): df_filtered = df.filter(pl.col("state").is_in(all_combinations[i])) df_func = foo(df_filtered) x = df_func.shape[0] new_rows.append({"loop_index": i, "shape": x})
df_final = pl.DataFrame(new_rows) df_final
[/code] РЕДАКТИРОВАТЬ: Спасибо за отзыв! Я понял, что мой нынешний подход не оптимален. Скоро я опубликую новый вопрос с полным контекстом. EDIT2: вот ссылка с полным контекстом