{"cells":[{"metadata":{"_cell_guid":"9cbdd1b3-376e-4a6c-a07e-86d1a464c1de","_uuid":"727830ab0b252536acac592695424c9cae52a60b"},"cell_type":"markdown","source":"![](https://www.naspers.com/NaspersPortal/media/Naspers/companies/avito-sml.png?ext=.png)\n**Avito Demand Prediction**\n\nObjetivo: enviar ao Kaggle um notebook com código fonte que entrega a seguinte saída: arquivo csv com [item_id, deal_probability]."},{"metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","collapsed":true,"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","trusted":false},"cell_type":"code","source":"#importações\nimport math\nimport pandas as pd\nimport numpy as np\nfrom sklearn import linear_model\nfrom sklearn.metrics import mean_squared_error, r2_score\nfrom sklearn import preprocessing","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"6a9dc3af-1df6-4cdb-b626-43198392f6cf","collapsed":true,"_uuid":"3e63133ab2372cc7b71c49ba5d8662d00b2d6e9f","trusted":false},"cell_type":"code","source":"#Lendo os dados de treinamento e teste e criando os dataframes (estrutura de dados) train e test\ntrain = pd.read_csv(\"../input/train.csv\")\ntest = pd.read_csv(\"../input/test.csv\")","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"3912e2df-ac14-410b-91ef-d8c11e2f70d5","_uuid":"912783bd748ee55dd9be8131ad32d1216a9ab3dd","trusted":false,"collapsed":true},"cell_type":"code","source":"#Preenchendo os valores vazios com 0 para evitar nan\ntrain = train.fillna(0)\ntest = test.fillna(0)\n\n'''\n#Criando as colunas de ano, mês e dia da feature activation date para obtermos colunas numéricas\n\n#Criando as colunas de ano, mês e dia para o dataset de treinamento\nyears = []\nmonths = []\ndays = []\nfor date in train['activation_date']:\n    years.append(date[0:4])\n    months.append(date[5:7])\n    days.append(date[8:10])\n\n#Criando as novas colunas no dataframe\ntrain['activation_year'] = years\ntrain['activation_month'] = months\ntrain['activation_day'] = days\n\n#Criando as colunas de ano, mês e dia para o dataset de teste\nyears = []\nmonths = []\ndays = []\nfor date in test['activation_date']:\n    years.append(date[0:4])\n    months.append(date[5:7])\n    days.append(date[8:10])\n#Criando as novas colunas no dataframe\ntest['activation_year'] = years\ntest['activation_month'] = months\ntest['activation_day'] = days'''\n\n#Convertendo as colunas de classes discretas para valores inteiros, para obtermos colunas numéricas\nlabel_encoders = { } #cria lista dict de chave/valor para \nfeatures_to_encode = ['category_name', 'parent_category_name', 'city', 'region', 'user_type']\nfor feature in features_to_encode:\n    label_encoders[feature] = preprocessing.LabelEncoder() #instanciando o objeto label_encoders da classe LabelEnconder\n    label_encoders[feature].fit(pd.concat([train[feature], test[feature]])) #gera tabela de correspondência entre dados de uma feature e um número\n    train[feature] = label_encoders[feature].transform(train[feature])\n    test[feature] = label_encoders[feature].transform(test[feature])\n\n#Transformando a coluna image do dataset. Como funciona: se a coluna está preenchida com valor significa que o anúncio\n#possui um código para a imagem, e então o valor do seu atributo image é setado para 1. Caso contrário, seu valor é setado para 0.\n#Primeiro trato as images do dataset de treinamento\nimages = []\nfor image in train['image']:\n    if len(str(image)) <= 1:\n        images.append(0)\n    else:\n        images.append(1)\ntrain['image'] = images\n \n#Depois trato as images do dataset de teste\nimages = []\nfor image in test['image']:\n    if len(str(image)) <= 1:\n        images.append(0)\n    else:\n        images.append(1)\ntest['image'] = images","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"5d040d39-0a02-4b63-81ac-892ee4f5b287","collapsed":true,"_uuid":"9a5d3c54b9ad8ed880de49d15d437520eaef24da","trusted":false},"cell_type":"code","source":"\n#Como ainda foi possível utilizar nenhum modelo baseado em linguagem natural, analisou-se o comprimento\n#e o número de palavras contidas no título e na descrição do anúncio, partindo da hipótese de que um anúncio mais bem detalhado\n#pode gerar maior interesse de compra. Isso melhorou um pouco a perfórmance do modelo.\n\n#computando o comprimento e o número de palavras do título e da descrição do conjunto de treinamento\nlength_title = [] #número de caracteres da string que corresponde ao título do anúncio\nlength_description = [] #número de caracteres da string que corresponde ao comprimento da descrição do anúncio\nwords_title = [] #quantidade de palavras no título\nwords_description = [] #quantidade de palavras na descrição\npercent_capital_title = [] #porcentagem de capital letters no título\npercent_capital_description = [] #porcentagem de capital letters na descrição\n\n#começando a computar o comprimento, o número de palavras e a porcentagem de capital letters no título p/ a base de treinamento\nfor title in train['title']: \n    length_title.append(len(str(title)))\n    words_title.append(len(str(title).split(' ')))\n    count_capital = sum(1 for letter in str(title) if letter.isupper())\n    if count_capital > 0:\n        percent_capital_title.append(int(len(str(title)) / count_capital)) #adiciona no percent_capital_title a (qtdade de caracteres título / qtdade de letras maiúsculas)\n    else:\n        percent_capital_title.append(0)\n\n#começando a computar o comprimento,o número de palavras e a porcentagem de capital letters na descrição p/ a base de treinamento\nfor description in train['description']:\n    length_description.append(len(str(description)))\n    words_description.append(len(str(description).split(' ')))\n    count_capital = sum(1 for letter in str(description) if letter.isupper())\n    if count_capital > 0:\n        percent_capital_description.append(int(len(str(description)) / count_capital))\n    else:\n        percent_capital_description.append(0)\n\n#criando as novas colunas de comprimento (título e descrição), número de palavras (título e descrição) e porcentagem de capital letters (título e descrição) para o conjunto de treino\ntrain['length_title'] = length_title\ntrain['length_description'] = length_description\ntrain['words_title'] = words_title\ntrain['words_description'] = words_description\ntrain['percent_capital_title'] = percent_capital_title\ntrain['percent_capital_description'] = percent_capital_description\n\n#computando o comprimento e o número de palavras do título e da descrição do conjunto de teste\nlength_title = []\nlength_description = []\nwords_title = []\nwords_description = []\npercent_capital_title = []\npercent_capital_description = []\n\n#começando a computar o comprimento,o número de palavras e a porcentagem de capital letters no título p/ a base de teste\nfor title in test['title']:\n    length_title.append(len(str(title)))\n    words_title.append(len(str(title).split(' ')))\n    count_capital = sum(1 for letter in str(title) if letter.isupper())\n    if count_capital > 0:\n        percent_capital_title.append(int(len(str(title)) / count_capital))\n    else:\n        percent_capital_title.append(0)\n\n#começando a computar o comprimento,o número de palavras e a porcentagem de capital letters na descrição p/ a base de teste\nfor description in test['description']:\n    length_description.append(len(str(description)))\n    words_description.append(len(str(description).split(' ')))\n    count_capital = sum(1 for letter in str(description) if letter.isupper())\n    if count_capital > 0:\n        percent_capital_description.append(int(len(str(description)) / count_capital))\n    else:\n        percent_capital_description.append(0)\n\n#criando as novas colunas de comprimento (título e descrição), número de palavras (título e descrição) e porcentagem de capital letters (título e descrição) para o conjunto de teste\ntest['length_title'] = length_title\ntest['length_description'] = length_description\ntest['words_title'] = words_title\ntest['words_description'] = words_description\ntest['percent_capital_title'] = percent_capital_title\ntest['percent_capital_description'] = percent_capital_description\n\n#Escolhendo quais features serão usadas para treinar o modelo (aqui somente as features numéricas podem ser utilizadas,\n#porque se trata de uma regressão linear).\n#Features possíveis: price, item_seq_number, image_top_1, category_name, parent_category_name, city, region, user_type,\n#length_title, length_description, words_title, words_description, percent_capital_title, percent_capital_description.\n#O atributo user_type parece prejudicar o algoritmo, por isso não foi utilizado.\n#Atributos que parecem não fazer diferença no resultado e por isso foram removidos (bloco supracomentado) do modelo: activation_year, month e day.\n\nfeatures = ['price', 'item_seq_number', 'image_top_1', 'category_name', 'parent_category_name', 'city', 'region', 'image',\n            'length_description', 'length_title', 'words_title', 'words_description', 'percent_capital_title', 'percent_capital_description']\n\nx_train = train[features]\nx_test = test[features]\n\n#Guardando os targets para treinar o modelo \ny_train = train.deal_probability\n\n#Regra:\n#x_train ->>> y_train (deal_probability do conjunto de treinamento. É um dado do problema)\n#x_test  ->>> y_test = pred = predições = resposta do desafio = deal_probability\n\n#Instanciando nosso modelo de regressão linear\nlinear_regression = linear_model.LinearRegression()\n#Treinando o modelo\nlinear_regression.fit(x_train, y_train)\n#Fazendo as predições\npred = linear_regression.predict(x_test)\n\n#transforma para zero o pequeno número de casos (exceção) em que a predição tem valor negativo\ni = 0\nfor x in pred:\n    if x < 0:\n        pred[i] = 0\n    i += 1\n\n'''Calculando a acurácia através do mean squared error, que é como o kaggle faz o rankeamento das submissões\n#meanSquaredError = np.sum(np.square(y_test - pred))/pred.size\n#rootMeanSquaredError = math.sqrt(meanSquaredError)\n#print('Full dataset root mean squared error: ', rootMeanSquaredError)'''","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"816757eb-b84c-4f8a-b310-1aa58963a522","collapsed":true,"_uuid":"8f7e0b1c5d0bedd8021aeaa70c57c65dd8a98b90","trusted":false},"cell_type":"code","source":"#Criando um dataframe do pandas com as colunas pedidas pelo kaggle: item_id e deal_probability\nmy_submission = pd.DataFrame({'item_id': test['item_id'], 'deal_probability': pred})\n#Salvando o dataframe do resultado em CSV para que possa ser submetido ao desafio\nmy_submission.to_csv('submission.csv', index=False)","execution_count":null,"outputs":[]}],"metadata":{"language_info":{"name":"python","version":"3.6.5","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"}},"nbformat":4,"nbformat_minor":1}