quantlab.utils.cross_section.cross_sectional_zscore#

quantlab.utils.cross_section.cross_sectional_zscore(values)[source]#

Z-score [..., T, S] values over the last axis, NaN on a degenerate bar.

A bar is degenerate when it holds fewer than two finite values or all its finite values are equal (zero standard deviation). Non-finite inputs stay NaN. No RuntimeWarning is raised on empty or degenerate bars.

Examples

>>> cross_sectional_zscore(np.array([[1.0, 2.0, 3.0], [5.0, 5.0, np.nan]]))
array([[-1.,  0.,  1.],
       [nan, nan, nan]])