-1

Нужно передать 4 переменных во вторую функцию. Вот код

def Data():
    money = pd.read_excel("usd_exchange_rate.xlsx") #Датафрейм
    values = money.curs
    past = 7 * 4 # на основе данных за последние 4 недели
    future = 7 # будем предсказывать тренд на неделю вперед
    start = past
    end = len(values) - future
    raw_df = []
    for i in range(start, end): # Для каждой строчки (т.е. для каждого дня)
        p_and_f_val = values[(i-past):(i+future)] # Выбирает данные за прошлое и будущее
        raw_df.append(list(p_and_f_val))
    past_col = [f"past_{i}" for i in range(past)] # Название для колонок в прошлом
    future_col = [f"future_{i}" for i in range(future)] # Название колонок в будущем
    df = pd.DataFrame(raw_df, columns=(past_col + future_col)) # Преобразованные данные
    x = df[past_col][:-1] # Входные данные (то, на чем будет обучаться модель)
    y = df[future_col][:-1] # Выходные данные (то, что мы модель должна вывести в своем предсказании)
    x_test = df[past_col][-1:] # Данные, на основе которых будет сделано предсказание
    y_test = df[future_col][-1:] # Реальные данные, которые будут сравниваться с предсказанными
    return x, y, x_test, y_test
Data()
def LR(x, y, x_test, y_test):
    LinReg = LinearRegression()
    LinReg.fit(x,y) # Запускает метод обучения
    prediction = LinReg.predict(x_test) # Данные предсказанные моделью
    plt.plot(prediction[0], label="Предсказание") # Предсказанные данные на графике
    plt.plot(y_test.iloc[0], label="Реальные данные") # Реальные данные на графике
    plt.legend() # Отображение графика с указаниями
    plt.show()
    mean_absolute_error(prediction[0], y_test.iloc[0]) # Ошибка. Разница между предсказанием и реальными данными
LR(x,y,x_test,y_test)

Ошибка

LR(x,y,x_test,y_test)
NameError: name 'x' is not defined

При

LR(Data())

Ошибка

TypeError: LR() missing 3 required positional arguments: 'y', 'x_test', and 'y_test'

В общем при любом раскладе выдает ошибку (при global тоже). Все примеры перерыл в инете, ни один не заработал. Объясните, пожалуйста, почему не работает? И как оно вообще работает?

  • Вместо рытья интернетов нужно рыть учебники, чтобы понять, как что использовать, а также читать текст ошибок. Там ясным языком написано, в чем проблема и почему не работает. А на stackoverflow driven development далеко не уедешь. – Эникейщик Feb 17 '20 at 16:15
  • @Эникейщик, перевести текст ошибки мне не составило труда. И в чем собственно разница между учебником и интернетом в конкретно этом вопросе? Все эти книги есть в инете и даже примеров больше. А раз вы говорите книги читать, так приведите в пример хоть одну. И вам в карму плюс и людям польза. А пустословием и я заниматься могу. – Brain of Мadness Feb 18 '20 at 08:14
  • 1
    Если не составило труда перевести, то видимо составило труд понять. Ведь там же всё написано. Разница между интернетом и учебником в данном случае в том, что в учебнике написано, как использовать функции, мимо не пройдешь. Судя по приведенному коду, в этом месте у вас пробел. В пример могу привести Mark Lutz "Programming Python". И тут еще примерно 100500 перечислено. – Эникейщик Feb 18 '20 at 08:25

1 Answers1

2

Вместо

LR(Data())

используйте

LR(*Data())

Либо сначала сохраните результат первой функции, а потом явно передавайте во вторую:

x, y, x_test, y_test = Data()
LR(x,y,x_test,y_test)

На вопрос "почему не работает":

  1. В первом вашем коде результат первой функции вообще никак не передаётся во вторую, поэтому и не работает.

"при global тоже" - надо смотреть конкретный код. Теоретически, с global как раз-таки должно было бы заработать, видимо, вы просто как-то неправильно их используете. Но global вообще лучше никогда не использовать, так что хорошо, что оно у вас не заработало xDD

  1. Во втором вашем коде - когда из функции вы возвращаете несколько значений через запятую, вы таким образом упаковываете их в один кортеж. А так как LR ожидает в качестве аргументов не один кортеж, а 4 отдельных переменных, то сначала этот кортеж нужно обратно распаковать. Именно это я и сделал в моём первом примере (где звёздочка).
Xander
  • 20,499