Skip to content

Commit

Permalink
RFC: Fixes clase 1 (#17)
Browse files Browse the repository at this point in the history
* fixes notebook python

* fix numpy nb

* fix pandas nb

* Fixed datetime range loc

* descargar archivo

* Update clases/01_introduccion/pandas_intro.py

Co-authored-by: CrossNox <ijmermet@gmail.com>

* Update clases/01_introduccion/pandas_intro.py

Co-authored-by: CrossNox <ijmermet@gmail.com>

* nota sobre leer csv desde gsheets

Co-authored-by: sofiamorseletto <sofia.morseletto@mercadolibre.com>
  • Loading branch information
CrossNox and sofiamorseletto authored Oct 6, 2020
1 parent 874d17e commit 23c6d39
Show file tree
Hide file tree
Showing 5 changed files with 197 additions and 31 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ venv
**.DS_Store
**.ipynb
build
clases/**/*.csv
6 changes: 4 additions & 2 deletions clases/01_introduccion/numpy_intro.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
# extension: .py
# format_name: light
# format_version: '1.5'
# jupytext_version: 1.6.0
# jupytext_version: 1.5.1
# kernelspec:
# display_name: Python 3
# display_name: Python 3 (venv)
# language: python
# name: python3
# ---
Expand Down Expand Up @@ -211,11 +211,13 @@
print(f"b: {b.shape}")
a + b

# + tags=["raises-exception"]
# Armamos un array que tenga distinta cantidad de filas y columnas que a
b = np.array([5, 1, 8])
print(f"a: {a.shape}")
print(f"b: {b.shape}")
a + b
# -

# Armamos un array que tenga la misma cantidad de filas que a
b = np.array([[2], [1]])
Expand Down
98 changes: 87 additions & 11 deletions clases/01_introduccion/pandas_intro.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
# extension: .py
# format_name: light
# format_version: '1.5'
# jupytext_version: 1.6.0
# jupytext_version: 1.5.1
# kernelspec:
# display_name: Python 3
# display_name: Python 3 (venv)
# language: python
# name: python3
# ---
Expand All @@ -30,11 +30,20 @@
# Para comenzar, vamos a crear nuestro primer DataFrame a partir de un archivo CSV que contiene un [dataset sobre superhéroes](https://www.kaggle.com/claudiodavi/superhero-set/home).

from collections import Counter
import requests

# Empezamos por descargarlo del drive de la materia.

with requests.get(
"https://docs.google.com/spreadsheets/d/1nuJAaaH_IP8Q80CsyS940EVaePkbmqhN3vlorDxYMnA/export?format=csv"
) as r, open("superheroes.csv", "wb") as f:
for chunk in r.iter_content():
f.write(chunk)

# +
import pandas as pd

df = pd.read_csv('../../datasets/superheroes.csv')
df = pd.read_csv("superheroes.csv")
# -

# También podemos crear dataframes desde listas, diccionarios y otras estructuras.
Expand Down Expand Up @@ -156,6 +165,8 @@ def rate_height(height):

# ## Eliminar filas con nulos

df

df = df.dropna(subset=['Skin color'])
df

Expand All @@ -167,9 +178,7 @@ def rate_height(height):

# Tenemos duplicados!

df.merge(df, left_on='Skin color', right_on='Skin color')[
['Race_x', 'Race_y']
].drop_duplicates()
df.merge(df, left_on='Skin color', right_on='Skin color')[['Race_x', 'Race_y']]

# Tenemos que sacar los que son iguales en ambas columnas!

Expand All @@ -178,6 +187,32 @@ def rate_height(height):
].drop_duplicates()
same_skin_color[same_skin_color.Race_x != same_skin_color.Race_y]

# +
# pd.merge?
# -

df1 = pd.DataFrame({'col': [1, 2, 3], 'val': [10, 11, 12]})
df2 = pd.DataFrame({'col': [2, 3, 4], 'val': [13, 14, 15]})

df1

df2

pd.merge(df1, df2, how='left', left_on='col', right_on='col')

