← back to Handbag Authentication
handbag_data/github_datasets/Luxury-Handbag-Price-Prediction/Codes/preprocess_clean_data.py
115 lines
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Sat Nov 17 18:52:39 2018
@author: abinaya
"""
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
from itertools import combinations
def preprocess_clean_data(df, train_for_index, test_for_index, process_continuous):
continuous_features_all = ["hardware - num zips", "strap length", "num compartments", "num components", "num colors", "volume", "num functionality"]
categorical_ordered_features_all = ["hardware - metal type", "hardware - strap type", "inner material"]
categorical_unordered_features_all = ["brand", "accessories", "bag style", "major color"]
others_all = ["skin type"]
continuous_features = list(set(df.columns) & set(continuous_features_all))
categorical_ordered_features = list(set(df.columns) & set(categorical_ordered_features_all))
categorical_unordered_features = list(set(df.columns) & set(categorical_unordered_features_all))
others = list(set(df.columns) & set(others_all))
### One hot encoding Categorical Un-ordered Features
if len(categorical_unordered_features) > 0:
for feat in categorical_unordered_features:
print "\n--------- One Hot Encoding feature --------- ",feat
one_hot_encoded_df = pd.get_dummies(df[feat], prefix=feat)
df = pd.concat([df,one_hot_encoded_df], axis=1) #concatenate old columns with new one hot encoded columns
df = df.drop(categorical_unordered_features, axis=1)
### Label Categorical Ordered Features
if len(categorical_ordered_features) > 0:
label_dict = {'hardware - metal type':{'None':0, 'Leather':1, 'Silver':2, 'Brass':3, 'Ruthenium':4, 'Gold':5, 'Palladium':6},
'hardware - strap type':{'None':0, 'Metal':1, 'Metal,Leather':2, 'Leather':3},
'inner material':{'Sheep':0, 'Seude':1, 'Others':2, 'Microfiber':3, 'Satin':4, 'Calf':5}}
for feat in categorical_ordered_features:
print "\n--------- Labelling feature --------- ",feat
df = df.replace({feat:label_dict[feat]})
print "Labelled as: ",label_dict[feat]
### fix skin types
if len(others) > 0:
print "\n--------- One hot encoding - skin type --------- "
# Unique skin types
skin_types = df['skin type'].unique()
unique_skin_type = []
for i in range(len(skin_types)):
unique_skin_type += skin_types[i].split(", ")
unique_skin_type = np.unique(unique_skin_type)
unique_skin_type = ["skin type_"+i for i in unique_skin_type]
# encode skin types
df_skin = pd.DataFrame(columns=unique_skin_type)
for index in range(len(df)):
skin_list = df.loc[index, "skin type"].split(", ")
skin_list = ["skin type_"+i for i in skin_list]
df_skin.loc[index, skin_list] = 1
df_skin = df_skin.fillna(0)
#add and drop
df = pd.concat([df,df_skin], axis=1)
df = df.drop('skin type', axis=1)
### split train and test data
df_train = df.loc[train_for_index.index]
df_test = df.loc[test_for_index.index]
### Normalization or Standardization of Continuous Features
if len(continuous_features) > 0:
if process_continuous == "Standardize":
print "\n--------- Standardizing Continuous Features (Mean=0, Standard Deviation=1) --------- "
standardization = StandardScaler()
standardization.fit(df_train[continuous_features])
df_train[continuous_features] = standardization.transform(df_train[continuous_features])
df_test[continuous_features] = standardization.transform(df_test[continuous_features])
elif process_continuous == "Normalize":
print "\n--------- Normalizing Continuous Features (Min=0, Max=1) --------- "
min_max_scaling = MinMaxScaler()
min_max_scaling.fit(df[continuous_features])
df_train[continuous_features] = min_max_scaling.transform(df_train[continuous_features])
df_test[continuous_features] = min_max_scaling.transform(df_test[continuous_features])
### save
#df.to_csv("/Users/abinaya/USC/Studies/NLCI/Project/Data/preprocessed.csv")
#df_train.to_csv("/Users/abinaya/USC/Studies/NLCI/Project/Data/train.csv", header=False, index=False)
#df_test.to_csv("/Users/abinaya/USC/Studies/NLCI/Project/Data/test.csv", header=False, index=False)
return df, df_train, df_test
df = pd.read_csv("/Users/abinaya/USC/Studies/NLCI/Project/Data/clean_data.csv")
train_for_index, test_for_index = train_test_split(df, test_size=0.2, random_state=0, stratify=df[['brand']])
selected_columns = ["brand", "skin type"]
df = df[selected_columns+["price"]]
df_preprocess, df_train, df_test = preprocess_clean_data(df, train_for_index, test_for_index, "")
s = "_"
to_add_str = s.join(selected_columns).replace(" ", "_")
df_train.to_csv("/Users/abinaya/USC/Studies/NLCI/Project/Data/categorical_data/train_categ_"+ to_add_str + ".csv", index=False)
df_test.to_csv("/Users/abinaya/USC/Studies/NLCI/Project/Data/categorical_data/test_categ_"+ to_add_str + ".csv", index=False)