Buscar

Um guia direto para limpar e preparar d arço de 2021 _ Rumo à ciência de dados pdf

Prévia do material em texto

07/03/2021 Um g ia di e a a lim a e e a a dad em P h F a k A d ade Ma de 2021 R m ci cia de dad
h :// a d da a cie ce.c m/a- aigh f a d-g ide- -clea i g-a d- e a i g-da a-i - h -8c82f209ae33 1/16
S 562 
Um g ia dire o para limpar e preparar dado
em P hon
C ca a c a .
F a a a 9 a a á 10 a
F c U a
V cê a a 1 a a a a a b ê . U a 
acc a a b c ê c a a a .
Ab a caAb a ca
07/03/2021 Um g ia di e a a lim a e e a a dad em P h F a k A d ade Ma de 2021 R m ci cia de dad
h :// a d da a cie ce.c m/a- aigh f a d-g ide- -clea i g-a d- e a i g-da a-i - h -8c82f209ae33 2/16
Os dados do mundo real estão sujos. Na verdade, cerca de 80% do tempo de um
cientista de dados gasto na coleta, limpe a e preparação de dados. Essas etapas
tediosas (mas necessárias) tornam os dados adequados para qualquer modelo que
desejamos construir e garantem a alta qualidade dos dados.
A limpe a e preparação de dados pode ser complicado algumas t imes, portanto, neste
artigo, eu gostaria de fa er esses processos mais fáceis, mostrando algumas t cnicas,
m todos e funç es usadas para limpar e preparar dados. Para fa er isso, usaremos um
conjunto de dados Netfli dispon vel no Kaggle que cont m informaç es sobre todos os
t tulos no Netfli . Estou usando conjuntos de dados de filmes porque eles são
frequentemente usados em tutoriais para muitos projetos de ci ncia de dados, como
análise de sentimento e construção de um sistema de recomendação. Voc tamb m
pode seguir este guia com um conjunto de dados de filmes da IMDb, MovieLens ou
qualquer conjunto de dados que voc precise limpar.
Embora o conjunto de dados Kaggle possa parecer bem organi ado, ele não está pronto
para ser usado, portanto, identificaremos dados ausentes, outliers, dados
inconsistentes e faremos a normali ação do te to. Isso mostrado em detalhes na
tabela abai o.
d ce 
 1. Vi o ge al pida do conj n o de dado 
 2. Iden ifiq e dado a en e 
 - C ie ma li a de po cen agem com .i n ll () 
 3. Lidando com dado a en e 
 - Remo a ma col na o linha com .d op, .d opna o .i n ll - 
S b i a pela m dia , mediana o modo - S b i a po m n me o 
a bi io po .fillna () 4. Iden ificando o lie - U ando 
hi og ama pa a iden ifica o lie em dado n m ico - U ando 
bo plo pa a iden ifica o lie em dado n m ico - U ando 
ba a pa a iden ifica o lie em dado ca eg ico 5. T a amen o 
com o lie - 
U ando ope ado e & pa a fil a o lie 
 6. Lidando com dado incon i en e an e de me cla 2 Da af ame 
 - Lidando com nome de col na incon i en e 
 - Lidando com ipo de dado incon i en e 
 - Lidando com nome incon i en e , po e emplo, "Ne Yo k" "NY" 
 7. No mali a o de e o
 - Lidando com capi ali a o incon i en e 
Ab a ca
07/03/2021 Um g ia di e a a lim a e e a a dad em P h F a k A d ade Ma de 2021 R m ci cia de dad
h :// a d da a cie ce.c m/a- aigh f a d-g ide- -clea i g-a d- e a i g-da a-i - h -8c82f209ae33 3/16
 - Remo a o e pa o em b anco com . ip () 
 - Remo a o b i a ing com . eplace () o . b () 
 8. Me clando conj n o de dado 
 - Remo a d plica a com .d op_d plica e ()