pd.merge(df1, df2, how='inner', left_on='col', right_on='col')

pd.merge(df1, df2, how='right', left_on='col', right_on='col')

pd.merge(df1, df2, how='outer', left_on='col', right_on='col')

# +
# df1.merge?

# +
# df1.join?
# -

# Por último, para ver los pares únicos

same_skin_color = df.merge(df, left_on='Skin color', right_on='Skin color')[
Expand Down Expand Up @@ -213,9 +248,17 @@ def rate_height(height):
# queremos ver los nombres
df = df.reset_index()

df

df.groupby("Race")

df.columns
df.groupby("Race").agg(list)

(df['Alignment'] == 'good').mean() * 100

(df['Alignment'] == 'good').sum() / (df['Alignment'] == 'good').size

df.groupby("Race")['Alignment'].apply(len)


# +
Expand All @@ -238,6 +281,25 @@ def perc_good(grouping):

df.Race.value_counts()

# Y si lo queremos como porcentajes?

df.Race.value_counts() / df.Race.value_counts().sum() * 100

df.Race.value_counts(normalize=True)

# Veamos como podemos obtener las filas del dataframe original donde la columna `Race` este entre aquellos valores con mas del 5% de repeticiones.

over5 = df.Race.value_counts(normalize=True) > 0.05
mutants_over5 = df.Race.value_counts()[over5]

# Teniendo la indexacion, veamos como resolverlo con `isin`

df[df.Race.isin(mutants_over5.index)].head(5)

# Alternativamente, con `merge`

df.merge(mutants_over5, left_on='Race', right_index=True, how='inner')

# ## Pivoting


Expand Down Expand Up @@ -278,13 +340,13 @@ def alignment_to_numeric(alignment):

# # Ordenando

df.sort_index()
df.set_index('name').sort_index()

df.sort_values(by=['Height', 'Weight'], ascending=False)

# # Operaciones de strings

df.name.str.lower()
df.name.apply(lambda x: x.lower())

# Entre [otras](https://pandas.pydata.org/pandas-docs/stable/user_guide/text.html)

Expand All @@ -302,6 +364,7 @@ def alignment_to_numeric(alignment):

descripciones = ['cuarentena', 'cumpleañito', 'hoy']
desc_serie = pd.Series(data=descripciones, index=indice_fechas)
desc_serie

# ### to_datetime

Expand All @@ -326,16 +389,29 @@ def alignment_to_numeric(alignment):

# ### Filtro por fecha
#
# Usamos un dataset que registra el clima y demás datos para distintas fechas de [alquiler de bicicletas](https://www.kaggle.com/c/bike-sharing-demand/data?select=train.csv)
# Usamos un dataset que registra el clima y demás datos para distintas fechas de [alquiler de bicicletas](https://www.kaggle.com/c/bike-sharing-demand/data?select=train.csv).
#
# `pd.read_csv` nos deja leer archivos csv desde una URL. Este dataset esta tambien disponible en el drive de la materia. Leemos el dataset sin bajarlo a un archivo intermedio.

bicis_df = pd.read_csv('../datasets/bicis.csv').set_index('datetime')
# +
GSPREADHSEET_DOWNLOAD_URL = (
"https://docs.google.com/spreadsheets/d/{gid}/export?format=csv&id={gid}".format
)

bicis_df = pd.read_csv(
GSPREADHSEET_DOWNLOAD_URL(gid="1YocUXbrd6uYpOLpU53uMS-AD9To8y_r30KbZdsSSiVQ")
).set_index('datetime')
bicis_df
# -

bicis_df.loc['2012-12-19 20:00:00']

# Para poder quedarnos con un rango de fechas, debemos tener el índice ordenado
bicis_df = bicis_df.sort_index()
bicis_df.loc['2012-11-19 20:00:00':'2012-12-30 20:00:00']

bicis_df.truncate(before='2012-11-19 22:00:00', after='2012-12-01 00:00:00')
# -

# ### `dt` accessor

Expand Down
Loading

0 comments on commit 23c6d39

Please sign in to comment.