<jupyter_start><jupyter_text><jupyter_code>import pandas as pd
import numpy  as np

import matplotlib.pyplot as plt
import seaborn as sns
sns.set()

url_dados = 'https://github.com/alura-cursos/imersaodados3/blob/main/dados/dados_experimentos.zip?raw=true'

dados = pd.read_csv(url_dados, compression = 'zip')
mapa = {'droga': 'composto'}
dados.rename(columns=mapa, inplace=True)<jupyter_output><empty_output><jupyter_text>Aula 4 Olá cientista!Seja bem vindo e bem vinda à aula 04!Na aula passada, exploramos a relação e a correlação entre nossas variáveis. Estudamos a função ```crosstab```, gráfico de dispersão, linha de tendência, correlação entre variáveis e mapa de calor. Puxa, foi muita coisa!Você conseguiur resolver os desafios que o Guilherme, o Thiago e a Vanessa deixaram pra vocês? Esperamos que sim porque hoje, vamos mergulhar na nossa penúltima aula!A primeira coisa que vamos fazer para essa aula é abrir a nossa outra base de dados. Para baixá-la vamos acessar o github para copiarmos o link do arquivo. No repositório nós temos dois arquivos: os dados_experimentos.zip e o dados_arquivos.csv. Nós vamos agora trabalhar com os dados_arquivos.csv.Vamos clicar com o botão esquerdo; assim que ele abrir, vamos clicar na opção "View raw" com o botão direito, e selecionar a opção "copiar endereço do link".Vamos importar o pandas(caso você não tenha importado ainda) para nos ajudar a ler essa base de dados, através do seguinte código:<jupyter_code>dados_resultados = pd.read_csv('https://github.com/alura-cursos/imersaodados3/blob/main/dados/dados_resultados.csv?raw=true')
dados_resultados.head()<jupyter_output><empty_output><jupyter_text>Repare que ele já mostra pra gente o número de colunas: 207. Ou seja, é um dataset bem extenso.Vamos começar a analisar as colunas. A primeria coluna tem o nome de "id", o que nos remete a um identificador. Além disso, as seguintes colunas possuem nomes bem complexos. Não são nomes muito descritivos para quem não é da área.Com a ajuda da Vanessa, descobrimos que esses nomes remetem aos mecanismos de ação das drogas. Ou seja, esses dados nos trazem a relação do mecanismo de ação do alvo (enzima, proteína, etc) com a droga utilizada. Ela também explicou sobre os termos "agonista" e "antiagonista", que ativam o receptor e o bloqueiam, respectivamente.Nesse ponto a Vanessa nos explica numa apresentação como funciona a ligação do spike com o receptor e todo o procedimento de infecção nas nossas células.Agora já sabemos que cada coluna do nosso dataframe representa um mecanismo de ação. Olhando para nosso cabeçalho percebemos que temos praticamente todos os dados com o valor 0. Será que todos os dados da tabela tem esse valor? Vamos investigar!<jupyter_code>dados_resultados['acetylcholine_receptor_agonist'].unique()<jupyter_output><empty_output><jupyter_text>Olha só! Nosso resultado foi um array entre 0 e 1. Se você quiser fazer um teste com todos os outros mecanismos de ação também encontrará o resultado entre 0 e 1. Mas por que isso acontece?Cada linha é o resultado do experimento da outra base de dados dos experimentos que trabalhamos. Quando um determinado mecanismo de ação é ativado ele é indicado como 1. Quando esse mecanismo de ação não é ativado ele é detectado como 0.Portanto, todo resultado que obtivermos o número 1, saberemos que ele foi ativado.Vamos fazer uma investigação agora que pode ser muito interessante para o cientista que está trabalhando nesse projeto: qual foi o mecanismo de ação que foi mais ativado?Vamos então fazer a soma das colunas, para saber qual vai ser o que apresenta mais o número 1. Mas antes vamos verificar se todas as minhas colunas possuem somente números ou se possuem strings também nelas, através desse código:<jupyter_code>dados_resultados.info()<jupyter_output><class 'pandas.core.frame.DataFrame'>
RangeIndex: 23814 entries, 0 to 23813
Columns: 207 entries, id to wnt_inhibitor
dtypes: int64(206), object(1)
memory usage: 37.6+ MB<jupyter_text>Vimos que uma delas apresenta como resultado 1 objeto. Ou seja, não conseguiremos aplicar a função soma de forma direta.Vamos então fazer essa soma excluindo a coluna id, que possui dados diferentes de números em sua composição, da seguinte maneira:<jupyter_code># contagem_moa = dados_resultados.select_dtypes('int64').sum().sort_values(ascending=False)
contagem_moa = dados_resultados.drop('id', axis=1).sum().sort_values(ascending=False)
contagem_moa<jupyter_output><empty_output><jupyter_text>Legal. No resultado há uma informação que nos chama a atenção: os inibidores, no topo do nosso resultado, são os que possuem maior quantidade de resultados positivos. Seria um ponto a se investigar.Então aqui vamos ter o nosso primeiro desafio da aula 4. Lembrando que todos os desafios estão no final desse notebook da aula. Nós fizemos uma contagem para saber onde o mecanismo de ação obteve mais respostas; agora vamos fazer outros testes.Vamos verificar se a linha específica que vamos escolher foi ativada em algum momento. E, se ela foi ativada, quantas vezes isso ocorreu?Utilizaremos o seguinte código:<jupyter_code>dados_resultados.drop('id', axis=1).sum(axis=1)<jupyter_output><empty_output><jupyter_text>E aqui temos o nosso resultado. Na primeira linha tivemos uma única ativação. Já na segunda não obtivemos nenhuma. Na terceira tivemos 3, e assim por diante. Nesse que tivemos a resposta como 0, precisaríamos saber se foi um controle, ou se realmente a droga não ativou nenhuma resposta.Aqui embaixo temos os nossos dados dos resultados:<jupyter_code>dados_resultados.head()<jupyter_output><empty_output><jupyter_text>E aqui temos a nossa base de dados:<jupyter_code>dados.head()<jupyter_output><empty_output><jupyter_text>Na base de dados resultados não temos a informação que queremos, referente ao tratamento. Nós só temos a coluna tratamento na base de dados inteira.No tratamento só temos a coluna id, e os mecanismos de ação que foram ativados por aquela coluna. Então, agora, precisamos de alguma maneira, mesclar essas informações.Antes de fazer esse passo, de mesclar, vamos criar duas novas colunas na base de dados resultado. Vamos criar uma primeira coluna que vamos chamar de n_moa(número de moas ativos), que é justamente o que havíamos calculado anteriormente, dessa maneira:<jupyter_code>dados_resultados['n_moa'] = dados_resultados.drop('id', axis=1).sum(axis=1)<jupyter_output><empty_output><jupyter_text>Vamos então verificar se a coluna apresenta resultados diferentes de 0; se for diferente de 0 ela retorna a mensagem 'true'; se for igual a 0 retorna 'false':<jupyter_code>dados_resultados['n_moa'] != 0<jupyter_output><empty_output><jupyter_text>Ok, então o código para criarmos e visualizarmos as duas colunas é esse:<jupyter_code>dados_resultados['ativo_moa'] = (dados_resultados['n_moa'] != 0)
dados_resultados.head()<jupyter_output><empty_output><jupyter_text>Para visualizarmos basta ir até as duas últimas colunas que elas estarão lá. Agora que temos as duas colunas que queremos, vamos mesclar, ou então "mergear", as informações que queremos.Para isso vamos utilizar o merge do pandas, através desse código:<jupyter_code>dados_combinados = pd.merge(dados, dados_resultados[['id','n_moa', 'ativo_moa']], on='id')
 dados_combinados.head()<jupyter_output><empty_output><jupyter_text>Maravilha! Conseguimos agora a junção dos nossos dados de resultados com os dados de experimentos. Agora conseguimos responder a pergunta que fizemos anteriormente. No tratamento eu ativei algum moa? Para fazer isso vamos utilizar o método:> Bloco com recuo<jupyter_code>dados_combinados.query('tratamento == "com_controle"' )['ativo_moa'].value_counts()<jupyter_output><empty_output><jupyter_text>E obtivemos todas as respostas com o 'false'. Isso quer dizer que com controle não tivemos nenhuma resposta de algum mecanismo de ação. Agora, será que algum tratamento que o paciente recebeu (com_droga, nesse caso) teve alguma substância que não ativou o mecanismo de ação? Vamos responder isso com a seguinte alteração no código anterior:<jupyter_code>dados_combinados.query('tratamento == "com_droga"' )['ativo_moa'].value_counts()<jupyter_output><empty_output><jupyter_text>Olha só, tivemos um resultado interessante. Vemos que 14447 tiveram mecanismos de ação, e aproximadamente 7500 não foram ativados.  Vamos fazer uma análise utilizando agora o boxplot, que gera uma imagem onde podemos identificar a mediana(linha central) e os quartis, entendendo assim como está a distribuição dos dados; dessa maneira vamos identificar, de forma visual, a comparação de categoria dos dados. Para isso vamos utilizar os seguintes códigos:<jupyter_code>composto_principal = dados_combinados['composto'].value_counts().index[:5]
