Map-Filter-Reduce

Aplicações úteis de mapeamento, filtro e redução de listas

Veremos aqui 3 funções extremamente úteis, que nos ajudam a resumir os dados. Essas funções são bastante usadas em um dos principais frameworks de Big Data — Apache Hadoop.

Notebook de estudo

Acesse o Jupyter Notebook para consultar os conceitos que serão abordados sobre Map, Filter e Reduce. Obs: as funções, outputs e termos importantes estão em negrito para facilitar a compreensão.

Map

A função map() faz basicamente o mapeamento de um valor para outro, quase como um objeto do tipo dicionário em Python. Este é um conceito de programação funcional, mas que pode ser útil em certas circunstâncias dentro do processo de análise de dados. Este é conceito fundamental de programação MapReduce, popular em tecnologias de processamento de Big Data, como Hadoop e Spark.

Definir array

Vamos iniciar nosso estudo definindo um array utilizando a função range.

# Definindo um array 
array1 = range(0, 15); print(array1)
range(0, 15)

Verificar objeto

Objeto do tipo range é uma lista de valores.

type(array1)
range

Criar função

Usamos a palavra reservada def para criar uma função, determinamos o nome da função como calc_cubo, recebe um parâmetro (num) e descrevemos o que a função fará.

# Definição da função 
def
calc_cubo(num):
return num ** 3

Aplicar função para cada elemento

Podemos aplicar a função criada para cada elemento do range. Uma das maneiras de se fazer isso é utilizar o loop for — estrutura de repetição.

Para (for) cada elemento dentro (in) array1, chamar a função (calc_cubo) e percorrer cada elemento do array1. Portanto, temos uma lista de 15 valores à qual foi aplicada a função de cubo para cada um dos elementos.

for elemento in array1:
print(calc_cubo(elemento))
0
1
8
27
64
125
216
343
512
729
1000
1331
1728
2197
2744

Uma linha de código

A função map recebe dois parâmetros, a função que desejamos aplicar e o conjunto de valores aos quais vamos aplicar essa função.

A função map é muito mais performática e simples do que o loop for.

lista_map_func = map(calc_cubo, array1)
print(lista_map_func)
<map object at 0x10d4b7128>

A função map retorna um objeto iterable. Para visualizar os números da saída de map em uma lista.

print(list(lista_map_func))
[0, 1, 8, 27, 64, 125, 216, 343, 512, 729, 1000, 1331, 1728, 2197, 2744]

Outro exemplo

Temos a função de conversão para float e um conjunto de elementos através de range.

lista_map_func_2 = map(float, range(20))
lista_map_func_2
<map at 0x10d4b7f60>
print(list(lista_map_func_2))[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0]

Portanto, pegamos um range de valores de 0 a 20 (exclusivo) e convertemos esses números inteiros para flutuantes com a função map.

Importar função matemática

Vamos importar a função sqrt do pacote math e criar um objeto do tipo array.

from math import sqrtarray2 = list(array1)
array2
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]

Agora aplicaremos sqrt para calcular a raiz quadrada dos elementos de 0 a 5. Portanto, estamos fatiando a lista e somente parte dessa lista será aplicada a função importada.

print(list(map(sqrt, array2[0:5])))[0.0, 1.0, 1.4142135623730951, 1.7320508075688772, 2.0]

Em uma linha de código calculamos a raiz quadrada dos 5 primeiros elementos da nossa lista. Fizemos isso com a função map e depois convertemos o resultado para uma lista

Filter

A função filter permite filtrar elementos de uma lista. Aplicamos uma função que retorna valores booleanos (True ou False). Retornamos os valores onde a expressão é True e filtramos os valores onde a expressão retorna False.

Criando outro range

array1 = range(0, 15); print(array1)
range(0, 15)

Visualizar tipo

type(array1)
range

Criar função — verificar par

Vamos criar uma função para verificar os números que são pares. Usamos a palavra reservada def, chamamos a função como verificarPar e passamos o parâmetro num a ela.

A definição de um número par, é um número dividido por 2 tenha resto 0.

def verificaPar(num):
return num % 2 == 0 # expressão relacional, retorna True|False
verificaPar(190)
True
verificaPar(191)
False

Agora vamos aplicar essa útlima função ao conjunto de valores.

list(map(verificaPar, array1))[True,
False,
True,
False,
True,
False,
True,
False,
True,
False,
True,
False,
True,
False,
True]

O que obtivemos foi uma lista de True e False do mapeamento de verificaPar. Talvez quiséssemos, na verdade, saber quais números dentro do range são os números pares. Para isso aplicamos a função filter.

list(filter(verificaPar, array1))
[0, 2, 4, 6, 8, 10, 12, 14]

Com filter fomos capazes de retornar os números pares dentro da lista de valores. A função filter aplica o filtro de acordo com o resultado que é True.

3° Exemplo

Vamos criar uma lista de frases e uma outra função chamada testa_ BigData — se dentro de uma frase, o termo “Big Data” aparece pelo menos duas vezes.

lista_frases =
["Big Data",
"Machine Learning em Big Data e Algoritmos em Big Data",
"Data Science e Big Data",
"Big Data e Internet das Coisas",
"Big Data está revolucionando o mundo"]

Definir nova função

def testa_BigData(frase):
return frase.count("Big Data") >= 2

Diferença de aplicação

O resultado da função filter foi a única frase onde o termo Big Data aparece duas vezes.

# Aplicando a função filter()
list(filter(testa_BigData, lista_frases))
['Machine Learning em Big Data e Algoritmos em Big Data']

O resultado com a função map foi uma lista de true or false para as frases que se adequam à função.

# Aplicando a função map()
list(map(testa_BigData, lista_frases))
[False, True, False, False, False]

Reduce

A função reduce aplica uma função a uma sequência de elementos, até reduzir a sequência a um único elemento — único valor.

A função reduce não faz parte da linguagem padrão Python. É necessário importar a partir do functools.

from functools import reduce

Abaixo temos a função reduce que aplicará uma função anônima lambda. Essa função anônima será aplicada a um conjunto de valores — mesma sintaxe da função map e filter.

soma = reduce((lambda x, y: x + y), [1, 2, 3, 4])

A função acima representa uma soma, ela soma os valores que recebe como parâmetro e aplica a função ao conjunto de valores. Em reduce devemos colocar uma função que permita fazer redução, temos que garantir que a função seja capaz de reduzir uma lista de valores em um único elemento.

soma
10

O resultado da lista, somados, resulta em 10. Era isso que queríamos, um único resultado.

Portanto, vimos aqui 3 importantes funções e suasaplicações — map, filter e reduce.

Obrigado.

Composing a repository of books (i bought), authors (i follow) & blogs (direct ones) for my own understanding.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store