Skip to content

Commit

Permalink
Update the filter format in metrics config
Browse files Browse the repository at this point in the history
  • Loading branch information
dyang415 committed Oct 3, 2023
1 parent 10d73f5 commit ecfea94
Show file tree
Hide file tree
Showing 13 changed files with 163 additions and 306 deletions.
26 changes: 9 additions & 17 deletions backend/app/insight/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ def parse_data(data):
baseline_start, baseline_end, comparison_start, comparison_end, date_column, date_column_type = InsightApi.parse_date_info(data)
group_by_columns = data['groupByColumns']
filters = InsightApi.parse_filters(data)
num_max_dimensions = data['maxNumDimensions']
num_max_dimensions = data['maxNumDimensions'] if 'maxNumDimensions' in data else 3

return (
baseline_start, baseline_end, comparison_start, comparison_end, date_column, date_column_type, group_by_columns, filters, num_max_dimensions
Expand All @@ -62,14 +62,9 @@ def parse_metrics(metric_column):
if metric_column['aggregationOption'] == 'ratio':
ratioMetric = metric_column['ratioMetric']

numerator_filter = {
ratioMetric['numerator']['filter']['column']: [
ratioMetric['numerator']['filter']['value']]
} if 'filter' in ratioMetric['numerator'] else {}
denominator_filter = {
ratioMetric['denominator']['filter']['column']: [
ratioMetric['denominator']['filter']['value']]
} if 'filter' in ratioMetric['denominator'] else {}
numerator_filters = InsightApi.parse_filters(ratioMetric['numerator']) if 'filters' in ratioMetric['numerator'] else {}
denominator_filters = InsightApi.parse_filters(ratioMetric['denominator']) if 'filters' in ratioMetric['denominator'] else {}

numerator_agg_method = agg_method_map[ratioMetric['numerator']
['aggregationMethod']]
denominator_agg_method = agg_method_map[ratioMetric['denominator']
Expand All @@ -79,13 +74,13 @@ def parse_metrics(metric_column):
None,
ratioMetric['numerator']['columnName'],
numerator_agg_method,
numerator_filter
numerator_filters
)
denominator_metric = SingleColumnMetric(
None,
ratioMetric['denominator']['columnName'],
denominator_agg_method,
denominator_filter
denominator_filters
)

metric = DualColumnMetric(
Expand All @@ -94,15 +89,11 @@ def parse_metrics(metric_column):
numerator_metric=numerator_metric,
denominator_metric=denominator_metric)
else:
singular_filter = {
metric_column['singularMetric']['filter']['column']: [
metric_column['singularMetric']['filter']['value']]
} if 'filter' in metric_column['singularMetric'] else {}
metric = SingleColumnMetric(
None,
metric_column['singularMetric']['columnName'],
agg_method_map[metric_column['aggregationOption']],
singular_filter
[]
)
return metric

Expand Down Expand Up @@ -133,7 +124,8 @@ def get_bq_insight(self):
def get_segment_insight(self):
data = request.get_json()
file_id = data['fileId']
(baselineStart, baselineEnd, comparisonStart, comparisonEnd, date_column, date_column_type, group_by_columns, filters) = self.parse_data(data)
(baselineStart, baselineEnd, comparisonStart, comparisonEnd, date_column, date_column_type, group_by_columns, filters,
max_num_dimensions) = self.parse_data(data)

metric = self.parse_metrics(data['metricColumn'])
segment_key = data['segmentKey']
Expand Down
3 changes: 2 additions & 1 deletion backend/app/insight/services/insight_builders.py
Original file line number Diff line number Diff line change
Expand Up @@ -378,7 +378,8 @@ def map_to_segment_info(row):
row['change'],
row['change_variance'],
row['absolute_contribution'],
float(p_value)
float(p_value),
row['sort']
)

return slice_info.serializedKey, slice_info
Expand Down
39 changes: 19 additions & 20 deletions backend/app/insight/services/metrics.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,20 @@
pl.Config.set_tbl_cols(30)


class FilterOperator(StrEnum):
EQ = "eq"
NEQ = "neq"
EMPTY = "empty"
NON_EMPTY = "non_empty"


@dataclass
class Filter:
column: str
operator: FilterOperator
values: Optional[list[str | float | bool | date]] = None


@dataclass
class Dimension:
name: str
Expand Down Expand Up @@ -52,6 +66,7 @@ class SegmentInfo:
changeDev: Optional[float] = None
absoluteContribution: Optional[float] = None
confidence: Optional[float] = None
sortValue: Optional[float] = None


