<jupyter_start><jupyter_text>**Nenhum Panda foi magoado durante este workshop**![alt text](https://media.giphy.com/media/wbFiPNhOEVKkU/giphy.gif)Porque infelizmente não estamos a falar de Pandas mas sim da biblioteca python "Pandas".[Website oficial](https://pandas.pydata.org/)  Imports usuaisOs blocos de código têm como escopo o notebook inteiro e não o bloco em si.Este bloco, a seguir, por exemplo, as importações vão estar disponiveis em todo o notebook<jupyter_code>'''Biblioteca para fazer tratamento e análise de informação'''
import pandas as pd


'''Biblioteca focada em computação cientifica e tratamento de dados'''
import numpy as np

'''Biblioteca para visualizar os resultados em graficos'''
import matplotlib.pyplot as plt<jupyter_output><empty_output><jupyter_text>_Nota_: Ver o site do MatplotLib para saber que graficos consegue criar e exemplos de como os criar.[Exemplos MatplotLib](https://matplotlib.org/gallery/index.html)  Estruturas de dadosExistem duas estruturas de dados fundamentais em Pandas:- [Series](https://pandas.pydata.org/pandas-docs/stable/dsintro.htmlseries)- [DataFrames](https://pandas.pydata.org/pandas-docs/stable/dsintro.htmldataframe) - *A que iremos usar mais*<jupyter_code>'''Series'''
s = pd.Series([1,3,"teste",np.nan])

# '''Visualizar 's' '''
s
'''DataFrames'''
df = pd.DataFrame(
    { 
'A' : 1.,
'B' : pd.Timestamp('20130102'),
'C' : s,
'E' : pd.Categorical(["barco","comboio","teste","comboio"]),
'F' : 'foo' })

'''Visualizar 'df' '''
df # <-- Lembrar desta variável pois ira persistir pelo notebook<jupyter_output><empty_output><jupyter_text>Métodos de Visualização de 'DataFrames'Existem vários comandos associados a "DataFrames" tais como:* .head()* .tail()* .columns* .values* .describe()* .mean()* .T--- Exercício 1- Experimentar estes comandos na variável 'df'- Porque aparecem menos colunas com o comando "mean()"<jupyter_code>'''Exercicio #1'''

df.columns<jupyter_output><empty_output><jupyter_text>Seleccionar Podemos escolher só uma coluna do Dataframe fazendo: dataframe[] ou dataframe.  o que irá retornar uma estrutura de dados *Serie* Se quisermos cortar a DataFrame também podemos usar [] para o efeito, como exemplo: *df[0:3]*, irá mostrar todas as linhas entre a primeira(0) e a terceira (2)<jupyter_code>df[0:-2]<jupyter_output><empty_output><jupyter_text>Exercício 2- Mostrar só a coluna 'E' da variável 'df'- Mostrar da 2ª à 3ª linha<jupyter_code>'''Exercicio #2'''

df.E[2:]# <Escrever Respostas Aqui><jupyter_output><empty_output><jupyter_text>Existem várias formas de selecionar dados de um Dataframe.Deixo aqui links para consulta:- [Selection By Label](https://pandas.pydata.org/pandas-docs/stable/indexing.htmlindexing-label)- [Selection by Position](https://pandas.pydata.org/pandas-docs/stable/indexing.htmlindexing-integer)ProTip: Guardar estes links, que vão ser imprescindiveis no futuro.  EditarSe quisermos adicionar uma coluna ao nosso DataFrame basta associa-lo a uma nova coluna ou editar uma já existente.Exemplo:<jupyter_code>'''Inicialização'''
A = pd.Series([1,1,2,3,5,8])
B = np.random.rand(6)

dataframe = pd.DataFrame({ 'Feature_A' : A,'Feature_B' : B})

dataframe
C = pd.Series(["Carro","Mota","Mota","Carro","Carro","Mota"])
dataframe["Feature_C"] = C

dataframe<jupyter_output><empty_output><jupyter_text>Existem várias formas de editar um DataFrame, deixo uma listagem de formas* [Concat](https://pandas.pydata.org/pandas-docs/stable/merging.htmlmerging)* [Join](https://pandas.pydata.org/pandas-docs/stable/merging.htmlmerging-join)* [Append](https://pandas.pydata.org/pandas-docs/stable/merging.htmlmerging-concatenation)* [Group By](https://pandas.pydata.org/pandas-docs/stable/groupby.htmlgroupby)  Categorias (Categorical)Acho este um dos mais importantes, tranforma dados continuous em categorias, um exemplo usual é tranformar notas de uma disciplina 0 a 100 para "Insuficiente", "Satisfaz", "Muito Bom" e depois ver quem passou ou não.  Inicialização do problema<jupyter_code>'''
Criação do DataFrame com 6 'alunos' com diferentes ids e o respectivo 'valor+ que
teve num certo teste
'''
df_notas = pd.DataFrame({
    "aluno":[1100,1200,1004,1102,1105,1109],
    "valor":[10,50,80,99,50,60]})

'''Extra: Ordena o Dataframe de ordem decrescente de notas'''
#df_notas = df_notas.sort_values(by="valor", ascending=False)

df_notas<jupyter_output><empty_output><jupyter_text>CategorizaçãoPega nos valores da coluna "valor" e categoriza de acordo com os rangesindicados de acordo, exemplo: entre [50 e 70[ será um Satifaz<jupyter_code>series_n = pd.cut(
    df_notas[['valor']].stack(),
    [0, 49, 70, 89, 100], # 0 < 50 < 70 < 90 < 100 
    labels=['Insuficiente', 'Satisfaz', 'Bom', 'Muito Bom']
)

series_n<jupyter_output><empty_output><jupyter_text>Vamos tornar a ```series_n``` num Dataframe agora.<jupyter_code>df_notas['nota'] = series_n.unstack()

df_notas<jupyter_output><empty_output><jupyter_text>Exercicio 3 * Adicionar uma nova coluna ao dataframe "notas" que indique se o aluno passou (true) ou não (false), sendo que o valor se passou tem de ser a cima de 50* Ordenar a tabela da melhor nota para a pior;<jupyter_code>'''
Exercicio #3
- Usar o Dataframe 'df_notas'
'''

df_notas['aproveitamento'] = [True if d > 50 else False for d in df_notas['valor']]
df_notas
df_notas = df_notas.sort_values(by=['valor'], ascending=False)
df_notas<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.13068498236495266, 'fraction_numerical': 0.0189344718767403, 'mean_word_length': 6.184, 'pattern_counts': {'":': 2, '<': 47, '<?xml version=': 0, '>': 43, 'https://': 11, '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': '10', 'dir': 'jupyter-structured-clean-dedup', 'id': '81955', 'license': 'MIT', 'n_tokens_mistral': 2124, 'n_tokens_neox': 2015, 'n_words': 515, 'path': 'Copy_of_001_Pandas.ipynb', 'repo_name': 'murlokito/Miscellanea', 'size': '5387'}