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