Как я могу смешать функции Datetime & int с Scikit learn? - PullRequest
1 голос
/ 08 января 2020

У меня есть pandas DataFrame, который выглядит следующим образом:

                      pta                 ptd              dep_at
4     2020-01-08 05:17:00                 NaT                 NaT
6     2020-01-08 05:29:00 2020-01-08 05:30:00                 NaT
9     2020-01-08 05:42:00 2020-01-08 05:44:00 2020-01-08 05:44:00
11    2020-01-08 05:53:00 2020-01-08 05:54:00 2020-01-08 05:55:00
12    2020-01-08 06:03:00 2020-01-08 06:05:00 2020-01-08 06:04:00

И dtypes:

pta       datetime64[ns]
ptd       datetime64[ns]
dep_at    datetime64[ns]
dtype: object

Я использую их, чтобы предсказать другой столбец, arr_at, что также datetime64[ns]. Выполнение этого работает нормально:

X = df[['pta','ptd','dep_at']]
y = df.arr_at
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3) # 70% training and 30% test
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
print("Accuracy:",metrics.accuracy_score(y_test, y_pred))

Я пытаюсь добавить еще один столбец объектов, поэтому мой ввод теперь выглядит следующим образом:

                   pta                 ptd              dep_at  tpl_num
4  2020-01-08 05:17:00                 NaT                 NaT        0
6  2020-01-08 05:29:00 2020-01-08 05:30:00                 NaT        1
9  2020-01-08 05:42:00 2020-01-08 05:44:00 2020-01-08 05:44:00        2
11 2020-01-08 05:53:00 2020-01-08 05:54:00 2020-01-08 05:55:00        3
12 2020-01-08 06:03:00 2020-01-08 06:05:00 2020-01-08 06:04:00        4

(и dtypes):

pta        datetime64[ns]
ptd        datetime64[ns]
dep_at     datetime64[ns]
tpl_num             int64
dtype: object

Но теперь, когда я запускаю тот же код KNN, что и раньше, меняя только

X = df[['pta','ptd','dep_at']]

на

X = df[['pta','ptd','dep_at','tpl_num']]

, я получаю эту ошибку:

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

Я не могу понять, что пошло не так. Следует отметить, что таким образом я добавляю столбец к данным объекта, хотя я почти уверен, что это ни на что не влияет:

#Map station names in csv to ints, using dictionary comprehension
tpl_class = {k: v for v, k in enumerate(df.tpl.unique())}
#Apply to data
df['tpl_num'] = [tpl_class[i] for i in df.tpl]

1 Ответ

1 голос
/ 09 января 2020

Я думаю, что это происходит потому, что в вашем knn теперь есть смешанные типы.

Обходной путь для этого состоит в преобразовании вашего datetime [ns] в integer (например, для одного столбца) :

df['pta'] = pd.to_datetime(df['pta']).astype(np.int64)

Включите это для всех столбцов даты и времени, прежде чем выбрать X, и тогда он должен работать.

...