Skip to main content

4 posts tagged with "pandas"

View All Tags

· 3 min read
Darvin Cotrina

En este articulo vamos a ver como hacer resampling de series de tiempo con pandas. El resampling es un proceso de conversión de series de tiempo de una frecuencia a otra. La frecuencia puede ser diaria, mensual, trimestral, anual, etc. Por ejemplo, podemos convertir una serie de tiempo con frecuencia diaria a una serie de tiempo con frecuencia mensual. También podemos convertir una serie de tiempo con frecuencia mensual a una serie de tiempo con frecuencia anual.

1. Frecuencias de series de tiempo

Las series de tiempo pueden tener diferentes frecuencias, ahora vamos a ver las frecuencias que podemos encontrar en pandas.

CódigoDescripción
BFrecuencia de negocios
CFrecuencia personalizada
DFrecuencia diaria
WFrecuencia semanal
MFrecuencia mensual
QFrecuencia trimestral
AFrecuencia anual
HFrecuencia horaria
TFrecuencia minutal
SFrecuencia segundal

2. Importar librerías

Primero empesaremos importando las librerías que vamos a utilizar.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

3. Cagar y preparar los datos

Ahora vamos a crear un DataFrame con datos usando una frecuencia diaria.

date_range = pd.date_range('01/01/2020', periods=365, freq='D')
# crearemos datos para la demostración
data = np.random.randn(len(date_range))
df = pd.DataFrame(data, index=date_range, columns=['Value'])
# graficamos los datos
df.plot()
plt.show()

4. Resampling a una frecuencia mas baja (downsampling)

Ahora vamos a convertir la serie de tiempo con frecuencia diaria a una serie de tiempo con frecuencia mensual. Para hacer esto vamos a usar el método resample(), al tener una frecuencia mas baja tenemos que especificar como queremos que se agreguen los datos, vamos a tener que ingresar una función de agregación. En este caso vamos a usar la función mean() para calcular el promedio de los datos, peru tu puedes usar cualquier función de agregación que necesites.

df_monthly_mean = df.resample('M').mean()
df_monthly_mean.head(5)
# graficamos los datos
df_monthly_mean.plot()
plt.show()

5. Resampling a una frecuencia mas alta (upsampling)

Ya vimos como disminuir la frecuencia, ahora veremos como aumentar la frecuencia. Para hacer esto vamos a usar el método resample() y especificar la frecuencia que queremos. En este caso vamos a aumentar la frecuencia de diaria a horaria, para esto vamos a usar el código H que significa frecuencia horaria.

df_hourly = df.resample('H').ffill() # otros metodos: bfill, interpolate

Para poder ver con mas detalle los datos haremos un acercamiento a un periodo de tiempo especifico.

df_hourly.loc['2020-01-01':'2020-01-30'].plot()
plt.show()

6. Manejar los datos faltantes

Como pudimos ver en el ejemplo anterior cuando aumentamos la frecuencía de diaria a horaria, muchos valores se convirtieron en NaN. Para solucionar esto vamos a usar el método interpolate() para interpolar los valores faltantes.

df_hourly = df.resample('H').interpolate()
df_hourly.loc['2020-01-01':'2020-01-30'].plot()
plt.show()

7. Resampling con multiples metodos de agregación

Tambien podemos hacer un resampling con multiples métodos de agregación. Para hacer esto vamos a usar el método agg() y especificar los métodos de agregación que queremos usar.

df_weekly = df.resample('W').agg(['mean', 'std', 'min', 'max'])
df_weekly.plot()
plt.show()

Eso es todo por ahora, espero que este articulo te haya sido de ayuda

· 3 min read
Darvin Cotrina

Comparar series de tiempo con pandas

Comparar series de tiempo con pandas, de algunas acciones de las principales empresas tecnológicas.

1. Importar librerías

Para este ejercicio, se necesitara de las siguientes librerías:

pip install pandas
pip install matplotlib
pip install yfinance

Usaremos la librería yfinance para obtener los datos de las acciones de las empresas tecnológicas, hay otras librearías que también pueden ayudar con esta tarea como pandas_datareader o quandl.

import pandas as pd
import matplotlib.pyplot as plt
import yfinance as yf

2. Obtener datos

