Скопируйте соответствующие файлы вместо инициализации новых. ⇐ Python
-
Гость
Скопируйте соответствующие файлы вместо инициализации новых.
Я хотел бы инициализировать объект в Python, загрузив и/или скопировав несколько внутренних фреймов данных для нескольких случаев (которые содержатся в списке: ["case1", "case2", "case3", "case4" "]. Инициализация этих фреймов данных может занять много времени, поэтому, если есть фрейм данных, доступный для другого случая с теми же настройками, я хотел бы скопировать этот фрейм данных вместо инициализации нового. Случаи, которые соответствуют друг друга хранятся в словаре: {"case1": ["case1", "case2", "case3"], "case4": ["case4]", т.е. я объединяю все сгруппированные случаев в списке и использовать первую запись в качестве ключа.Теперь это легко, если я хочу выполнить операцию, если я уже загрузил все фреймы данных, потому что я могу перебрать ключи для выполнения операции, а затем скопировать результаты во все соответствующие случаи в списке и избегайте выполнения одной и той же операции дважды для разных комбинаций настроек.
Однако ситуация усложняется, когда я хочу загрузить существующие файлы. Скажем, я хочу инициализировать объект с помощью фреймов данных для всех четырех случаев, и у меня есть необходимые фреймы данных для «case2» и «case4», хранящиеся в файлах. Это означает, что мне нужно загрузить только эти два, и я смогу получить кадры данных для «case1» и «case3», скопировав «case2». Однако я совершенно не понимаю, как мне это сделать.
Я начал так:
# Сохраняем, какие дела загружены match_cases_dict = {"case1": ["case1", "case2", "case3"], "case4": ["case4]"} unavailable_cases = ["case1", "case2", "case3", "case4"] доступные_кейсы = [] # Циклический просмотр случаев на всякий случай: целевой_файл = os.path.join(папка, регистр) если os.file_path.exists(target_file): # Функция загрузки файла unavailable_cases.remove(дело) доступные_кейсы.append(случай) Тогда у меня возникают проблемы, когда я пытаюсь скопировать фреймы данных в соответствующие случаи:
если недоступные_случаи: для unavailable_case в unavailable_cases: для ключа match_cases в match_case_dict.items(): для match_case в match_cases: если соответствующий_случай == недоступный_случай: если соответствующий_кейс в доступных_кейсах: данные[недоступный_кейс] == данные[соответствующий_кейс] доступные_кейсы.add(недоступный_кейс) unavailable_case.remove(unavailable_case) Поскольку мой объект все равно будет инициализировать два одинаковых кадра данных...
Большое спасибо!
РЕДАКТИРОВАТЬ: Полный код, возможно, проблема где-то еще:
def load_data(данные, реконструкция, имя_реконструкции, время_реконструкции, тип, all_cases, all_options, match_case_dict, топологии, вращения, files_dir): # Цикл по времени для реконструкции_времени в реконструкции_время: данные[reconstruction_time] = {} # Инициализировать список для хранения доступных и недоступных случаев unavailable_cases = deepcopy(all_cases) доступные_кейсы = [] # Если указан каталог файлов, проверьте наличие файлов если каталог_файлов: для случая в all_cases: file_path = os.path.join(files_dir, f"{case}_{reconstruction_name}_{reconstruction_time}.csv") если os.path.exists(путь_файла): данные[время_реконструкции][кейс] = DataFrame_from_csv(каталог_файлов, регистр, время_реконструкции, имя_реконструкции, тип) unavailable_cases.remove(дело) доступные_кейсы.append(случай) еще: print(f"DataFrame для {type} для {reconstruction_name} в {reconstruction_time} Ma для случая {case} не найден, проверка на наличие похожих случаев...") # Копируем кадры данных для недоступных случаев для unavailable_case в unavailable_cases: print("Недоступно: ", unavailable_cases) print("Доступно: ", доступные_кейсы) для ключа match_cases в match_case_dict.items(): для match_case в match_cases: если соответствующий_случай == недоступный_случай: если соответствующий_кейс в доступных_кейсах: data[reconstruction_time][unavailable_case] = data[reconstruction_time][matching_case].copy() доступные_кейсы.add(недоступный_кейс) unavailable_cases.remove(unavailable_case) если unavailable_case нет в данных[reconstruction_time]: print(f"Инициализация нового DataFrame для {type} для {reconstruction_name} в {reconstruction_time} Ma для случая {unavailable_case}...") если тип == "Тарелки": data[reconstruction_time][unavailable_case] = get_plates(топологии, повороты,reconstruction_time, 1, all_options[unavailable_case]["Идентификатор опорной пластины"]) если тип == "Плиты": data[reconstruction_time][unavailable_case] = get_slabs(reconstruction, Reconstruction_time, all_options[unavailable_case]["Интервал тесселяции плит"]) если тип == "Очки": data[reconstruction_time][unavailable_case] = get_points(reconstruction, Reconstruction_time, all_options[unavailable_case]["Интервал сетки"]) доступные_кейсы.append(недоступный_кейс) unavailable_cases.remove(unavailable_case) возвращать данные
Я хотел бы инициализировать объект в Python, загрузив и/или скопировав несколько внутренних фреймов данных для нескольких случаев (которые содержатся в списке: ["case1", "case2", "case3", "case4" "]. Инициализация этих фреймов данных может занять много времени, поэтому, если есть фрейм данных, доступный для другого случая с теми же настройками, я хотел бы скопировать этот фрейм данных вместо инициализации нового. Случаи, которые соответствуют друг друга хранятся в словаре: {"case1": ["case1", "case2", "case3"], "case4": ["case4]", т.е. я объединяю все сгруппированные случаев в списке и использовать первую запись в качестве ключа.Теперь это легко, если я хочу выполнить операцию, если я уже загрузил все фреймы данных, потому что я могу перебрать ключи для выполнения операции, а затем скопировать результаты во все соответствующие случаи в списке и избегайте выполнения одной и той же операции дважды для разных комбинаций настроек.
Однако ситуация усложняется, когда я хочу загрузить существующие файлы. Скажем, я хочу инициализировать объект с помощью фреймов данных для всех четырех случаев, и у меня есть необходимые фреймы данных для «case2» и «case4», хранящиеся в файлах. Это означает, что мне нужно загрузить только эти два, и я смогу получить кадры данных для «case1» и «case3», скопировав «case2». Однако я совершенно не понимаю, как мне это сделать.
Я начал так:
# Сохраняем, какие дела загружены match_cases_dict = {"case1": ["case1", "case2", "case3"], "case4": ["case4]"} unavailable_cases = ["case1", "case2", "case3", "case4"] доступные_кейсы = [] # Циклический просмотр случаев на всякий случай: целевой_файл = os.path.join(папка, регистр) если os.file_path.exists(target_file): # Функция загрузки файла unavailable_cases.remove(дело) доступные_кейсы.append(случай) Тогда у меня возникают проблемы, когда я пытаюсь скопировать фреймы данных в соответствующие случаи:
если недоступные_случаи: для unavailable_case в unavailable_cases: для ключа match_cases в match_case_dict.items(): для match_case в match_cases: если соответствующий_случай == недоступный_случай: если соответствующий_кейс в доступных_кейсах: данные[недоступный_кейс] == данные[соответствующий_кейс] доступные_кейсы.add(недоступный_кейс) unavailable_case.remove(unavailable_case) Поскольку мой объект все равно будет инициализировать два одинаковых кадра данных...
Большое спасибо!
РЕДАКТИРОВАТЬ: Полный код, возможно, проблема где-то еще:
def load_data(данные, реконструкция, имя_реконструкции, время_реконструкции, тип, all_cases, all_options, match_case_dict, топологии, вращения, files_dir): # Цикл по времени для реконструкции_времени в реконструкции_время: данные[reconstruction_time] = {} # Инициализировать список для хранения доступных и недоступных случаев unavailable_cases = deepcopy(all_cases) доступные_кейсы = [] # Если указан каталог файлов, проверьте наличие файлов если каталог_файлов: для случая в all_cases: file_path = os.path.join(files_dir, f"{case}_{reconstruction_name}_{reconstruction_time}.csv") если os.path.exists(путь_файла): данные[время_реконструкции][кейс] = DataFrame_from_csv(каталог_файлов, регистр, время_реконструкции, имя_реконструкции, тип) unavailable_cases.remove(дело) доступные_кейсы.append(случай) еще: print(f"DataFrame для {type} для {reconstruction_name} в {reconstruction_time} Ma для случая {case} не найден, проверка на наличие похожих случаев...") # Копируем кадры данных для недоступных случаев для unavailable_case в unavailable_cases: print("Недоступно: ", unavailable_cases) print("Доступно: ", доступные_кейсы) для ключа match_cases в match_case_dict.items(): для match_case в match_cases: если соответствующий_случай == недоступный_случай: если соответствующий_кейс в доступных_кейсах: data[reconstruction_time][unavailable_case] = data[reconstruction_time][matching_case].copy() доступные_кейсы.add(недоступный_кейс) unavailable_cases.remove(unavailable_case) если unavailable_case нет в данных[reconstruction_time]: print(f"Инициализация нового DataFrame для {type} для {reconstruction_name} в {reconstruction_time} Ma для случая {unavailable_case}...") если тип == "Тарелки": data[reconstruction_time][unavailable_case] = get_plates(топологии, повороты,reconstruction_time, 1, all_options[unavailable_case]["Идентификатор опорной пластины"]) если тип == "Плиты": data[reconstruction_time][unavailable_case] = get_slabs(reconstruction, Reconstruction_time, all_options[unavailable_case]["Интервал тесселяции плит"]) если тип == "Очки": data[reconstruction_time][unavailable_case] = get_points(reconstruction, Reconstruction_time, all_options[unavailable_case]["Интервал сетки"]) доступные_кейсы.append(недоступный_кейс) unavailable_cases.remove(unavailable_case) возвращать данные