Я не понимаю, почему это не работает. Я пытаюсь выполнить цикл 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 в f-строках стоит перед первой кавычкой, а не внутри кавычек.
@GiacomoCatenazzi Я не знал, что это не будет оцениваться. Причина в том, что df_test[Price_REG1] не работает, так как мне нужно, чтобы столбец находился в кавычках внутри скобок, например df_test['Price_REG1']






Это 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.
ваш пример дает мне неверный синтаксис. Разве я не обязан использовать кавычки в квадратных скобках для обозначения столбца, например df['Column1']
ОЙ! Теперь я вижу фигурные скобки. Вы используете 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-строки.
Мой основной шаблон здесь: «Каждый раз, когда вы думаете Dynamically referring to variables или variable variable names, вместо этого думайте Dictionaries». Это то же самое почти во всех языках, даже в тех, которые поддерживают динамические ссылки на переменные, такие как php. Это просто плохая практика, когда словари доступны.
Спасибо за ваш ответ. Многие из моих решений имеют тенденцию быть творческими, но, возможно, не оптимальными. Я постараюсь привыкнуть к использованию 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 в первой итерации и так далее.
Зачем вам включать ваши "f-строки" внутри строки? Так что это никогда не будет оценено. Если вы хотите фа-строку, сделайте это
df_test[f'Price_REG{j}']и т. д.