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:
- poner
Date
en el índice 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.