/// <summary>
        ///
        /// </summary>
        /// <param name="dataPoints"></param>
        /// <returns></returns>
        public static IEnumerable <byte> Compress(IEnumerable <DataPoint <dynamic> > dataPoints)
        {
            if (dataPoints.Select(_ => _.TimeSeries).Distinct().Count() > 1)
            {
                throw new Exception("Unable to compress data points: All data points must come from the same time series.");
            }

            var timeSeries         = ByteString.CopyFrom(dataPoints.First().TimeSeries.Value.ToByteArray());
            var firstTimestamp     = dataPoints.First().Timestamp.Value;
            var protobufDataPoints = dataPoints.Select(_ => _.ToProtobuf()).ToArray();

            var frame = new Protobuf.TimeSeriesFrame {
                TimeSeries = timeSeries, Timestamp = (ulong)firstTimestamp
            };

            var payload = new Protobuf.TimeSeriesPayload();

            payload = payload.Append(protobufDataPoints);
            frame.UncompressedPayload = payload;
            frame = frame.Compress();
            var encoded = frame.ToByteArray();

            byte[] length = BitConverter.GetBytes((int)encoded.Length);

            return(length.Concat(encoded));
        }