@dataclass
Expand Down Expand Up @@ -106,7 +121,7 @@ class SingleColumnMetric(Metric):
name: Optional[str]
column: str
aggregate_method: AggregateMethod
filters: dict[str, any]
filters: list[Filter]

def get_id(self):
if self.name is not None:
Expand All @@ -129,13 +144,11 @@ def get_display_name(self):
return f"{self.aggregate_method.name} {self.column}"

def get_aggregation_exprs(self, agg_override: Optional[AggregateMethod] = None) -> Iterable[Expr]:
from app.insight.services.utils import get_filter_expression

col = pl.col(self.column)
if len(self.filters) > 0:
filtering_expr = pl.lit(True)
for column, values in self.filters.items():
filtering_expr = filtering_expr & (
pl.col(column).is_in(pl.lit(values)))
col = pl.col(self.column).filter(filtering_expr)
col = pl.col(self.column).filter(get_filter_expression(self.filters))
return [build_polars_agg(col, agg_override if agg_override is not None else self.aggregate_method).alias(self.get_id())]

def get_metric_type(self):
Expand Down Expand Up @@ -214,20 +227,6 @@ class MetricInsight:
parallel_analysis_executor = ThreadPoolExecutor()


class FilterOperator(StrEnum):
EQ = "eq"
NEQ = "neq"
EMPTY = "empty"
NON_EMPTY = "non_empty"


@dataclass
class Filter:
column: str
operator: FilterOperator
values: Optional[list[str | float | bool | date]] = None


def build_polars_agg(name: str | Expr, method: AggregateMethod):
col = name
if name is str:
Expand Down
1 change: 1 addition & 0 deletions backend/app/insight/services/segment_insight_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,5 +111,6 @@ def map_to_segment_info(row, baseline_count: int, comparison_count: int, metric:
change,
None,
None,
None,
None
)
1 change: 1 addition & 0 deletions frontend/src/common/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ export interface DimensionSliceInfo {
changePercentage: number;
changeDev: number;
confidence: number;
sortValue: number;
}

export type FilterOperator = "eq" | "neq" | "empty" | "non_empty";
Expand Down
4 changes: 1 addition & 3 deletions frontend/src/components/main-dashboard/MainDashboard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -434,9 +434,7 @@ export default function MainDashboard() {
<Card className="text-center flex flex-col gap-y-4">
<Flex justifyContent="center" className="gap-2">
<Title>Dimensions</Title>
<Text>
{Object.keys(analyzingMetrics.dimensions).length} in total
</Text>
<Text>{Object.keys(groupByColumns).length} in total</Text>
</Flex>
<Flex
className="h-[100%]"
Expand Down
79 changes: 0 additions & 79 deletions frontend/src/components/uploader/SelectorWithFilter.tsx

This file was deleted.

16 changes: 0 additions & 16 deletions frontend/src/components/uploader/SingleSelector.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,8 @@ type SingleSelectorProps = {
icons?: React.ElementType[];
selectedValue: string;
onValueChange: (value: string) => void;
onFilterChange?: (value: boolean) => void;
instruction?: ReactElement;
disabled?: boolean;
filterCheckbox?: boolean;
placeholder?: string;
className?: string;
};
Expand All @@ -23,10 +21,8 @@ function SingleSelector({
icons,
selectedValue,
onValueChange,
onFilterChange,
instruction,
disabled,
filterCheckbox: hasFilter,
placeholder,
className,
}: SingleSelectorProps) {
Expand Down Expand Up @@ -68,18 +64,6 @@ function SingleSelector({
</Col>
<Col className="items-center flex" numColSpan={3}>
{selectMenu}
{hasFilter && (
<Col className="flex" numColSpan={1}>
<label className="ml-2">Has filter</label>
<input
type="checkbox"
className="ml-2"
onChange={(e) => {
onFilterChange && onFilterChange(e.target.checked);
}}
/>
</Col>
)}
</Col>
<Col className="items-center col-start-3 pt-2 pl-2" numColSpan={3}>
{instruction}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,13 @@ const doorDashPrefills: PrefillConfig = {
numerator: {
aggregationMethod: "nunique",
columnName: "order_id",
filter: {
column: "order_status",
value: "canceled",
},
filters: [
{
column: "order_status",
operator: "eq",
values: ["canceled"],
},
],
},
denominator: {
aggregationMethod: "nunique",
Expand Down
Loading

0 comments on commit ecfea94

Please sign in to comment.