Python / Pandas: аргумент TypeError: float () должен быть строкой или числом, а не «функцией» - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь создать график из двух столбцов в файле .csv. Столбец для оси x имеет краткий формат даты мм / дд / гггг, тогда как столбец для оси y соответствует данным измерения поглощения в виде обычных числовых значений. Исходя из этого, я также пытаюсь собрать линию линейной регрессии на этом графике. Вот что у меня есть:

mydateparser = lambda x: datetime.strptime(x, '%m/%d/%y')

df = (pd.read_csv('calibrationabs200211.csv', index_col=[], parse_dates=[0],
                  infer_datetime_format=True, date_parser=mydateparser))

if mydateparser == '%m/%d/%y':
    print('Error')
else:
    mydateparser = float(mydateparser)

plt.figure(figsize=(15,7.5))

x = df.iloc[:, 0].values.reshape(-1, 1)
y = df.iloc[:, 1].values.reshape(-1, 1)
linear_regressor = LinearRegression()
linear_regressor.fit(x, y)
y_pred = linear_regressor.predict(y)

plt.scatter(x, y, color='teal')
plt.plot(x, y_pred, color='teal')

plt.show()

Однако я получаю сообщение об ошибке:

TypeError                                 Traceback (most recent call last)
<ipython-input-272-d087bdc00150> in <module>
     12     print('Error')
     13 else:
---> 14     mydateparser = float(mydateparser)
     15 
     16 plt.figure(figsize=(15,7.5))

TypeError: float() argument must be a string or a number, not 'function'

Более того, если я закомментирую оператор If, я получаю график, , но с ошибочной линейной регрессией. Я довольно новичок в python, matplotlib и pandas, поэтому любая помощь или обратная связь очень важны. Спасибо!

Ответы [ 3 ]

1 голос
/ 12 февраля 2020

Функции в Python могут использоваться как переменные, что вы и делаете здесь. Если вы хотите использовать результат функции для чего-то, вам нужно вызвать его, добавив () после имени функции.

mydateparser - это функция, mydateparser () - это результат вызова этой функции.

Кроме того, я не думаю, что сравнение, которое вы проводите, имеет смысл. datetime.strptime возвращает объект datetime, который вы позже сравниваете со строкой. Я на самом деле не уверен, что вы пытаетесь выполнить sh с этим блоком вообще.

Ваша регрессия требует, чтобы даты были преобразованы в какое-то числовое значение c, чтобы регрессировать. Я бы предложил использовать функции преобразования даты в matplotlib, в частности date2num, чтобы попробовать это.

Должно быть что-то вроде:

from matplotlib import dates
...
x = df[0].apply(dates.date2num)
0 голосов
/ 12 февраля 2020

В начале кода вы объявили mydateparser как лямбда-функцию. Но функция float () принимает только строки или числа.

Я предполагаю, что вы используете столбец даты в качестве функции для модели линейной регрессии, которая не имеет смысла.

Вместо этого вы можете получить новый такие функции, как месяц, год, дата, день недели / выходные, которые будут использоваться для линейной регрессии.

Если вы хотите предсказать значение для следующих дат, вы можете посмотреть модели прогнозирования временных рядов.

0 голосов
/ 12 февраля 2020

Вы должны вызвать лямбду, чтобы она функционировала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...