The [Continuous Ranked Probability Score][1] (CRPS) is given by:
\begin{equation}
\mathrm{CRPS}(F, x) = \int_{-\infty}^{\infty} \left( F(y) - \mathbb{1}(y - x) \right)^2 \, dy
\end{equation}

I am trying to intuitively understand, in steps, how a CRPS of 0.625 is obtained by the [properscoring Python library][2] using ensemble values of [1, 2, 3, 4] and an observed value of 3.5. Another python package ([CRPS][3]) also gives 0.625, so I am confident that 0.625 is the result I want.

**Python code that gives 0.625**

    import numpy as np
    import properscoring as ps
    
    ensemble_values = np.array([1, 2, 3, 4])
    observed_value = 3.5
    
    ps_result = ps.crps_ensemble(observed_value, ensemble_values)
    print(ps_result)  # 0.625


**Step by step calculation that gives 0.875**

The CDF of the ensemble is: \
`F(1) = 0.25, F(2) = 0.5, F(3) = 0.75, F(4) = 1.0`


The observed value is 3.5, so the CDF of the observed value H(x) is a step function that is 0 for all values less than 3.5 and 1 for all values greater than or equal to 3.5. 

Therefore:\
`H(1) = H(2) = H(3) = 0 and H(4) = 1`

We sum the squared difference at each ensemble point:

    For x1: (0.25 - 0)**2 = 0.0625
    For x2: (0.5 - 0)**2 = 0.25
    For x3: (0.75 - 0)**2 = 0.5625
    For x4: (1.0 - 1)**2 = 0

    CRPS = 0.0625 + 0.25 + 0.5625 + 0 = 0.875

Any idea what the missing piece of the puzzle is?

  [1]: https://www.lokad.com/continuous-ranked-probability-score/
  [2]: https://pypi.org/project/properscoring/
  [3]: https://pypi.org/project/CRPS/