plt.figure(figsize=(12,8))
sns.boxplot(data = dados_combinados.query('composto in @composto_principal'),
            y= 'g-0', x='composto', hue='ativo_moa');<jupyter_output><empty_output><jupyter_text>Analisando os boxplots, percebemos que temos algumas categorias com a mediana próxima de 0; temos outra com a mediana próxima de 5 e a outra próxima de 2.É curioso observarmos também que o 3º boxplot, da esquerda para a direita, está bem concentrado; esse composto específico é na verdade o composto que nos indica que foi "com tratamento".Outro ponto interessante é que o último boxplot tem um comportamento muito semelhante ao 3º; provavelmente a droga não modificou tanto assim o gene 0.Agora é com você! Faça os desafios e nos encontramos na próxima aula.  Desafios Aula 4  Desafio 01: Encontrar o top 10, das ações do MOA (inibidor, agonista...)  Case 01<jupyter_code># Visualizando como a funão endswith funciona
dados_resultados.columns.str.endswith('inhibitor')
# mostrando o resultado total de todas as colunas que acabam com inibidor e antagonista
print(dados_resultados[[x for x in dados_resultados.columns if x.endswith('inhibitor')]].sum().sum())
print(dados_resultados[[x for x in dados_resultados.columns if x.endswith('antagonist')]].sum().sum())
# Verificando quantos colunas não entraram na contagem, será nescessario outro método para conta-las
dados_resultados[[x for x in dados_resultados.columns if not (x.endswith('inhibitor') or x.endswith('antagonist'))]]<jupyter_output><empty_output><jupyter_text>Case 02<jupyter_code># Criando uma tabela com as somas e retirando o texto depois do ultimo underline
df_sum = pd.DataFrame(data={'agent':contagem_moa.index, 'count':list(contagem_moa)}, index=np.arange(206))
df_sum['action'] = [row[-1] for row in list(df_sum['agent'].str.rsplit('_',1))]
df_sum
# Somando, ordenando e descobrindo todos os tipos de acionadores da tabela resultados. 
contagem_moa2 = df_sum.groupby(by='action').sum().sort_values(by='count', ascending=False)
contagem_moa2
# Descobrindo oque é o "b"
df_sum.query('action == "b"')
import plotly.express as px

