Manipulación de datos de series temporales en Python

Una colección de observaciones (actividad) para un solo sujeto (entidad) en varios intervalos de tiempo se conoce como datos de series de tiempo. En el caso de las métricas, las series temporales están igualmente espaciadas y en el caso de los eventos, las series temporales están desigualmente espaciadas. Podemos agregar la fecha y la hora para cada registro en este módulo de Pandas, así como obtener registros de marcos de datos y descubrir datos dentro de un rango de fecha y hora específico. 

Generar un rango de fechas:

Se importa el paquete Pandas. El método pd.date_range() se usa para crear un rango de fechas, el rango de fechas tiene una frecuencia mensual.

Python3

# importing pandas
import pandas as pd
  
# creating a date range
Date_range = pd.date_range(start='1/12/2020', end='20/5/2021', freq='M')
print(Date_range)
  
print(type(Date_range))
print(type(Date_range[0]))

Producción:

DatetimeIndex(['2020-01-31', '2020-02-29', '2020-03-31', '2020-04-30',
               '2020-05-31', '2020-06-30', '2020-07-31', '2020-08-31',
               '2020-09-30', '2020-10-31', '2020-11-30', '2020-12-31',
               '2021-01-31', '2021-02-28', '2021-03-31', '2021-04-30'],
              dtype='datetime64[ns]', freq='M')
<class 'pandas.core.indexes.datetimes.DatetimeIndex'>
<class 'pandas._libs.tslibs.timestamps.Timestamp'>

Operaciones en datos de marca de tiempo:

El intervalo de fechas se convierte en un marco de datos con la ayuda del método pd.DataFrame() . La columna se convierte a DateTime usando el método to_datetime() . El método info() brinda información sobre el marco de datos si hay valores nulos y el tipo de datos de las columnas.

Python3

# importing pandas
import pandas as pd
  
# creating a date range
Date_range = pd.date_range(start='1/12/2020', end='20/5/2021', freq='M')
  
# creating a Dataframe
Data = pd.DataFrame(Date_range, columns=['Date'])
  
# converting the column to datetime
Data['Date'] = pd.to_datetime(Data['Date'])
print(Data.info())

Producción:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 16 entries, 0 to 15
Data columns (total 1 columns):
 #   Column  Non-Null Count  Dtype         
---  ------  --------------  -----         
 0   Date    16 non-null     datetime64[ns]
dtypes: datetime64[ns](1)
memory usage: 256.0 bytes

Convierta datos de una string a una marca de tiempo:

si tenemos una lista de datos de string que se asemeja a DateTime, primero podemos convertirla en un marco de datos usando el método pd.DataFrame() y convertirla a la columna DateTime usando el método pd.to_datetime()

Python3

# importing pandas
import pandas as pd
  
# creating string data
string_data = ['2020-01-31', '2020-02-29', '2020-03-31', '2020-04-30',
               '2020-05-31', '2020-06-30', '2020-07-31', '2020-08-31',
               '2020-09-30', '2020-10-31', '2020-11-30', '2020-12-31',
               '2021-01-31', '2021-02-28', '2021-03-31', '2021-04-30']
  
Data = pd.DataFrame(string_data, columns=['Date'])
Data['Date'] = pd.to_datetime(Data['Date'])
print(Data.info())

Producción:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 16 entries, 0 to 15
Data columns (total 1 columns):
 #   Column  Non-Null Count  Dtype         
---  ------  --------------  -----         
 0   Date    16 non-null     datetime64[ns]
dtypes: datetime64[ns](1)
memory usage: 256.0 bytes
None

Según el formato de nuestros valores de string, podemos convertirlos a DateTime. La función datetime.strptime() se puede usar en este escenario

Python3

# importing pandas
import pandas as pd
from datetime import datetime
  
# string data
string_data = ['May-20-2021', 'May-21-2021', 'May-22-2021']
timestamp_data = [datetime.strptime(x, '%B-%d-%Y') for x in string_data]
print(timestamp_data)
  
Data = pd.DataFrame(timestamp_data, columns=['Date'])
print(Data.info())

Producción:

[fechahora.fechahora(2021, 5, 20, 0, 0), fechahora.fechahora(2021, 5, 21, 0, 0), fechahora.fechahora(2021, 5, 22, 0, 0)]

<clase ‘pandas.core.frame.DataFrame’>

RangeIndex: 3 entradas, 0 a 2

Columnas de datos (total 1 columnas):

 # Columna Recuento no nulo Dtype         

— —— ————– —–         

 0 Fecha 3 no nulo datetime64[ns]

tipos de datos: datetime64[ns](1)

uso de memoria: 152.0 bytes

Segmentación e indexación de datos de series temporales:

