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