1. V ã a á a c a
A primeira coisa a fa er depois de bai ar um conjunto de dados verificar o tipo de
dados de cada coluna (os valores de uma coluna podem conter d gitos, mas podem não
ser datetime ou tipo int)
Depois de ler o arquivo CSV, digite .d e para encontrar o tipo de dados de cada
coluna.
df_ne fli _2019 = pd. ead_c ('ne fli _ i le .c ') 
df_ne fli _2019.d pe
Depois de e ecutar esse c digo, voc obterá a seguinte sa da.
ho _id in 64 
ipo obje o 
lo obje o 
di e o obje o 
elenco 
pa obje o 
da a_added obje o 
elea e_ ea in 64 
a alia o obje o 
d a o obje o 
li ado_in obje o 
de c i o obje o 
d pe: obje o
Isso o ajudará a identificar se as colunas são variáveis num ricas ou categ ricas, o que 
importante saber antes de limpar os dados.
Agora, para encontrar o n mero de linhas e colunas que o conjunto de dados cont m,
use o . ha e m todo.
In [1]: df_ne fli _2019. hape 
O [1]: (6234, 12) #E e conj n o de dado con m 6234 linha e 12 
col na .
Ab a ca
07/03/2021 Um g ia di e a a lim a e e a a dad em P h F a k A d ade Ma de 2021 R m ci cia de dad
h :// a d da a cie ce.c m/a- aigh f a d-g ide- -clea i g-a d- e a i g-da a-i - h -8c82f209ae33 4/16
2. I ca a a
A falta de dados às ve es ocorre quando a coleta de dados foi feita de maneira
inadequada, erros foram cometidos na entrada de dados ou os valores dos dados não
foram arma enados. Isso acontece com frequ ncia e devemos saber como identificá-lo.
C a a c a c . ()
Uma abordagem simples para identificar dados ausentes usar os m todos
.i ll() e . m()
df_ne fli _2019.i n ll (). m ()
Isso nos mostra uma s rie de valores NaN em cada coluna. Se os dados contiverem
muitas colunas, voc pode usar . _ al e (a ce di g=Fal e) para colocar as colunas
com o maior n mero de valores ausentes no topo.
ho _id 0 
ipo 0 
lo 0 
di e o 1969 
elenco 570 
pa 476 
da a_added 11 
elea e_ ea 0 
cla ifica o 10 
d a o 0 
li ado_in 0 
de c i o 0 
d ipo: in 64
Dito isso, geralmente represento os valores ausentes em porcentagens, portanto, tenho
uma imagem mais clara dos dados ausentes. O c digo a seguir mostra a sa da acima
em %
1
2
3
4
#% de linhas ausentes em cada coluna
para coluna em df_netflix_2019 . colunas :
 porcentagem = df_netflix_2019 [ coluna ]. isnull (). significa ()
 imprimir ( f ' { coluna } : { redondo ( porcentagem * 100 , 2 ) } %' )
