Skip to content

Commit 1f58f9c

Browse files
yeonjaeparkThe Meridian Authors
authored andcommitted
Fix summarizer to include non-paid channels in contribution insights.
PiperOrigin-RevId: 840476698
1 parent eaf6246 commit 1f58f9c

File tree

3 files changed

+16
-9
lines changed

3 files changed

+16
-9
lines changed

meridian/analysis/summarizer.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ def _create_outcome_contrib_card_html(
318318
chart_json=media_summary.plot_contribution_waterfall_chart().to_json(),
319319
)
320320
lead_channels = self._get_sorted_posterior_mean_metrics_df(
321-
media_summary, [c.INCREMENTAL_OUTCOME]
321+
media_summary, [c.INCREMENTAL_OUTCOME], include_non_paid_channels=True
322322
)[c.CHANNEL][:2]
323323
formatted_channels = [channel.title() for channel in lead_channels]
324324

@@ -358,9 +358,14 @@ def _get_sorted_posterior_mean_metrics_df(
358358
media_summary: visualizer.MediaSummary,
359359
metrics: Sequence[str],
360360
ascending: bool = False,
361+
include_non_paid_channels: bool = False,
361362
) -> pd.DataFrame:
363+
if include_non_paid_channels:
364+
summary_metrics = media_summary.get_all_summary_metrics()
365+
else:
366+
summary_metrics = media_summary.get_paid_summary_metrics()
362367
return (
363-
media_summary.get_paid_summary_metrics()[metrics]
368+
summary_metrics[metrics]
364369
.sel(distribution=c.POSTERIOR, metric=c.MEAN)
365370
.drop_sel(channel=c.ALL_CHANNELS)
366371
.to_dataframe()

meridian/analysis/summarizer_test.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,10 @@ def _stub_for_insights(self):
162162
self.media_summary.get_paid_summary_metrics = mock.MagicMock(
163163
return_value=self.media_metrics
164164
)
165+
self.all_metrics = test_utils.generate_all_summary_metrics()
166+
self.media_summary.get_all_summary_metrics = mock.MagicMock(
167+
return_value=self.all_metrics
168+
)
165169

166170
frequency_data = test_utils.generate_optimal_frequency_data(
167171
channel_prefix='rf_ch', num_channels=2
@@ -974,12 +978,12 @@ def test_channel_contrib_card_plotters_called(self):
974978
)
975979

976980
def test_channel_contrib_card_insights(self):
977-
self.media_metrics[c.INCREMENTAL_OUTCOME].loc[{
981+
self.all_metrics[c.INCREMENTAL_OUTCOME].loc[{
978982
c.CHANNEL: 'rf_ch_1',
979983
c.DISTRIBUTION: c.POSTERIOR,
980984
c.METRIC: c.MEAN,
981985
}] = 999999 # largest outcome
982-
self.media_metrics[c.INCREMENTAL_OUTCOME].loc[{
986+
self.all_metrics[c.INCREMENTAL_OUTCOME].loc[{
983987
c.CHANNEL: 'ch_0',
984988
c.DISTRIBUTION: c.POSTERIOR,
985989
c.METRIC: c.MEAN,

meridian/analysis/visualizer.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1450,17 +1450,15 @@ def get_paid_summary_metrics(
14501450
14511451
Args:
14521452
aggregate_times: If `True`, aggregates the metrics across all time
1453-
periods. If `False`, returns time-varying metrics.
1453+
periods. If `False`, returns time-varying metrics.
14541454
14551455
Returns:
14561456
An `xarray.Dataset` containing the following:
14571457
- **Coordinates:** `channel`, `metric` (`mean`, `median`, `ci_lo`,
1458-
`ci_hi`),
1459-
`distribution` (`prior`, `posterior`)
1458+
`ci_hi`), `distribution` (`prior`, `posterior`)
14601459
- **Data variables:** `impressions`, `pct_of_impressions`, `spend`,
14611460
`pct_of_spend`, `CPM`, `incremental_outcome`, `pct_of_contribution`,
1462-
`roi`,
1463-
`effectiveness`, `mroi`.
1461+
`roi`, `effectiveness`, `mroi`.
14641462
"""
14651463
return self._analyzer.summary_metrics(
14661464
selected_times=self._selected_times,

0 commit comments

Comments
 (0)