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

# -- Code Cell --
def AAS(painting):
  rating = 0
  if painting['stroke_density']>0.7:
    rating +=2
  if painting['complexity']>0.65:
    rating+=2
  if painting['uses_gold_leaf'] == True:
    rating+=1
  if painting['has_signature'] == True:
    rating+=1
  if painting['num_colors']>65 and painting['colorfulness']>0.7:
    rating+=2
  if painting['contrast']<0.4 or painting['brightness'] <0.45 or painting['brightness']>0.75:
    rating-=1
  return rating
test['AAS'] = test.apply(AAS, axis=1)
test['Task1'] = np.where(test['AAS'] >= 5, 'Autentic', 'Incert')
test = test.drop(columns = 'AAS')

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

# -- Code Cell --
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.pipeline import Pipeline
from sklearn.cluster import KMeans
num_cols = test.select_dtypes(exclude="object").columns
cat_cols = test.select_dtypes(include="object").columns
preprocess = ColumnTransformer([
    ("num", StandardScaler(), num_cols),
    ("cat", OneHotEncoder(handle_unknown="ignore"), cat_cols)
])
X2 = preprocess.fit_transform(test)

kmeans = KMeans(n_clusters=5, random_state=42)
test['Task2'] = kmeans.fit_predict(X2)

# -- Code Cell --
correlations = train.select_dtypes(include=[np.number]).corr()['target_price'].sort_values(ascending=False)
print(correlations)

# -- Code Cell --
import matplotlib.pyplot as plt
plt.hist(test['painter_style_score'], bins=50)
plt.show()

# -- Code Cell --
X_style = test[['painter_style_score']].values
kmeans = KMeans(n_clusters=5, random_state=42, n_init=50)
test['Task2'] = kmeans.fit_predict(X_style)

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

# -- Code Cell --
!pip install catboost

# -- Code Cell --
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from catboost import CatBoostRegressor
from xgboost import XGBRegressor

X = train.drop(columns='target_price')
y = train['target_price']

num_cols = X.select_dtypes(exclude="object").columns
cat_cols = X.select_dtypes(include="object").columns

preprocess = ColumnTransformer(
    transformers=[
        ("num", StandardScaler(), num_cols),
        ("cat", OneHotEncoder(handle_unknown="ignore"), cat_cols),
    ],
    remainder="drop"
)

model = Pipeline(steps=[
    ("preprocess", preprocess),
    ("regressor", LinearRegression())
])

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

model.fit(X_train, y_train)

# -- Code Cell --
from sklearn.metrics import mean_absolute_error

pred = model.predict(X_test)
mae = mean_absolute_error(y_test, pred)
print(mae)

# -- Code Cell --
model.fit(X, y)

test['Task3'] = model.predict(test)

# -- Code Cell --
sub_task1 = pd.DataFrame({
    'SampleID': test['SampleID'],
    'subtaskID': 'Task1',
    'Answer': test['Task1']
})

sub_task2 = pd.DataFrame({
    'SampleID': test['SampleID'],
    'subtaskID': 'Task2',
    'Answer': test['Task2']
})

sub_task3 = pd.DataFrame({
    'SampleID': test['SampleID'],
    'subtaskID': 'Task3',
    'Answer': test['Task3'].round().astype(int)
})

submission = pd.concat([sub_task1, sub_task2, sub_task3], ignore_index=True)
submission.to_csv("submission.csv", index=False)