Saltar al contenido

convertir datos de existencias diarias a semanales a través de pandas en Python

Ten en cuenta que en la informática un error casi siempre tiene más de una resoluciones, por lo tanto aquí te mostramos lo más óptimo y eficiente.

Solución:

Puedes resample (a semanal), offset (cambio), y apply reglas de agregación de la siguiente manera:

logic = 'Open'  : 'first',
         'High'  : 'max',
         'Low'   : 'min',
         'Close' : 'last',
         'Volume': 'sum'

offset = pd.offsets.timedelta(days=-6)

f = pd.read_clipboard(parse_dates=['Date'], index_col=['Date'])
f.resample('W', loffset=offset).apply(logic)

Llegar:

                 Open       High        Low      Close   Volume
Date                                                           
2010-01-04  38.660000  40.700001  38.509998  40.290001  5925600
2010-01-11  40.209999  40.970001  39.279999  40.450001  6234600

En general, suponiendo que tiene el marco de datos en la forma que especificó, debe realizar los siguientes pasos:

  1. poner Date en el índice
  2. resample El índice.

Lo que tienes es un caso de aplicar diferentes funciones a diferentes columnas. Ver.

Puede volver a muestrear de varias maneras. por ejemplo, puede tomar la media de los valores o contar, etc. verifique el remuestreo de pandas.

También puede aplicar agregadores personalizados (consulte el mismo enlace). Con eso en mente, el fragmento de código para su caso se puede dar como:

f['Date'] = pd.to_datetime(f['Date'])
f.set_index('Date', inplace=True)
f.sort_index(inplace=True)

def take_first(array_like):
    return array_like[0]

def take_last(array_like):
    return array_like[-1]

output = f.resample('W',                                 # Weekly resample
                    how='Open': take_first, 
                         'High': 'max',
                         'Low': 'min',
                         'Close': take_last,
                         'Volume': 'sum', 
                    loffset=pd.offsets.timedelta(days=-6))  # to put the labels to Monday

output = output[['Open', 'High', 'Low', 'Close', 'Volume']]

Aquí, W significa un remuestreo semanal que por defecto se extiende de lunes a domingo. Para mantener las etiquetas como lunes, loffset se usa Hay varios especificadores de días predefinidos. Eche un vistazo a las compensaciones de pandas. Incluso puede definir compensaciones personalizadas (ver).

Volviendo al método de remuestreo. Aquí por Open y Close puede especificar métodos personalizados para tomar el primer valor y pasar el identificador de función al how argumento.

Esta respuesta se basa en la suposición de que los datos parecen ser diarios, es decir, para cada día solo tiene 1 entrada. Además, no hay datos presentes para los días no hábiles. es decir, sábado y domingo. Entonces, tomar el último punto de datos de la semana como el del viernes está bien. Si lo desea, puede utilizar la semana laboral en lugar de ‘W’. Además, para datos más complejos, es posible que desee utilizar groupby para agrupar los datos semanales y luego trabajar sobre los índices de tiempo dentro de ellos.

por cierto, se puede encontrar una idea general de la solución en: https://gist.github.com/prithwi/339f87bf9c3c37bb3188

Tenía exactamente la misma pregunta y encontré una gran solución aquí.

https://www.techtrekking.com/how-to-convert-daily-time-series-data-into-weekly-and-monthly-using-pandas-and-python/

El código semanal se publica a continuación.

import pandas as pd
import numpy as np

print('*** Program Started ***')

df = pd.read_csv('15-06-2016-TO-14-06-2018HDFCBANKALLN.csv')

# ensuring only equity series is considered
df = df.loc[df['Series'] == 'EQ']

# Converting date to pandas datetime format
df['Date'] = pd.to_datetime(df['Date'])
# Getting week number
df['Week_Number'] = df['Date'].dt.week
# Getting year. Weeknum is common across years to we need to create unique index by using year and weeknum
df['Year'] = df['Date'].dt.year

# Grouping based on required values
df2 = df.groupby(['Year','Week_Number']).agg('Open Price':'first', 'High Price':'max', 'Low Price':'min', 'Close Price':'last','Total Traded Quantity':'sum')
# df3 = df.groupby(['Year','Week_Number']).agg('Open Price':'first', 'High Price':'max', 'Low Price':'min', 'Close Price':'last','Total Traded Quantity':'sum','Average Price':'avg')
df2.to_csv('Weekly_OHLC.csv')
print('*** Program ended ***')

Te mostramos las comentarios y valoraciones de los lectores

Tienes la opción de añadir valor a nuestra información contribuyendo tu veteranía en las interpretaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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