@@ -625,21 +625,7 @@ def skew(
625625 # counts, moment3 for each column
626626 aggregations = []
627627 for col in original_columns :
628- delta3_expr = _mean_delta_to_power (3 , col )
629- count_agg = agg_expressions .UnaryAggregation (
630- agg_ops .count_op ,
631- ex .deref (col ),
632- )
633- moment3_agg = agg_expressions .UnaryAggregation (
634- agg_ops .mean_op ,
635- delta3_expr ,
636- )
637- variance_agg = agg_expressions .UnaryAggregation (
638- agg_ops .PopVarOp (),
639- ex .deref (col ),
640- )
641- skew_expr = _skew_from_moments_and_count (count_agg , moment3_agg , variance_agg )
642- aggregations .append (skew_expr )
628+ aggregations .append (skew_expr (ex .deref (col )))
643629
644630 block = block .aggregate (
645631 aggregations , grouping_column_ids , column_labels = column_labels
@@ -663,16 +649,7 @@ def kurt(
663649 # counts, moment4 for each column
664650 kurt_exprs = []
665651 for col in original_columns :
666- delta_4_expr = _mean_delta_to_power (4 , col )
667- count_agg = agg_expressions .UnaryAggregation (agg_ops .count_op , ex .deref (col ))
668- moment4_agg = agg_expressions .UnaryAggregation (agg_ops .mean_op , delta_4_expr )
669- variance_agg = agg_expressions .UnaryAggregation (
670- agg_ops .PopVarOp (), ex .deref (col )
671- )
672-
673- # Corresponds to order of aggregations in preceding loop
674- kurt_expr = _kurt_from_moments_and_count (count_agg , moment4_agg , variance_agg )
675- kurt_exprs .append (kurt_expr )
652+ kurt_exprs .append (kurt_expr (ex .deref (col )))
676653
677654 block = block .aggregate (
678655 kurt_exprs , grouping_column_ids , column_labels = column_labels
@@ -686,13 +663,38 @@ def kurt(
686663 return block
687664
688665
666+ def skew_expr (expr : ex .Expression ) -> ex .Expression :
667+ delta3_expr = _mean_delta_to_power (3 , expr )
668+ count_agg = agg_expressions .UnaryAggregation (
669+ agg_ops .count_op ,
670+ expr ,
671+ )
672+ moment3_agg = agg_expressions .UnaryAggregation (
673+ agg_ops .mean_op ,
674+ delta3_expr ,
675+ )
676+ variance_agg = agg_expressions .UnaryAggregation (
677+ agg_ops .PopVarOp (),
678+ expr ,
679+ )
680+ return _skew_from_moments_and_count (count_agg , moment3_agg , variance_agg )
681+
682+
683+ def kurt_expr (expr : ex .Expression ) -> ex .Expression :
684+ delta_4_expr = _mean_delta_to_power (4 , expr )
685+ count_agg = agg_expressions .UnaryAggregation (agg_ops .count_op , expr )
686+ moment4_agg = agg_expressions .UnaryAggregation (agg_ops .mean_op , delta_4_expr )
687+ variance_agg = agg_expressions .UnaryAggregation (agg_ops .PopVarOp (), expr )
688+ return _kurt_from_moments_and_count (count_agg , moment4_agg , variance_agg )
689+
690+
689691def _mean_delta_to_power (
690692 n_power : int ,
691- val_id : str ,
693+ col_expr : ex . Expression ,
692694) -> ex .Expression :
693695 """Calculate (x-mean(x))^n. Useful for calculating moment statistics such as skew and kurtosis."""
694- mean_expr = agg_expressions .UnaryAggregation (agg_ops .mean_op , ex . deref ( val_id ) )
695- delta = ops .sub_op .as_expr (val_id , mean_expr )
696+ mean_expr = agg_expressions .UnaryAggregation (agg_ops .mean_op , col_expr )
697+ delta = ops .sub_op .as_expr (col_expr , mean_expr )
696698 return ops .pow_op .as_expr (delta , ex .const (n_power ))
697699
698700
0 commit comments