# -- Code Cell --
import pandas as pd
train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")

# -- Code Cell --
train = train.drop(columns='ID')
test_ids = test['ID']
test = test.drop(columns='ID')


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

# -- Code Cell --
from sklearn.cluster import DBSCAN
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
train_sc = scaler.fit_transform(train.drop(columns='Target'))
test_sc = scaler.transform(test)
kmeans= DBSCAN(eps=9)
kmeans.fit(train_sc)
train['SpaceNoise'] = kmeans.labels_
kmeans.fit(test_sc)
test['SpaceNoise'] = kmeans.labels_

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

# -- Code Cell --
train['SpaceNoise'] = (train['SpaceNoise']==-1)-1 #asta e space noise = 2155
test['SpaceNoise'] = (test['SpaceNoise']==-1)-1 #asta e space noise = 2155

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

# -- Code Cell --
train['SpaceNoise'] = (train['SpaceNoise']==-1).astype(int)#asta e candidate signals = 3845
test['SpaceNoise'] = (test['SpaceNoise']==-1).astype(int)#asta e candidate signals = 3845

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

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

# -- Code Cell --
train['Target'].describe()

# -- Code Cell --
from sklearn.model_selection import train_test_split
from catboost import CatBoostRegressor
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
X=train.drop(columns='Target')
y= train['Target']
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.2, random_state=42)
# scaler = StandardScaler()
# model = LinearRegression()
# X_train_sc = scaler.fit_transform(X_train)
# X_test_sc = scaler.transform(X_test)
# model.fit(X_train_sc,y_train)
# pred = model.predict(X_test_sc)
model = CatBoostRegressor(random_state=42)
model.fit(X_train, y_train)
pred = model.predict(X_test)
acc= mean_squared_error(y_test,pred)
acc

# -- Code Cell --
model.fit(X,y)
pred_final = model.predict(test)

# -- Code Cell --

dbscan2 = DBSCAN(eps=5, min_samples=10)
labels_origin = dbscan2.fit_predict(train_sc)

train['dbscan_labels'] = labels_origin
train['SourceOrigin'] = 0
counts = pd.Series(labels_origin).value_counts()
active_cluster_ids = counts[(counts > 100) & (counts.index != -1)].index

train.loc[train['dbscan_labels'].isin(active_cluster_ids), 'SourceOrigin'] = 1

# -- Code Cell --
dbscan2 = DBSCAN(eps=5, min_samples=10)
labels_origin = dbscan2.fit_predict(test_sc)

test['dbscan_labels'] = labels_origin
test['SourceOrigin'] = 0
counts = pd.Series(labels_origin).value_counts()
active_cluster_ids = counts[(counts > 100) & (counts.index != -1)].index

test.loc[test['dbscan_labels'].isin(active_cluster_ids), 'SourceOrigin'] = 1

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

# -- Code Cell --
test['SourceOrigin'].value_counts()

# -- Code Cell --
rows = []
for i,row in test.iterrows():
    rows.append({'subtaskID':1, 'datapointID':row['ID'], 'answer':row['SpaceNoise']})
    rows.append({'subtaskID':2, 'datapointID':row['ID'], 'answer':pred_final[i]})
    rows.append({'subtaskID':3, 'datapointID':row['ID'], 'answer':row['SourceOrigin']})
    
pd.DataFrame(rows).to_csv('submission.csv',index=False)