fig = px.bar(contagem_moa2, x=contagem_moa2.index[:5], y=contagem_moa2['count'][:5], 
             title='Top 5 MOA')
fig.show()<jupyter_output><empty_output><jupyter_text>Desafio 02: Criar a coluna eh_controle para quando na linha tratamento == com_controle<jupyter_code># Aplicando manualmente uma função lambda para a criaão da coluna
dados_combinados['eh_controle'] = dados_combinados['tratamento'].map(
    lambda x: 1 if x == 'com_controle' else 0)
dados_combinados[['id', 'tratamento', 'eh_controle']]<jupyter_output><empty_output><jupyter_text>Desafio 03: Criar três colunas para indicar o tempo 24, 48, 72<jupyter_code>pd.get_dummies(dados_combinados, columns=['tempo']).iloc[:, -3:]<jupyter_output><empty_output><jupyter_text>Desafio 04: Estudar sobre combinações de DF [.merge()](https://pandas.pydata.org/pandas-docs/stable/user_guide/merging.html)  Desafio 05: Fazer análise mais detalhada considerando tempo e dose, para comparar as distribuições (Escolher uma droga e comparar com controle)<jupyter_code>plt.figure(figsize=(16,6))

plt.subplot(1,2,1)
sns.boxplot(data=dados.query('composto in @composto_principal'), 
            y='g-0', x='composto', hue='dose');

plt.subplot(1,2,2)
sns.boxplot(data=dados.query('composto in @composto_principal'), 
            y='g-0', x='composto', hue='tempo');<jupyter_output><empty_output><jupyter_text>Em alguns casos, tanto para dose, tanto para tempo, é possivel ver uma tendencia positiva ou negativa e em outros não houve diferença, aparentando não haver muita significancia no geral.O que teve a maior diferença de expressão foi o composto 87d714366 em relação ao tempo.  Desafio 06: Descobrir se tem algum composto que dependendo da configuração do experimento, ativa ou não ativa algum MOA<jupyter_code># Plotando um gráfico para visualizar a alteração dos MOA's pelo tempo
sns.boxplot(data=dados_combinados, x='tratamento', y='n_moa', hue='tempo');<jupyter_output><empty_output><jupyter_text>Não tem formato caracteristico de um boxplot mas isso demonstra que no grupo controle de fato não ocorre MOA e que não há variação de MOA's pelo tempo.<jupyter_code># Agrupando os dados para visualizar se houve alteração, o valor 0 significa que não.
dados.iloc[:,:5].merge(dados_resultados, on='id'
).iloc[:,2:].groupby(by=['composto', 'tempo', 'dose']).nunique().std().unique()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.07927476862388105, 'fraction_numerical': 0.010544682142315279, 'mean_word_length': 6.195960698689956, 'pattern_counts': {'":': 0, '<': 89, '<?xml version=': 0, '>': 90, 'https://': 3, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '22', 'dir': 'jupyter-structured-clean-dedup', 'id': '262853', 'license': 'MIT', 'n_tokens_mistral': 4802, 'n_tokens_neox': 4597, 'n_words': 1543, 'path': 'Aula_04.ipynb', 'repo_name': 'humbertomonteiro8/ImersaoDados3', 'size': '13182'}