~~stoggle_buttons~~
===== links =====
* [[https://towardsdatascience.com/5-gotchas-with-pandas-974df6595e61]]
* [[https://towardsdatascience.com/6-lesser-nown-yet-awesome-tricks-in-pandas-32236f3785c8]]
* [[https://github.com/pandas-dev/pandas2|pandas2]] Está en beta
===== pandas ecosystem =====
Qué hacer si te quedas sin RAM para procesar todos tus datos, quieres encadenar //pipes// de pandas, paralelizar operaciones...
* [[https://pandas.pydata.org/pandas-docs/stable/ecosystem.html|Pandas ecosystem]] Otras librerías/plugins de pandas para procesamiento en paralelo o en disco
* [[https://blaze.pydata.org/|Blaze ecosystem]]
* [[https://github.com/rapidsai/cudf|cudf]] GPU DataFrames
* [[https://github.com/shaypal5/pdpipe|pdpipe]] Empipar pandas
* [[https://koalas.readthedocs.io/en/latest/|koalas]] Pandas+Spark
* [[https://towardsdatascience.com/one-word-of-code-to-stop-using-pandas-so-slowly-793e0a81343c|Swifter con análisis de tiempo]]
Pandas es más lento que numpy para hacer cálculos pesados, pero usando Swifter va mucho más rápido
===== df.to_sql =====
engine = create_engine(sqlalchemy_url, fast_executemany=True)
data_frame.to_sql(table_name, engine, method="multi")
[[https://stackoverflow.com/questions/48006551/speeding-up-pandas-dataframe-to-sql-with-fast-executemany-of-pyodbc]]
==== tipado del DataFrame ====
[[https://github.com/pandas-dev/pandas/issues/13049]]
* Ahora mismo, si una query no devuelve resultados, los tipos de las variables cambian a un valor por defecto (los números cambian a cosas como Float64, a veces a Int64, y los Timestamp pasan a ser object, por ejemplo).
* Si más adelante asumimos el tipo de una columna específica puede dar lugar a errores en tiempo de ejecución si el DataFrame llega vacío (por ejemplo al hacer merge los tipos tienen que coincidir y si no da un error)
* Lo que se puede hacer es asegurarse de los tipos justo después de ejecutar la query para aislar este comportamiento
===== fechas en csv =====
Se pierde el formato de la fecha
df.date = pd.to_datetime(df.date, format="%Y-%m-%d")
df.date = [x.date() for x in df.date.dt.to_pydatetime()]
===== Aplicar a 2 columnas =====
df['point'] = df[['lat', 'lng']].apply(Point, axis=1)
===== df.isin =====
import pandas as pd
df.isin({'columna': })
# Comprueba si cada elemento de esta en df['columna'], es equivalente a un in
===== df.where =====
Si estamos trabajando con algún DataFrame que tenga nulos, hay que tener cuidado de no tirarlos cuando hagamos ''dropna()'', ya que por defecto tiene parámetro ''how='any''' y tira todas las filas que tengan un NaN en alguna columna.
df.where(df['a'] > 1).dropna(how='all')
===== filtros temporales =====
* [[https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.between_time.html#pandas.DataFrame.between_time|between_time('0:15', '0:45')]]
* [[https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.at_time.html#pandas.DataFrame.at_time|at_time]]
* Si se usa una fecha como índice, se pueden hacer cosas como ''%%df['2020-01':'2020-02']%%''
===== df.groupby =====
* Luego para volver a tener un índice tienes que hacer ''.reset_index()''
===== Pequeños trucos =====
nsmallest() and nlargest() → Cuando tienes un dataframe grande, en vez de sort_values,
te saca los N primeros/últimos
ne() → not equal
idxmin, idxmax → te saca el primer índice/último que cumple una condición
===== df.query =====
filter = df.query(f'id = 1149361 and date < {current_date}')
Hace ''dropna()'' automáticamente, así que hay que tener cuidado si hay algún NaN
[[https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.query.html|Documentación de query]]
===== merge_asof =====
merge por distancia mínima
===== utilidades =====
* ''df.to_clipboard''
* ''pd.options.mode.chained_assignment = None'' para quitar [[https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy|warning]]