'Construct a Factor that Z-Scores each day\'s results.
The Z-Score of a row is defined as::
(row - row.mean()) / row.stddev()
If ``mask`` is supplied, ignore values where ``mask`` returns False
when computing row means and standard deviations, and output NaN
anywhere the mask is False.
If ``groupby`` is supplied, compute by partitioning each row based on
the values produced by ``groupby``, z-scoring the partitioned arrays,
and stitching the sub-results back together.
Parameters
mask : zipline.pipeline.Filter, optional
A Filter defining values to ignore when Z-Scoring.
groupby : zipline.pipeline.Classifier, optional
A classifier defining partitions over which to compute Z-Scores.
Returns
zscored : zipline.pipeline.Factor
A Factor producing that z-scores the output of self.
Notes
Mean and standard deviation are sensitive to the magnitudes of
outliers. When working with factor that can potentially produce large
outliers, it is often useful to use the ``mask`` parameter to discard
values at the extremes of the distribution::
>>> base = MyFactor(...)  # doctest: +SKIP
>>> normalized = base.zscore(
...    mask=base.percentile_between(1, 99),
... )  # doctest: +SKIP
``zscore()`` is only supported on Factors of dtype float64.
Examples
See :meth:`~zipline.pipeline.factors.Factor.demean` for an in-depth
example of the semantics for ``mask`` and ``groupby``.
See Also
:meth:`pandas.DataFrame.groupby`'

@expect_types(mask=(Filter, NotSpecifiedType), groupby=(Classifier, NotSpecifiedType))
@float64_only
def zscore(self, mask=NotSpecified, groupby=NotSpecified):

    return GroupedRowTransform(transform=zscore, transform_args=(), factor=self, groupby=groupby, dtype=self.dtype, missing_value=self.missing_value, mask=mask, window_safe=True)
