Строка F внутри цикла For

Я не понимаю, почему это не работает. Я пытаюсь выполнить цикл For Loop, чтобы сохранить свои меры ошибок:

error = []
naive_list = list(['24', '168', 'standard', 'custom'])
for i in naive_list:
    for j in range(1,5):
        rmse = mean_squared_error(df_test["f'Price_REG{j}'"], f'df_test_{i}'["f'Price_REG{j}'"], squared=False)
        mae = mae(df_test["f'Price_REG{j}'"], f'df_test_{i}'["f'Price_REG{j}'"])
        error.append(rmse)
        error.append(mae)

Идея состоит в том, чтобы сохранить все эти 16 мер, чтобы я мог получить их позже, будь то в отдельных переменных, в dict или в списке.

Сначала я попытался использовать f'string и для имени переменной f'rmse_{i}_{j} = mean_squared_error(df_test["f'Price_REG{j}'"], f'df_test_{i}'["f'Price_REG{j}'"], squared=False), но, видимо, это невозможно. Поэтому вместо этого я попытался поместить их всех в один список, как указано выше. Но я получаю сообщение об ошибке на f'string KeyError: "f'Price_REG{j}'".

Зачем вам включать ваши "f-строки" внутри строки? Так что это никогда не будет оценено. Если вы хотите фа-строку, сделайте это df_test[f'Price_REG{j}'] и т. д.

Giacomo Catenazzi 30.11.2022 15:29

да, f в f-строках стоит перед первой кавычкой, а не внутри кавычек.

topsail 30.11.2022 15:30

@GiacomoCatenazzi Я не знал, что это не будет оцениваться. Причина в том, что df_test[Price_REG1] не работает, так как мне нужно, чтобы столбец находился в кавычках внутри скобок, например df_test['Price_REG1']

Simon Rydstedt 01.12.2022 06:42
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это df_test["f'Price_REG{j}'"] буквально означает строку df_test["f'Price_REG{j}'"]. Дальше оцениваться не будет. Это строковый литерал.

Вместо этого df_test[f'Price_REG{j}'] БУДЕТ оцениваться и возвращать все, что находится в Price_REG{j}, а затем извлекать столбец с тем же именем из df.

При этом, поскольку эта f-строка содержит только переменную, она функционально эквивалентна просто df_test[Price_REG{j}].

Вы загнали себя в угол чрезмерной инженерией. Никакие f-строки и строковые литералы с f-строками внутри здесь не нужны. Только сами переменные, без кавычек вокруг них.

Вместо:

error = []
naive_list = list(['24', '168', 'standard', 'custom'])
for i in naive_list:
    for j in range(1,5):
        rmse = mean_squared_error(df_test[Price_REG{j}], df_test_{i}[Price_REG{j}], squared=False)
        mae = mae(df_test[Price_REG{j}], df_test_{i}[Price_REG{j}])
        error.append(rmse)
        error.append(mae)

В чем я не уверен, так это в том, что такое df_test_ или для чего предназначено df_test_{i}. Я также не совсем понимаю фигурные скобки Price_REG{j} (это должны быть квадратные скобки? Что такое Price_REG?). Но в любом случае, по крайней мере, вы свободны от своего нарисованного угла и продолжаете ковырять любые другие изломы, которые могут появиться в этом коде.

Я боролся с этими вещами, зная, когда использовать f'strings или нет. Я думал, что фигурные скобки — единственный способ поместить эти разные итерации в строку. Квадратные скобки тоже подойдут? Price_REG{j} используется для сравнения меры ошибки для 4 разных регионов одновременно. df_test — это просто цены, с которыми я сравниваю свои прогнозируемые цены, ´df_test_{i}` — это прогнозируемые цены, поэтому df_test_24 — это одна из прогнозируемых серий, что означает, что первые итерации будут сравнивать исходные цены в регионе 1 с df_test_24 прогнозируемые цены в регионе 1.

Simon Rydstedt 01.12.2022 06:30

ваш пример дает мне неверный синтаксис. Разве я не обязан использовать кавычки в квадратных скобках для обозначения столбца, например df['Column1']

Simon Rydstedt 01.12.2022 06:48

ОЙ! Теперь я вижу фигурные скобки. Вы используете f-строки для динамического обращения к переменным. Я не знаю, почему я не обернул голову вокруг этого. Это очень креативно. Итак... Вместо динамического обращения к переменным используйте вместо этого словарь. df_dict = {"df_test_1":df_test_1, "df_test_2": df_test_2, "df_test_3":df_test3 ...} и price_reg_dict = {"Price_Reg1": Price_REG1, "Price_REG2":Price_REG2... }. Затем в вашем коде вы можете сделать mae = mae(df_test[price_reg_dict["Price_REG"+j]], df_dict["df_test_" + i][price_reg_dict["Price_REG"+j]]) Это даст вам наше «начало» f-строки.

JNevill 01.12.2022 16:28

Мой основной шаблон здесь: «Каждый раз, когда вы думаете Dynamically referring to variables или variable variable names, вместо этого думайте Dictionaries». Это то же самое почти во всех языках, даже в тех, которые поддерживают динамические ссылки на переменные, такие как php. Это просто плохая практика, когда словари доступны.

JNevill 01.12.2022 16:30

Спасибо за ваш ответ. Многие из моих решений имеют тенденцию быть творческими, но, возможно, не оптимальными. Я постараюсь привыкнуть к использованию dict при выполнении подобных вещей в будущем. Я нашел альтернативное решение, прежде чем вы ответили, я изменил переменную j на naive_list = (['df_test_24', 'df_test_168', 'df_test_standard', 'df_test_custom']), а затем mae = mean_absolute_error(df[column].iloc[s:m], locals()[j][column].iloc[s:m]). Таким образом, locals()[j] будет df_test_24 в первой итерации и так далее.

Simon Rydstedt 02.12.2022 09:35

Другие вопросы по теме