El archivo CSV se importa en este ejemplo y una columna con datos de string se convierte en DateTime usando el método pd.to_timestamp() . Esa columna en particular se establece como un índice que nos ayuda a dividir e indexar los datos en consecuencia. datos. loc[‘2020-01-22’][:10] indexa los datos del día ‘2020-01-22’ y el resultado se divide aún más para devolver las primeras 10 observaciones de ese día.

Para ver y descargar el archivo CSV, haga clic aquí.

Python3

# importing pandas
import pandas as pd
  
# reading csv file
data = pd.read_csv('covid_data.csv')
  
# converting string data to datetime
data['ObservationDate'] = pd.to_datetime(data['ObservationDate'])
  
# setting index
data = data.set_index('ObservationDate')
print(data.head())
  
# indexing and slicing through the dataframe
print(data.loc['2020-01-22'][:10])

Producción:

                 Unnamed: 0 Province/State  ... Deaths Recovered
ObservationDate                             ...                 
2020-01-22                0          Anhui  ...    0.0       0.0
2020-01-22                1        Beijing  ...    0.0       0.0
2020-01-22                2      Chongqing  ...    0.0       0.0
2020-01-22                3         Fujian  ...    0.0       0.0
2020-01-22                4          Gansu  ...    0.0       0.0

[5 rows x 7 columns]
                 Unnamed: 0 Province/State  ... Deaths Recovered
ObservationDate                             ...                 
2020-01-22                0          Anhui  ...    0.0       0.0
2020-01-22                1        Beijing  ...    0.0       0.0
2020-01-22                2      Chongqing  ...    0.0       0.0
2020-01-22                3         Fujian  ...    0.0       0.0
2020-01-22                4          Gansu  ...    0.0       0.0
2020-01-22                5      Guangdong  ...    0.0       0.0
2020-01-22                6        Guangxi  ...    0.0       0.0
2020-01-22                7        Guizhou  ...    0.0       0.0
2020-01-22                8         Hainan  ...    0.0       0.0
2020-01-22                9          Hebei  ...    0.0       0.0

[10 rows x 7 columns]

En este ejemplo, dividimos los datos de ‘2020-01-22’ a ‘2020-02-22’. 

Python3

# importing pandas
import pandas as pd
from datetime import datetime
  
# reading csv file
data = pd.read_csv('covid_data.csv')
  
# converting string data to datetime
data['ObservationDate'] = pd.to_datetime(data['ObservationDate'])
  
# setting index
data = data.set_index('ObservationDate')
  
# indexing and slicing through the dataframe
print(data.loc['2020-01-22':'2020-02-22'])

Producción:

                 Unnamed: 0   Province/State  ... Deaths Recovered
ObservationDate                               ...                 
2020-01-22                0            Anhui  ...    0.0       0.0
2020-01-22                1          Beijing  ...    0.0       0.0
2020-01-22                2        Chongqing  ...    0.0       0.0
2020-01-22                3           Fujian  ...    0.0       0.0
2020-01-22                4            Gansu  ...    0.0       0.0
...                     ...              ...  ...    ...       ...
2020-02-22             2169  San Antonio, TX  ...    0.0       0.0
2020-02-22             2170      Seattle, WA  ...    0.0       1.0
2020-02-22             2171        Tempe, AZ  ...    0.0       0.0
2020-02-22             2172          Unknown  ...    0.0       0.0
2020-02-22             2173              NaN  ...    0.0       0.0

[2174 rows x 7 columns]

Remuestreo de datos de series de tiempo para varios agregados/estadísticas resumidas para diferentes períodos de tiempo:

Para volver a muestrear datos de series temporales, utilice la función pandas resample() . Es una técnica de conveniencia de remuestreo y conversión de frecuencia de series de tiempo. La persona que llama debe proporcionar la etiqueta de una serie/índice similar a DateTime al argumento de palabra clave en/nivel si el objeto tiene un índice similar a DateTime.

Python3

# importing pandas
import pandas as pd
from datetime import datetime
  
# reading csv file
data = pd.read_csv('covid_data.csv')
  
# converting string data to datetime
data['ObservationDate'] = pd.to_datetime(data['ObservationDate'])
  
# setting index
data = data.set_index('ObservationDate')
  
# resampling data according to year
data = data.resample('Y').mean()
print(data)

Producción:

                 Unnamed: 0      Confirmed       Deaths     Recovered
ObservationDate                                                      
2020-12-31          96232.5   39696.116550  1160.959453  24659.893368
2021-12-31         249447.0  163315.277678  3514.893386  93925.632661

Calcule una estadística móvil como un promedio móvil:

Dataframe creado con Pandas. El método rolling() le permite calcular ventanas móviles. La idea de calcular una ventana móvil se emplea más comúnmente en el procesamiento de señales y datos de series de tiempo. Para decirlo de otra manera, tomamos una ventana de tamaño k a la vez y le aplicamos alguna operación matemática. Una ventana de tamaño k significa que se muestran k valores sucesivos al mismo tiempo. Todos los valores de ‘k’ tienen la misma ponderación en el caso más simple. En el siguiente ejemplo, el tamaño de la ventana es 5.

