import pandas as pd def apply_adj_to_dod(data_df: pd.DataFrame): """ Add adjusted columns to each day-over-day column. The adjustment dependent on day of week. """ # replicated from DEV_ENGINEERING.TSTOWE.DAY_OF_WEEK_MODEL # WEEKDAY_NUM, WEEKDAY, PCT_CHANGE_VS_PREV # 0 Monday 9.7992323305187380 # 1 Tuesday 3.4008245639724453 # 2 Wednesday 0.6553378172314275 # 3 Thursday 2.3678775205019287 # 4 Friday 3.8720233434785910 # 5 Saturday -6.4442725833266910 # 6 Sunday -12.0355455758962520 dow_data = [ [0, 'Monday', 9.7992323305187380], [1, 'Tuesday', 3.4008245639724453], [2, 'Wednesday', 0.6553378172314275], [3, 'Thursday', 2.3678775205019287], [4, 'Friday', 3.8720233434785910], [5, 'Saturday', -6.4442725833266910], [6, 'Sunday', -12.0355455758962520], ] dow_df = pd.DataFrame(dow_data, columns=['weekday_num', 'weekday', 'pct_change_vs_prev']) data_df['weekday_num'] = data_df['report_date'].dt.dayofweek # 0=Mon, ..., 6=Sun data_df = data_df.merge(dow_df, on='weekday_num', how='left') # Add columns that adjust the DOD columns to index against the expected. for x in data_df.columns: if x[0:4] == 'dod_': adj_col = 'adj_' + x # Index vs expected (ratio; handle divide by zero) data_df[adj_col] = data_df[x] / data_df['pct_change_vs_prev'].replace(0, pd.NA) return data_df def add_is_any(df): try: del df['is_any'] except KeyError: pass iscols = [x for x in df.columns if x[0:3] == 'is_'] df['is_any'] = 0 for col in iscols: df['is_any'][df[col] == 1] = 1 return df def combine_data_sources(data_df: pd.DataFrame, days_trending_df: pd.DataFrame, report_date: str): ironed_out_df_mini = days_trending_df[days_trending_df['report_date'] == pd.to_datetime(report_date)] ironed_out_df_mini = ironed_out_df_mini[['pfn_geo', 'combined_forecast', 'consecutive_trend', 'vs_forecast_lift']] combined_df = data_df.merge(ironed_out_df_mini, how='left', on=['pfn_geo']) # ensure dataframe is ready for predictions. combined_df = combined_df.fillna(0.0) return combined_df