# -- Code Cell --
import pandas as pd
import numpy as np
train = pd.read_csv('dataset_train.csv')
test = pd.read_csv('dataset_eval.csv')

# -- Code Cell --
dt = pd.to_datetime(train["Activity Date"], format="%b %d, %Y, %I:%M:%S %p", utc=True)
train["month"] = dt.dt.strftime("%b")
test["month"] = dt.dt.strftime("%b")

# -- Code Cell --
train['Speed'] = train['Distance']/(train['Moving Time']/60/60)
test['Speed'] = test['Distance']/(test['Moving Time']/60/60)

# -- Code Cell --
train['month'].value_counts()

# -- Code Cell --
month_order = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]
avg_by_month = train.groupby("month")["Speed"].mean().reindex(month_order)

# -- Code Cell --
avg_by_month

# -- Code Cell --
avg_floor_5 = np.floor(avg_by_month.values * 1e5) / 1e5

# -- Code Cell --
train['Label'].value_counts()

# -- Code Cell --
train["hour"] = pd.to_datetime(
    train["Activity Date"],
    format="%b %d, %Y, %I:%M:%S %p"
).dt.hour
test["hour"] = pd.to_datetime(
    test["Activity Date"],
    format="%b %d, %Y, %I:%M:%S %p"
).dt.hour

# -- Code Cell --
test_ids = test['Activity ID']

# -- Code Cell --
train = train.drop(columns = ['Activity ID', 'Activity Date','month'])
test = test.drop(columns = ['Activity ID', 'Activity Date','month'])

# -- Code Cell --
train.info()


# -- Code Cell --
map_target = {'COMMUTE':0, 'LEISURELY_COMMUTE':1,'PURE_LEISURE':2}
train['Label'] = train['Label'].astype(str).map(map_target)

# -- Code Cell --
train['Label'].value_counts()

# -- Code Cell --
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from catboost import CatBoostClassifier
X = train.drop(columns = ['Label'])
y= train['Label']
X_train, X_test, y_train, y_test=train_test_split(X,y, test_size=0.2, random_state=42)
model = CatBoostClassifier(random_state=42)
scaler = StandardScaler()
X_train_sc = scaler.fit_transform(X_train)
X_test_sc = scaler.transform(X_test)
model.fit(X_train_sc,y_train)
y_pred = model.predict(X_test_sc)
acc = accuracy_score(y_test,y_pred)
acc

# -- Code Cell --


# -- Code Cell --
test.head()

# -- Code Cell --
X_scaled = scaler.fit_transform(X)        
test_scaled = scaler.transform(test)      

model.fit(X_scaled, y)
y_pred_final = model.predict(test_scaled)

# -- Code Cell --
inv_map_target = {0:'COMMUTE', 1:'LEISURELY_COMMUTE',2:'PURE_LEISURE'}
labels_final = pd.Series(np.ravel(y_pred_final)).map(inv_map_target)
task1 = pd.DataFrame({
    "subtaskID": 1,
    "Answer1": month_order,
    "Answer2": [f"{v:.5f}" for v in avg_floor_5]
})
task2 = pd.DataFrame({
    "subtaskID": 2,
    "Answer1": test_ids,
    "Answer2": labels_final
})

ssubmission = pd.concat([task1, task2], ignore_index=True)
ssubmission.to_csv("submission.csv", index=False)