Ab a ca
07/03/2021 Um g ia di e a a lim a e e a a dad em P h F a k A d ade Ma de 2021 R m ci cia de dad
h :// a d da a cie ce.c m/a- aigh f a d-g ide- -clea i g-a d- e a i g-da a-i - h -8c82f209ae33 5/16
Agora mais evidente que um bom n mero de diretores foi omitido no conjunto de
dados.
ho _id: 0,0% 
pe: 0,0% 
lo: 0,0% 
di e o : 31,58% 
elenco: 9,14% 
pa : 7,64% 
da e_added: 0,18% 
elea e_ ea : 0,0% 
cla ifica o: 0,16% 
d a o: 0,0% 
li ado_in: 0,0% 
de c i o: 0,0%
Agora que identificamos os dados ausentes, precisamos administrá-los.
3. L a c Da P
E istem diferentes maneiras de lidar com dados ausentes. A abordagem correta para
lidar com os dados ausentes será altamente influenciada pelos dados e objetivos do seu
projeto.
Dito isso, a seguir estão tr s maneiras simples de lidar com dados ausentes.
R a a c a a c . , . a .
Se voc considerar que necessário remover uma coluna porque ela tem muitas linhas
va ias, voc pode usar .d () e adicionar a i =1 como um parâmetro para indicar
que o que voc deseja eliminar uma coluna.
No entanto, na maioria das ve es, apenas o suficiente para remover as linhas que
cont m esses valores va ios. E istem diferentes maneiras de fa er isso.
1
2
#drop column
df_netflix_2019.drop('director', axis=1)
1
2
3
4
5
#drop row
no_director = df_netflix_2019[df_netflix_2019['director'].isnull()].index
df_netflix_2019.drop(no_director, axis=0)
#~ + .isnull()
df netflix 2019[~df netflix 2019['director'].isnull()]
Ab a ca
07/03/2021 Um g ia di e a a lim a e e a a dad em P h F a k A d ade Ma de 2021 R m ci cia de dad
h :// a d da a cie ce.c m/a- aigh f a d-g ide- -clea i g-a d- e a i g-da a-i - h -8c82f209ae33 6/16
A primeira solução usa .d com a i =0 para eliminar uma linha. A segunda
identifica os valores va ios e assume os valores não va ios usando o operador de
negação, enquanto a terceira solução usa .d a para descartar linhas va ias
dentro de uma coluna.
Se voc deseja salvar a sa da ap s soltar, use i lace=T e como um parâmetro. Neste
e emplo simples, não eliminaremos nenhuma coluna ou linha.
S b a a é a, a a 
Outra abordagem comum usar a m dia, mediana ou modo para substituir os valores
va ios. A m dia e a mediana são usadas para substituir os dados num ricos, enquanto o
modo substitui os dados categ ricos.
Como vimos antes, a a i g coluna cont m 0,16% de dados ausentes. Poderamos
facilmente completar essa pequena porção de dados com o modo, pois a i g um
valor categ rico.
Primeiro, calculamos o modo (TV-MA) e, em seguida, preenchemos todos os valores
va ios com .fill a .
S b a- a b á c . a ()
Se os dados forem num ricos, tamb m podemos definir um n mero arbitrário para
evitar a remoção de qualquer linha sem afetar os resultados do nosso modelo.
Se a d a i coluna fosse um valor num rico (atualmente, o formato string, por
e emplo 90 mi e ), poder amos substituir os valores va ios por 0 com o c digo a
seguir.
df_ne fli _2019 ['d a o']. fillna (0, inplace = T e)
5
6
7
df_netflix_2019[ df_netflix_2019[ director ].isnull()]
#dropna()
df_netflix_2019.dropna(subset=['director'])
1
2
modo = '' . juntar ( df_netflix_2019 [ 'classifica o' ]. modo ())
df_netflix_2019 [ 'classifica o' ]. fillna ( modo , local = True )
Ab a ca
07/03/2021 Um g ia di e a a lim a e e a a dad em P h F a k A d ade Ma de 2021 R m ci cia de dad
h :// a d da a cie ce.c m/a- aigh f a d-g ide- -clea i g-a d- e a i g-da a-i - h -8c82f209ae33 7/16
Al m disso, voc pode usar o ffill , bfill para propagar a ltima observação válida
para frente e para trás, respectivamente. Isso e tremamente til para alguns
conjuntos de dados, mas não til no df_ e fli _2019 conjunto de dados.
4. I ca 
Um outlier são os dados que diferem significativamente de outras observaç es. Um
conjunto de dados pode conter outliers reais ou outliers obtidos ap s uma coleta de
dados insuficiente ou causados por erros de entrada de dados.
U a a a a a ca a é c
Usaremos a duração como uma refer ncia que nos ajudará a identificar outliers no
catálogo da Netfli . A d a i coluna não considerada um valor num rico (por
e emplo, 90) em nosso conjunto de dados porque misturada com strings (por
e emplo, 90 min). Al m disso, a duração dos programas de TV em temporadas (por
e emplo, 2 temporadas), portanto, precisamos filtrá-la.
Com o c digo a seguir, pegaremos apenas filmes do conjunto de dados e, em seguida,
e trairemos os valores num ricos da d a i coluna.
Agora os dados estão prontos para serem e ibidos em um histograma. Voc pode fa er
plotagens com matplotlib, seaborn ou pandas em P thon. Nesse caso, farei isso com
matplotlib.
impo ma plo lib.p plo a pl
fig, a = pl . bplo (n o = 1, ncol = 1) 
pl .hi (df_mo ie ['min o']) 
fig. igh _la o ()
O enredo abai o revela como a duração dos filmes distribu da. Observando o gráfico,
podemos di er que os filmes na primeira barra (3 – 34 ) e na ltima barra vis vel (>
189 ) são provavelmente outliers. Eles podem ser curtas-metragens ou documentários
1
2
3
#creating column (extract)
df_movie = df_netflix_2019 [ df_netflix_2019 [ 'type' ] == 'Filme' ]
df_movie = df_movie . atribuir ( minuto = df_movie [ 'dura o' ]. str . extract ( r 
Ab a ca
07/03/2021 Um g ia di e a a lim a e e a a dad em P h F a k A d ade Ma de 2021 R m ci cia de dad
h :// a d da a cie ce.c m/a- aigh f a d-g ide- -clea i g-a d- e a i g-da a-i - h -8c82f209ae33 8/16
longos que não se enquadram bem em nossa categoria de filmes (mais uma ve , ainda
depende dos objetivos de seu projeto)
I a a
U a b a a ca a é c
Outra opção para identificar outliers são os bo plots. Prefiro usar bo plots porque
dei a os outliers fora dos bigodes da cai a. Como resultado, mais fácil identificar os
valores m nimo e má imo sem considerar os outliers.
Podemos fa er bo plots facilmente com o c digo a seguir.
impo ado do ma como n
fig, a = pl . bplo (n o = 1, ncol = 1) 
a = n .bo plo ( = df_mo ie ['min o']) 
fig. igh _la o ()
O bo plot mostra que valores abai o de 43 e acima de 158 são provavelmente outliers.
Ab a ca
07/03/2021 Um g ia di e a a lim a e e a a dad em P h F a k A d ade Ma de 2021 R m ci cia de dad
h :// a d da a cie ce.c m/a- aigh f a d-g ide- -clea i g-a d- e a i g-da a-i - h -8c82f209ae33 9/16
I a a
Al m disso, podemos identificar alguns elementos do bo plot como o quartil inferior
(Q1) e o quartil superior (Q3) com o .de c ibe() m todo.
In [1]: df_mo ie ['min o']. De c ibe () 
O [1]: con agem 4265,000000 
 m dia 99,100821 
 d 28,074857 
 min 3,000000 
 25% 86,000000 
 50% 98,000000 
 75% 115,000000 
 ma 312,000000
Al m disso, voc pode e ibir facilmente todos os elementos do bo plot e at mesmo
torná-lo interativo com o Plotl .
impo plo l .g aph_objec a pa i 
de plo l .offline impo iplo , ini _no ebook_mode
fig = go.Fig e () 
fig.add_bo ( = df_mo ie ['min o'], e = df_mo ie ['min o']) 
iplo (fig)
U a ba a a a ca a ca c
Caso os dados sejam categ ricos, voc pode identificar categorias com poucas
observaç es traçando barras.
Ab a ca
07/03/2021 Um g ia di e a a lim a e e a a dad em P h F a k A d ade Ma de 2021 R m ci cia de dad
h :// a d da a cie ce.c m/a- aigh f a d-g ide- -clea i g-a d- e a i g-da a-i - h -8c82f209ae33 10/16
Neste caso, usaremos a visuali ação Pandas embutida para fa er o gráfico da barra.
fig = df_ne fli _2019 [' a ing']. al e_co n (). plo .ba (). 
ge _fig e () 
fig. igh _la o ()
I a a
No gráfico acima, podemos ver que o modo (o valor que aparece com mais frequ ncia
na coluna) TV-MA enquanto NC-17 e UR são incomuns.
5. L a c 
Depois de identificar os outliers, podemos filtrá-los facilmente usando os operadores
do P thon.
U a a & a a a 
Os operadores P thon são simples de memori ar. & o equivalente a a d , enquanto 
 o equivalente a .
Nesse caso, vamos filtrar outliers com base nos valores revelados pelo bo plot.
Ab a ca
07/03/2021 Um g ia di e a a lim a e e a a dad em P h F a k A d ade Ma de 2021 R m ci cia de dad
h :// a d da a cie ce.c m/a- aigh f a d-g ide- -clea i g-a d- e a i g-da a-i - h -8c82f209ae33 11/16
#o lie 
df_mo ie [(df_mo ie ['min o'] <43) (df_mo ie ['min o']> 158)] 
#fil ando o lie pa a fo a 
df_mo ie = df_mo ie [(df_mo ie ['min o']> 43) & (df_mo ie 
['min o'] <158)]
O df_m ie criado agora cont m apenas filmes que duram entre 43 e 158 .
6. L a c a c a c a 2 Da a a
Uma tarefa comum com a qual nos deparamos com frequ ncia mesclar dataframes
para aumentar as informaç es de uma observação. Infeli mente, na maioria das ve es,
os conjuntos de dados t m muitas inconsist ncias porque v m de fontes diferentes.
De ag a e d a e, a e eg d c de dad
df_ne fli _originals e c é a e a g a d Ne f (.c d í e e
e G h b ) e e c a e c c de dad g a df_ne fli _2019
a a de e a c eúd g a e ã g a .
L a c c a c
Um problema comum com o qual temos que lidar são os nomes de coluna diferentes
entre as tabelas. Os nomes das colunas podem ser facilmente alterados com o . e ame
m todo.
L a c a c
Se voc tentar mesclar 2 conjuntos de dados com base em uma coluna que possui tipos
de dados diferentes, o P thon gerará um erro. É por isso que voc deve ter certe a de
que o tipo o mesmo. Se a mesma coluna tiver tipos diferentes, voc pode usar o
.a e m todo para normali á-la.
L a c c , , N Y . NY
1
2
3
df_netflix_originals = pd . read_csv ( 'netflix_originals.csv' )
# nomes de coluna inconsintent
df_netflix_originals . renomear ( colunas = { 't tulos' : 't tulo' , 'anos' : 'ano_da_la
1 df_netflix_originals = df_netflix_originals.astype({"release_year": int})
Ab a ca
07/03/2021 Um g ia di e a a lim a e e a a dad em P h F a k A d ade Ma de 2021 R m ci cia de dad
h :// a d da a cie ce.c m/a- aigh f a d-g ide- -clea i g-a d- e a i g-da a-i - h -8c82f209ae33 12/16
Normalmente, a normali ação da coluna e do tipo de dados suficiente para mesclar
aos conjuntos de dados; no entanto, às ve es, e istem inconsist ncias entre os dados na
mesma coluna, causadas por erros de entrada de dados (erros de digitação) ou
discordâncias na forma como uma palavra escrita.
Normalmente, os t tulos dos filmes não apresentam esses problemas. Eles podem terum desacordo na pontuação (vamos cuidar disso mais tarde), mas os filmes geralmente
t m um nome padrão, então, para e plicar como lidar com este problema, vou criar um
conjunto de dados e uma lista contendo estados escritos em diferentes maneiras.
E istem muitas bibliotecas que podem nos ajudar a resolver esse problema. Nesse caso,
usarei a f biblioteca. Isso dará uma pontuação com base na distância entre 2
cordas. Voc pode escolher o marcador que melhor se adapta aos seus dados. Vou
definir c e =f . ke _ _ a i neste e emplo.
Como podemos ver na sa da, o marcador fa um bom trabalho combinando strings.
e ado pon a o da pa ida 
CA Calif nia 33 
Ha ai Ha a 91 
NY No a Yo k 40 
Wa hing on DC Wa hing on 87 
No entanto, lembre-se de que ele ainda pode corresponder a nomes errados.
7. N a açã T
A normali ação de te to necessária para o processamento de linguagem natural. Isso
envolve as seguintes t cnicas para uniformi ar o te to.
Removendo espaços em branco, pontuação e caracteres não alfanum ricos
Tokeni ação, Stemming, Lemmati ation, remoção de palavras de parada
1
2
3
4
5
do processo de importa o fuzzywuzzy , fuzz 
estados = [ 'Nova York' , 'Calif rnia' , 'Washington' , 'Hava ' ]
df_states = pd . DataFrame ({ 'states' : [ 'NY' , 'CA' , 'Washington DC' , 'Hawai' ]})
df_states [[ 'match' , 'score' ]] = df_states [ 'states' ]. aplicar ( lambda x : proce
df_states
Ab a ca
07/03/2021 Um g ia di e a a lim a e e a a dad em P h F a k A d ade Ma de 2021 R m ci cia de dad
h :// a d da a cie ce.c m/a- aigh f a d-g ide- -clea i g-a d- e a i g-da a-i - h -8c82f209ae33 13/16
Para tornar as coisas simples, este artigo abordará apenas o primeiro ponto. No
entanto, voc pode ter uma visão geral de como lidar com a tokeni ação e palavras de
interrupção neste artigo que escrevi (verifique a seção Metodologia)
L a c ca a açã c
Antes de mesclar 2 quadros, temos que nos certificar de que a maioria das linhas
corresponderá, e normali ar a capitali ação ajuda com isso.
E istem várias maneiras de colocar o te to em letras min sculas em um quadro. Abai o
voc pode ver duas opç es ( .a l ou . .l e )
R a aç b a c c . ()
Às ve es, os dados t m espaços em branco à esquerda ou à direita. Podemos nos livrar
deles com o . i m todo
R a b a a . ac () . b ()
Te tos entre dois conjuntos de dados geralmente apresentam diverg ncias na
pontuação. Voc pode remov -lo com .a l a d . b ou usando . e lace
É bom usar qualquer um deles com e press es regulares. Por e emplo, o rege [^\ \ ]
o ajudará a remover caracteres diferentes de palavras (a , AZ, 0–9, _) ou espaços.
8. M c a c a
1
2
df_netflix_originals [ 'title' ] = df_netflix_originals [ 'title' ]. aplicar ( lambda 
df_netflix_originals [ 'title' ] = df_netflix_originals [ 'title' ]. str . inferior ()
1
2
df_netflix_originals['title'] = df_netflix_originals['title'].apply(lambda x:x.strip())
df_netflix_originals['title'] = df_netflix_originals['title'].str.strip()
1
2
3
# remove punctuation: clean characters other than word or spaces
df_netflix_originals['title'] = df_netflix_originals['title'].apply(lambda x:re.sub('[^\
df_netflix_originals['title'].replace('[^\w\s]', '', regex=True, inplace=True)
Ab a ca
07/03/2021 Um g ia di e a a lim a e e a a dad em P h F a k A d ade Ma de 2021 R m ci cia de dad
h :// a d da a cie ce.c m/a- aigh f a d-g ide- -clea i g-a d- e a i g-da a-i - h -8c82f209ae33 14/16
Finalmente, podemos mesclar o conjunto de dados df_ e fli _ igi al e
df_ e fli _2019 . Com isso, podemos identificar quais filmes são originais da Netfli e
quais pertencem apenas ao catálogo. Nesse caso, fa emos uma junção e terna para
fornecer o valor Catálogo a todas as linhas com valores va ios na O igi al" coluna " .
R a ca a c . _ ca ()
Uma das armadilhas da junção e terna com 2 colunas-chave que obteremos linhas
duplicadas se considerarmos uma coluna so inha. Nesse caso, mesclamos com base nas
colunas i le e elea e_ ea , portanto, mais provável que haja i le duplicatas
que tenham diferentes elea e_ ea .
Voc pode descartar duplicatas em uma coluna com o .d _d lica e m todo
Os dados agrupados por tipo e origem são distribu dos assim.
Em [1]: df_ne fli [['o iginal', ' ipo']]. Val e_co n ()
Fo a [1]: 
ipo o iginal 
Ca logo Filme 3763 
 P og ama de TV 1466 
Ne fli P og ama de TV 1009 
 Filme 504
É isso! Agora os dados estão limpos e prontos para serem processados! Voc ainda pode
limpar mais (se necessário) ou usar seus dados em seu projeto de ci ncia de dados
1
2
3
df_netflix = pd . mesclar ( df_netflix_originals , df_netflix_2019 , on = [ 't tulo' ,
 como = 'externo' )
df_netflix [ 'original' ]. fillna ( 'Cat logo' , inplace = True )
1
2
#drop_duplicates: dados duplicados devido ao desacordo em releaase_year
df_netflix . drop_duplicates ([ 'title' ], keep = 'first' , inplace = True )
Ab a ca
07/03/2021 Um g ia di e a a lim a e e a a dad em P h F a k A d ade Ma de 2021 R m ci cia de dad
h :// a d da a cie ce.c m/a- aigh f a d-g ide- -clea i g-a d- e a i g-da a-i - h -8c82f209ae33 15/16
como fi para encontrar os melhores filmes da Netfli e da Disne para aprender uma
l ngua estrangeira (projetos de PNL)
O melhore filme para aprender ma líng a e rangeira de
acordo com a ciência de dado
A a a á á a cab á á .
D c b a a 3000 a a a a ã ...
a a a a c c .c
Alguns projetos em que reuni dados do mundo real são os seguintes:
E co ma a pagar $ 180 / ano por ma ferramen a de apo a
l cra i a . E e ano e con r í m em P hon
C c a a c a a a a a a b
c Pa a S .
. a a .c
Ganhe dinheiro com P hon - The Spor Arbi rage Projec
C c a a a a a c a b a
a.
. a a .c
O c digo o á de a análi e e á di oní el no me Gi h b .
I c a- T Va ab
P T a Da a Sc c
T a a a - a , Va ab c a T a Da a Sc c : a á c 
a a a c a cê ã . Dê a a a.
R c ba b a
O a ã a a a a a b a@ a .c
.
V cê ã ?
Ab a ca
07/03/2021 Um g ia di e a a lim a e e a a dad em P h F a k A d ade Ma de 2021 R m ci cia de dad
h :// a d da a cie ce.c m/a- aigh f a d-g ide- -clea i g-a d- e a i g-da a-i - h -8c82f209ae33 16/16
C ê c a Da P ã T c a E caçã I ê c a a c a
S b A aJ c
Ob a a ca M
Ab a ca

Continue navegando