Para este ejemplo, se obtendrán los datos de las acciones de las empresas tecnológicas desde el 2015 de google, amazon, facebook, apple y microsoft.

tickets = ['GOOG', 'AMZN', 'META', 'AAPL', 'MSFT']
start_date = '2015-01-01'
end_date = '2023-01-01'

df = yf.download(tickets, start=start_date, end=end_date)['Adj Close']
df.head()
[*********************100%***********************]  5 of 5 completed
AAPLAMZNGOOGMETAMSFT
Date
2015-01-0224.53176315.426026.16865378.44999740.620667
2015-01-0523.84066615.109525.62315277.19000240.247116
2015-01-0623.84291314.764525.02928276.15000239.656406
2015-01-0724.17723814.921024.98640176.15000240.160259
2015-01-0825.10618415.023025.06518478.18000041.341694

3. Normalizar datos

Para poder comparar los datos vamos a normalizarlos, para esto se usará la siguiente fórmula:

$$ \frac{P_t}{P_0} * 100 $$ Donde PtP_t es el precio en el tiempo tt y P0P_0 es el precio inicial.

normalized_df = df / df.iloc[0] * 100
normalized_df.head()
AAPLAMZNGOOGMETAMSFT
Date
2015-01-02100.000000100.000000100.000000100.000000100.000000
2015-01-0597.18284797.94827197.91543898.39388899.080393
2015-01-0697.19200695.71178595.64604397.06820297.626183
2015-01-0798.55483496.72630595.48217997.06820298.866569
2015-01-08102.34154097.38752895.78323899.655836101.775026

4. Graficar datos

Por ultimo grafiaremos los datos para poder compararlos y ver como se han comportado en el tiempo.

normalized_df.plot(figsize=(15, 10))
plt.show()

5. Conclusiones

Como hemos podido ver hacer una comparación de series de tiempo es muy sencillo con pandas, y nos permite ver como se han comportado las acciones de las empresas tecnológicas en los últimos años, las concluciones respecto al comportamiento de las acciones de las empresas tecnológicas se las dejo a ustedes.

· 2 min read
Darvin Cotrina

¿Como ver los días de la semana usando pandas?`

Con pandas podemos ver de forma muy sencilla los días de la semana de una fecha en específico, para esto usaremos la función weekday_name y con dayofweek podemos ver el número del día de la semana.

import pandas

day = pandas.to_datetime('2023-07-10')
print(day.dayofweek, day.day_name())
0 Monday
# todos los días de la semana
week = pandas.date_range(start='2023-07-10', periods=7, freq='D')
for day in week:
print(day.dayofweek, day.day_name())
0 Monday
1 Tuesday
2 Wednesday
3 Thursday
4 Friday
5 Saturday
6 Sunday
# df con los dias de la semana
df = pandas.DataFrame(week, columns=['date'])
df['dayofweek'] = df['date'].dt.dayofweek
df['dayname'] = df['date'].dt.day_name()
df.set_index('date', inplace=True)
df
dayofweekdayname
date
2023-07-100Monday
2023-07-111Tuesday
2023-07-122Wednesday
2023-07-133Thursday
2023-07-144Friday
2023-07-155Saturday
2023-07-166Sunday

· One min read
Darvin Cotrina

Tanto numpy como pandas tienen funciones que permiten aplicar una funcion a un array o dataframe, respectivamente, de forma vectorizada. Esto significa que la funcion se aplica a todos los elementos del array o dataframe, sin necesidad de iterar sobre ellos. Esto es mucho mas eficiente que iterar sobre los elementos, ya que no se necesita hacer un loop en python, sino que la funcion se aplica en C.

import numpy as np
import pandas as pd

# comparación de vectorize de numpy vs apply de pandas

# vectorize de numpy
def f(x):
return x**2 + 1

array = np.arange(100000, dtype=np.int16)

%timeit np.vectorize(f)(array)
# pandas apply
df = pd.DataFrame({'x': array})
%timeit df['x'].apply(f)
24.2 ms ± 1.56 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
40.7 ms ± 1.01 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

Esta es una comparación muy simple entre ambas formas de aplicar una funcion, pero nos da una idea bastante clara de la diferencia de performance entre ambas, como podemos ver vectorize fue mucho mas rapido que apply.