'weekdays': [], 'aggregate_period': False } query_dict = build_query_dict(render_heat_map_dict) if query_dict['date'] == 'loop_through_period': # if we have the flag loop_through_period in the query dict, it means the period # set for the query is multiple dates, therefore we want the query to return an # average on a time interval, and not on a single date period = render_heat_map_dict['period'] daterange = pd.date_range(period[0], period[1]) query_dict['date'] = period query = prepare_sql_query(query_dict) query_results = Utils.make_sql_query(query, database) for single_map, base_map, projection in base_maps: # we process the query results outgoing_flow, incoming_flow = process_query_results( query_results, base_map) print('Rendering {}...'.format(single_map)) if single_map == 'total': if time_granularity == 'weekdays_vs_weekends': file_name = ['NYC', '2018_diff_WD_WE'] else: file_name = ['NYC', '2018'] else: if time_granularity == 'weekdays_vs_weekends': file_name = ['{}'.format(single_map), '2018_diff_WD_WE'] else:
def process_query_arg(render_animation_dict): period = render_animation_dict['period'] query_dict = render_animation_dict['query_dict'] database = render_animation_dict['database'] specific_weekdays = query_dict['specific_weekdays'] date = query_dict['date'] aggregate_period = render_animation_dict['aggregate_period'] weekdays = render_animation_dict['weekdays'] query_results_dict = {} if aggregate_period is False and query_dict['date'] == 'loop_through_period': # in this case we want the result for each day of the period provided # if we have the flag loop_through_period in the query dict, it means the period # set for the query is multiple dates daterange = pd.date_range(period[0], period[1]) # we run queries for each date in the daterange specified for single_date in daterange: date = pd.to_datetime(single_date) if specific_weekdays == 'on_specific_weekdays': # we check if the date of the daterange matches the weekday(s) we target if date.dayofweek in weekdays: single_date = date.date().strftime('%Y-%m-%d') query_dict['date'] = single_date query = prepare_sql_query(query_dict) query_results = Utils.make_sql_query(query, database) query_results_dict[query_dict['date']] = query_results else: # if a date in the range is not among the weekdays we want, we skip it continue else: single_date = date.date().strftime('%Y-%m-%d') query_dict['date'] = single_date query = prepare_sql_query(query_dict) query_results = Utils.make_sql_query(query, database) query_results_dict[query_dict['date']] = query_results elif aggregate_period is True and query_dict['date'] == 'loop_through_period': # in this case, we want to aggregate the results (sum) per week daterange = pd.date_range(period[0], period[1]) start_date = pd.to_datetime(period[0]) end_date = pd.to_datetime(period[1]) # let's build a list of all intervals we will want to aggregate the data for all_aggr_init = [] start = start_date end = end_date # we add one list of dates per week to the list of all intervals i = 0 for date in daterange: # we handle separately the first date of the period if i == 0: curr_week = [start.date().strftime('%Y-%m-%d')] if date != start_date and date != end_date: start_week_number = start.isocalendar()[1] date_week_number = date.isocalendar()[1] if date_week_number == start_week_number: curr_week.append(date.date().strftime('%Y-%m-%d')) i += 1 else: start = date all_aggr_init.append(curr_week) i = 0 # we handle separately the last date of the period if curr_week not in all_aggr_init: curr_week.append(end_date.date().strftime('%Y-%m-%d')) all_aggr_init.append(curr_week) else: curr_week = [end_date.date().strftime('%Y-%m-%d')] all_aggr_init.append(curr_week) # now we keep only the first and last item of each interval all_aggr = [] for interval in all_aggr_init: interval_new = [interval[0], interval[-1]] all_aggr.append(interval_new) # we now query for each interval for interval in all_aggr: query_dict['date'] = interval query = prepare_sql_query(query_dict) query_results = Utils.make_sql_query(query, database) query_results_dict[query_dict['date'][0]] = query_results else: # we have a single date to render for, so nothing to aggregate! # just in case we check that there is no mismatch between the single day and the # argument containing specific weekdays restrictions if any if specific_weekdays == 'on_specific_weekdays': # we check if the date of the daterange matches the weekday(s) we target date = pd.to_datetime(query_dict['date']) if date.dayofweek in weekdays: query = prepare_sql_query(query_dict) query_results = Utils.make_sql_query(query, database) query_results_dict[query_dict['date']] = query_results else: print("The date selected does not match the weekday(s) indicated. Please select either an interval ('time_granularity': 'period') or a valid weekday(s) list.") else: query = prepare_sql_query(query_dict) query_results = Utils.make_sql_query(query, database) query_results_dict[query_dict['date']] = query_results return query_results_dict