Source code for etl_toolkit.analyses.standard_metrics.ui_metadata

from pyspark.sql import SparkSession
from pyspark.sql import functions as F, DataFrame, Row

from yipit_databricks_utils.helpers.telemetry import track_usage
from yipit_databricks_utils.helpers.pyspark_utils import get_spark_session

from etl_toolkit.analyses.standard_metrics.config import (
    entity_configuration,
    standard_metric_metadata,
    standard_metric_configuration,
    standard_metric_dashboard_configuration,
)


@track_usage
[docs] def standard_metric_ui_metadata( entity_configuration: entity_configuration, standard_metric_metadata: standard_metric_metadata, standard_metric_configuration: standard_metric_configuration, standard_metric_dashboard_configuration: standard_metric_dashboard_configuration, spark: SparkSession = None, ) -> DataFrame: """ Generates a dataframe containing the UI metadata necessary for a standard metric's dashboard configuration. :param entity_configuration: A.entity_configuration for configuring entity details :param standard_metric_metadata: A.standard_metric_metadata for configuring metric metadata :param standard_metric_configuration: A.standard_metric_configuration for configuring metric calculations :param standard_metric_dashboard_configuration: A.standard_metric_dashboard_configuration for configurating the dashboard :param spark: Optional SparkSession (will create one if not provided) :return: DataFrame containing UI metadata for the standard metric dashboard Examples ^^^^^^^^ .. code-block:: python :caption: Generating UI metadata dataframe for a metric from etl_toolkit import A entity_configuration = A.entity_configuration( top_level_entity_name="Affirm", top_level_entity_ticker="AFRM:XNAS" ) standard_metric_metadata = A.standard_metric_metadata( metric_name="Gross Merchandise Volume", company_comparable_kpi=True, display_period_granularity="DAY", report_period_granularity="QUARTER", currency="USD", value_divisor=1000000, visible_alpha_id=14081329, ) standard_metric_configuration = A.standard_metric_configuration( source_input_column="gmv", source_input_date_column="date", aggregate_function="SUM", growth_rate_type="CAGR", max_relevant_years=4, calendar_type="EXACT_N_YEARS", slice_columns=["merchant"], trailing_period_length=7, trailing_period_aggregate_function="AVG", ) standard_metric_dashboard_configuration = A.standard_metric_dashboard_configuration( page_title="Gross Merchandise Volume", page_assignment="page_1_1", metric_short_name="GMV", data_lag="T-3", publishing_schedule="Weekly (Thu)", ) df = A.standard_metric_ui_metadata( entity_configuration, standard_metric_metadata, standard_metric_configuration, standard_metric_dashboard_configuration ) display(df) +-------------------------------+-------------------------+------------------------+----------------------+-------------------------+----------------+---+ |label_name |label |top_level_entity_ticker |top_level_entity_name |metric_name |page_assignment |...| +-------------------------------+-------------------------+------------------------+----------------------+-------------------------+----------------+---+ |label_page_title |Gross Merchandise Volume |AFRM:XNAS |Affirm |Gross Merchandise Volume |page_1_1 |...| +-------------------------------+-------------------------+------------------------+----------------------+-------------------------+----------------+---+ |label_methodology_note | |AFRM:XNAS |Affirm |Gross Merchandise Volume |page_1_1 |...| +-------------------------------+-------------------------+------------------------+----------------------+-------------------------+----------------+---+ |label_txd_key_metrics_pt |T7D |AFRM:XNAS |Affirm |Gross Merchandise Volume |page_1_1 |...| +-------------------------------+-------------------------+------------------------+----------------------+-------------------------+----------------+---+ |label_growth_comp_y_axis |GMV T7D |AFRM:XNAS |Affirm |Gross Merchandise Volume |page_1_1 |...| +-------------------------------+-------------------------+------------------------+----------------------+-------------------------+----------------+---+ |label_txd_yy |T7D Y/Y |AFRM:XNAS |Affirm |Gross Merchandise Volume |page_1_1 |...| +-------------------------------+-------------------------+------------------------+----------------------+-------------------------+----------------+---+ |label_data_download_daily_data |GMV Daily Data |AFRM:XNAS |Affirm |Gross Merchandise Volume |page_1_1 |...| +-------------------------------+-------------------------+------------------------+----------------------+-------------------------+----------------+---+ |label_daily_comp_y_axis |GMV (USDmm) |AFRM:XNAS |Affirm |Gross Merchandise Volume |page_1_1 |...| +-------------------------------+-------------------------+------------------------+----------------------+-------------------------+----------------+---+ |label_roq_p_growth |RoQ % Growth CAGR |AFRM:XNAS |Affirm |Gross Merchandise Volume |page_1_1 |...| +-------------------------------+-------------------------+------------------------+----------------------+-------------------------+----------------+---+ |label_unit |USD |AFRM:XNAS |Affirm |Gross Merchandise Volume |page_1_1 |...| +-------------------------------+-------------------------+------------------------+----------------------+-------------------------+----------------+---+ |label_unit_suffix |mm |AFRM:XNAS |Affirm |Gross Merchandise Volume |page_1_1 |...| +-------------------------------+-------------------------+------------------------+----------------------+-------------------------+----------------+---+ |label_publishing_date |Publishes Weekly (Thu) |AFRM:XNAS |Affirm |Gross Merchandise Volume |page_1_1 |...| +-------------------------------+-------------------------+------------------------+----------------------+-------------------------+----------------+---+ |label_unit_and_suffix |(USDmm) |AFRM:XNAS |Affirm |Gross Merchandise Volume |page_1_1 |...| +-------------------------------+-------------------------+------------------------+----------------------+-------------------------+----------------+---+ |metric_va_id |14081329 |AFRM:XNAS |Affirm |Gross Merchandise Volume |page_1_1 |...| +-------------------------------+-------------------------+------------------------+----------------------+-------------------------+----------------+---+ """ currency_unit = standard_metric_metadata.currency or "" metric_name = standard_metric_metadata.metric_name or "" metric_short_name = standard_metric_dashboard_configuration.metric_short_name or "" value_divisor = standard_metric_metadata.value_divisor metric_trailing_period = standard_metric_configuration.trailing_period_length or "" metric_growth_rate_type = standard_metric_configuration.growth_rate_type or "" if value_divisor == 1000000: currency_unit_suffix = "mm" elif value_divisor == 1000: currency_unit_suffix = "k" else: currency_unit_suffix = "" if currency_unit == "" and currency_unit_suffix == "": complete_currency_unit = "" else: complete_currency_unit = f"({currency_unit}{currency_unit_suffix})" if complete_currency_unit != "" and metric_short_name != "": daily_comp_y_axis = f"{metric_short_name} {complete_currency_unit}" else: daily_comp_y_axis = f"{metric_short_name}{complete_currency_unit}" publishing_schedule = standard_metric_dashboard_configuration.publishing_schedule if publishing_schedule: label_publishing_date = f"Publishes {publishing_schedule}" else: label_publishing_date = "" ui_metadata_rows = [ Row( label_name="label_page_title", label=str(standard_metric_dashboard_configuration.page_title or ""), ), Row( label_name="label_methodology_note", label=str(standard_metric_dashboard_configuration.methodology_note or ""), ), Row( label_name="label_txd_key_metrics_pt", label=str(f"T{metric_trailing_period}D"), ), Row( label_name="label_growth_comp_y_axis", label=str(f"{metric_short_name} T{metric_trailing_period}D"), ), Row(label_name="label_txd_yy", label=str(f"T{metric_trailing_period}D Y/Y")), Row( label_name="label_data_download_daily_data", label=str(f"{metric_short_name} Daily Data"), ), Row(label_name="label_daily_comp_y_axis", label=str(daily_comp_y_axis)), Row( label_name="label_roq_p_growth", label=str(f"RoQ % Growth {metric_growth_rate_type}"), ), Row(label_name="label_unit", label=str(currency_unit)), Row(label_name="label_unit_suffix", label=str(currency_unit_suffix)), Row(label_name="label_publishing_date", label=str(label_publishing_date)), Row(label_name="label_unit_and_suffix", label=str(complete_currency_unit)), Row( label_name="metric_va_id", label=str(standard_metric_metadata.visible_alpha_id or ""), ), ] spark = spark or get_spark_session() ui_metadata_df = spark.createDataFrame(ui_metadata_rows).withColumns( { "top_level_entity_ticker": F.concat_ws( ":", F.lit(entity_configuration.top_level_entity_ticker), F.lit(entity_configuration.exchange), ), "top_level_entity_name": F.lit(entity_configuration.top_level_entity_name), "metric_name": F.lit(standard_metric_metadata.metric_name), "page_assignment": F.lit( standard_metric_dashboard_configuration.page_assignment ), "publication_timestamp": F.current_timestamp(), "internal_metric_id": F.lit(None).cast("int"), } ) return ui_metadata_df