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

# -- Code Cell --
group_train = train.groupby('id').agg(list)
group_test = test.groupby("datapointID").agg(list)
text_train = train['text'].unique()
text_candidates = candidates['text']

# -- Code Cell --
group_train['coords'][0][0]

# -- Code Cell --
mean_per_point = []
for t in range(len(group_train['coords'])):
    temp_values = {i:[] for i in range(728)}
    for j in range(len(group_train['coords'][t])):
        c=0
        for value in group_train['coords'][t][j].split("|"):
            if value != "":
                temp_values[c].append(float(value))
                c+=1
    means = []
    for z in range(728):
        means.append(np.mean(temp_values[z]))
    mean_per_point.append(means)        

# -- Code Cell --
mean_per_point = np.array(mean_per_point)
mean_per_point.shape

# -- Code Cell --
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import TruncatedSVD
tfidf = TfidfVectorizer(ngram_range=(1,3))
text_tf = tfidf.fit_transform(text_train)
svd = TruncatedSVD(n_components=300)
text_tf_svd = svd.fit_transform(text_tf)

# -- Code Cell --
from sklearn.linear_model import Ridge
model = Ridge(alpha=1.0)
model.fit(mean_per_point, text_tf_svd)

# -- Code Cell --
mean_per_point_test = []
for t in range(len(group_test['coords'])):
    temp_values = {i:[] for i in range(728)}
    for j in range(len(group_test['coords'].iloc[t])):
        c=0
        for value in group_test['coords'].iloc[t][j].split("|"):
            if value != "":
                temp_values[c].append(float(value))
                c+=1
    means = []
    for z in range(728):
        means.append(np.mean(temp_values[z]))
    mean_per_point_test.append(means)        

# -- Code Cell --
mean_per_point_test = np.array(mean_per_point_test)
mean_per_point_test.shape

# -- Code Cell --
pred_test = model.predict(mean_per_point_test)

# -- Code Cell --
text_candidates_tf = tfidf.transform(text_candidates)
text_candidates_tf_svd=svd.transform(text_candidates_tf)

# -- Code Cell --
from scipy.spatial.distance import cdist
D= cdist(pred_test, text_candidates_tf_svd, metric='euclidean')
n_pred, n_cand = D.shape
pred = np.full(n_pred,-1, dtype=int)
used = set()
for i in range(n_pred):
    indexies = np.argsort(D[i])
    for idx in indexies:
        if idx not in used:
            pred[i] = idx
            used.add(i)
            break

# -- Code Cell --
pred

# -- Code Cell --
