Bonjour,
J’ai un datframe avec un index qui est de type datetime. Les dates sont daily mais il y a des dates manquantes.
Je cherche à créer une fonction qui en entrée cette datframe, une window et qui sort la moyenne exponentielle weekly de cette time serie.
La moyenne exponentielle weekly à la date d est définie comme suit: Je prends la date d et les window−1 dernier jours des semaines avant d et je prend la moyenne exponentielle de ça.
Prendre le dernier jour de chaque semaine dans ma time serie est un peu tricky, et au final j’ai obtenu la fonction suivante (j’ai essayé de commenter pour que tout soit assez clair). J’aimerais bien optimiser cette fonction mais je ne sais pas comment faire? J’ai l’impression de faire du "bidouillage", est ce que vous avez des idées pour rendre cette fonction plus optimale?
def weekly_exponential_moving_average(data: pd.DataFrame, window: int, column: Optional[str] = 'Close_Price') -> pd.Series:
"""
Calculate the weekly exponential moving average of a specified column in a pandas DataFrame.
Parameters:
data (pd.DataFrame): The input data as a pandas DataFrame. The DataFrame should have a datetime index.
window (int): The window for the exponential moving average, i.e., the number of weeks to include in each average.
column (Optional[str]): The column in the DataFrame to calculate the moving average for. Defaults to 'Close_Price'.
Returns:
pd.Series: A pandas Series containing the weekly exponential moving average values.
"""
if column not in data.columns:
raise ValueError(f"The specified column '{column}' does not exist in the input DataFrame.")
# Getting the last entry for each week
last_days = data.groupby([data.index.year, data.index.isocalendar().week]).apply(lambda x: x.index.max())
# Function to calculate the combined weekly data, including the current day's entry
def get_weekly_data_for_day(day):
relevant_dates = [day] + list(last_days[last_days < day][-window+1:])
return data.loc[relevant_dates, column]
# Calculate weekly EMA for each day
def compute_ema_for_day(day):
weekly_data = get_weekly_data_for_day(day)
return weekly_data.ewm(span=window, adjust=False).mean().iloc[-1]
weekly_ema = data.index.to_series().apply(compute_ema_for_day)
return weekly_ema
Merci beaucoup!