Python3

# importing pandas
import pandas as pd
from datetime import datetime
  
# reading csv file
data = pd.read_csv('covid_data.csv')
  
# converting string data to datetime
data['ObservationDate'] = pd.to_datetime(data['ObservationDate'])
data['Last Update'] = pd.to_datetime(data['Last Update'])
  
# setting index
data = data.set_index('ObservationDate')
  
data = data[['Last Update', 'Confirmed']]
data['rolling_sum'] = data.rolling(5).sum()
print(data.head())

Producción:

                         Last Update  Confirmed  rolling_sum
ObservationDate                                            
2020-01-22      2020-01-22 17:00:00        1.0          NaN
2020-01-22      2020-01-22 17:00:00       14.0          NaN
2020-01-22      2020-01-22 17:00:00        6.0          NaN
2020-01-22      2020-01-22 17:00:00        1.0          NaN
2020-01-22      2020-01-22 17:00:00        0.0         22.0

Tratar con datos faltantes:

En el ejemplo anterior, la columna rolling_sum tiene valores Nan, por lo que podemos usar esos datos para demostrar cómo lidiar con los datos que faltan.  

Los valores nulos aparecen como NaN en el marco de datos cuando un archivo CSV contiene valores nulos. Fillna() maneja y permite que el usuario reemplace los valores de NaN con sus propios valores, de forma similar a cómo la función pandas dropna() mantiene y elimina los valores nulos de un marco de datos. Rellenar los valores que faltan en el marco de datos de forma inversa se logra pasando backfill como el valor del argumento del método en fillna(). Fillna() llena los valores que faltan en el marco de datos en una dirección hacia adelante al pasar ffill como el valor del parámetro del método.

Python3

# importing pandas
import pandas as pd
from datetime import datetime
  
# reading csv file
data = pd.read_csv('covid_data.csv')
  
# converting string data to datetime
data['ObservationDate'] = pd.to_datetime(data['ObservationDate'])
data['Last Update'] = pd.to_datetime(data['Last Update'])
  
# setting index
data = data.set_index('ObservationDate')
  
data = data[['Last Update', 'Confirmed']]
data['rolling_sum'] = data.rolling(5).sum()
print(data.head())
  
# dealing with missing data
data['rolling_backfilled'] = data['rolling_sum'].fillna(method='backfill')
print(data.head(5))

Producción:

                        Last Update  Confirmed  rolling_sum
ObservationDate                                            
2020-01-22      2020-01-22 17:00:00        1.0          NaN
2020-01-22      2020-01-22 17:00:00       14.0          NaN
2020-01-22      2020-01-22 17:00:00        6.0          NaN
2020-01-22      2020-01-22 17:00:00        1.0          NaN
2020-01-22      2020-01-22 17:00:00        0.0         22.0
                        Last Update  Confirmed  rolling_sum  rolling_backfilled
ObservationDate                                                                
2020-01-22      2020-01-22 17:00:00        1.0          NaN                22.0
2020-01-22      2020-01-22 17:00:00       14.0          NaN                22.0
2020-01-22      2020-01-22 17:00:00        6.0          NaN                22.0
2020-01-22      2020-01-22 17:00:00        1.0          NaN                22.0
2020-01-22      2020-01-22 17:00:00        0.0         22.0                22.0

Fundamentos de Unix/tiempo de época:

Uno puede encontrar valores de tiempo en el tiempo de Unix mientras trabaja con datos de series de tiempo. La cantidad de segundos desde las 00:00:00 hora universal coordinada (UTC) del jueves 1 de enero de 1970 se conoce como tiempo Unix, a veces conocido como tiempo Epoch. El tiempo de Unix nos ayuda a descifrar las marcas de tiempo para que no nos confundamos con las zonas horarias, el horario de verano y otros factores. 

En el siguiente ejemplo, convertimos el tiempo de la época en una marca de tiempo usando el método pd.to_timestamp()  . Si queremos la hora en UTC de una zona horaria en particular, tz_localize() y tz. Se utilizan métodos convert() . En el siguiente ejemplo, lo convertimos a la zona horaria ‘Europa/Berlín’.

Python3

# importing pandas
import pandas as pd
from datetime import datetime
  
# epoch time
epoch = 1598776989
  
# converting to timestamp
timestamp = pd.to_datetime(epoch, unit='s')
print(timestamp)
  
# converting it to a particular time zone
print(timestamp.tz_localize('UTC').tz_convert('Europe/Berlin'))

Producción:

2020-08-30 08:43:09
2020-08-30 10:43:09+02:00

Publicación traducida automáticamente

Artículo escrito por isitapol2002 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *