{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "0", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [ "remove-cell" ] }, "outputs": [], "source": [ "# mypy: disable-error-code=\"no-untyped-def, no-untyped-call\"\n", "# pyright: reportUnusedExpression=false, reportDuplicateImport=false, reportUnusedImport=false\n", "import os\n", "from pathlib import Path\n", "\n", "p = Path.cwd()\n", "for _ in range(100):\n", " if p.name == \"cmomy\":\n", " break\n", " p = p.parent\n", "\n", "os.environ[\"NUMBA_CACHE_DIR\"] = str(p / \".numba_cache\")" ] }, { "cell_type": "code", "execution_count": 2, "id": "1", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [ "remove-cell" ] }, "outputs": [ { "data": { "text/html": [ "\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%html\n", "\n" ] }, { "cell_type": "code", "execution_count": 3, "id": "2", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [ "remove-cell" ] }, "outputs": [], "source": [ "import numpy as np\n", "\n", "np.set_printoptions(precision=4)" ] }, { "cell_type": "markdown", "id": "3", "metadata": {}, "source": [ "# Usage\n", "\n", "The basic usage of cmomy is to manipulate central moments. \n", "We measure two quantities pretend quantities. The 'energy' and the 'position' of a thing. We'll construct the average value for each record. Lets say 100 samples each. " ] }, { "cell_type": "code", "execution_count": 4, "id": "4", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import xarray as xr\n", "\n", "import cmomy\n", "\n", "rng = cmomy.random.default_rng(seed=0)\n", "\n", "nsamp = 100\n", "energy = xr.DataArray(rng.random(nsamp), dims=[\"samp\"])\n", "\n", "position = xr.DataArray(rng.random((nsamp, 3)), dims=[\"samp\", \"dim\"])\n", "\n", "# weight associated with each sample and each record\n", "w = xr.DataArray(rng.random(nsamp), dims=[\"samp\"])\n", "\n", "# average over the samples\n", "ce = cmomy.xCentralMoments.from_vals(energy, weight=w, dim=\"samp\", mom=3)\n", "cp = cmomy.xCentralMoments.from_vals(position, weight=w, dim=\"samp\", mom=3)" ] }, { "cell_type": "code", "execution_count": 5, "id": "5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "energy\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray (mom_0: 4)> Size: 32B\n",
       "array([ 5.3105e+01,  5.5314e-01,  8.6378e-02, -5.7464e-03])\n",
       "Dimensions without coordinates: mom_0
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray (mom_0: 4)> Size: 32B\n",
       "array([ 5.3105e+01,  5.5314e-01,  8.6378e-02, -5.7464e-03])\n",
       "Dimensions without coordinates: mom_0
" ], "text/plain": [ "\n", " Size: 32B\n", "array([ 5.3105e+01, 5.5314e-01, 8.6378e-02, -5.7464e-03])\n", "Dimensions without coordinates: mom_0" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(\"energy\")\n", "ce" ] }, { "cell_type": "code", "execution_count": 6, "id": "6", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "position\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray (dim: 3, mom_0: 4)> Size: 96B\n",
       "array([[ 5.3105e+01,  5.2437e-01,  6.9091e-02, -5.5768e-04],\n",
       "       [ 5.3105e+01,  4.9062e-01,  9.5523e-02,  2.2967e-03],\n",
       "       [ 5.3105e+01,  5.6372e-01,  8.7545e-02, -8.3042e-03]])\n",
       "Dimensions without coordinates: dim, mom_0
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray (dim: 3, mom_0: 4)> Size: 96B\n",
       "array([[ 5.3105e+01,  5.2437e-01,  6.9091e-02, -5.5768e-04],\n",
       "       [ 5.3105e+01,  4.9062e-01,  9.5523e-02,  2.2967e-03],\n",
       "       [ 5.3105e+01,  5.6372e-01,  8.7545e-02, -8.3042e-03]])\n",
       "Dimensions without coordinates: dim, mom_0
" ], "text/plain": [ "\n", " Size: 96B\n", "array([[ 5.3105e+01, 5.2437e-01, 6.9091e-02, -5.5768e-04],\n", " [ 5.3105e+01, 4.9062e-01, 9.5523e-02, 2.2967e-03],\n", " [ 5.3105e+01, 5.6372e-01, 8.7545e-02, -8.3042e-03]])\n", "Dimensions without coordinates: dim, mom_0" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(\"position\")\n", "cp" ] }, { "cell_type": "markdown", "id": "7", "metadata": {}, "source": [ "Here, we've used the constructor {meth}`cmomy.CentralMoments.from_vals`. There are a host of other constructors to create {class}`cmomy.CentralMoments` object. Take a look at the docs for further info." ] }, { "cell_type": "markdown", "id": "8", "metadata": {}, "source": [ "## Basic attributes\n", "\n", "Notice that there are three `shape` parameters associated with a {class}`cmomy.CentralMoments` object:\n", " \n", "* {attr}`cmomy.CentralMoments.mom_shape` : shape of the moments. For single variable, tuple (mom+1,). For comoments, (mom_0+1, mom_1+1)\n", "* {attr}`cmomy.CentralMoments.val_shape`: shape of the 'values' part of the data. For scalar data, `val_shape = ()`. For vector data, this is the shape of the passed observation data.\n", "* {attr}`cmomy.CentralMoments.shape`: total shape of wrapped moments `shape = val_shape + mom_shape`" ] }, { "cell_type": "code", "execution_count": 7, "id": "9", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "energy shapes:\n", " mom_shape: (4,)\n", " val_shape: ()\n", " shape : (4,)\n", "\n", "\n", "position shapes:\n", " mom_shape: (4,)\n", " val_shape: (3,)\n", " shape : (3, 4)\n", "\n" ] } ], "source": [ "for name, c in {\"energy\": ce, \"position\": cp}.items():\n", " print(\n", " f\"\"\"\n", "{name} shapes:\n", " mom_shape: {c.mom_shape}\n", " val_shape: {c.val_shape}\n", " shape : {c.shape}\n", "\"\"\"\n", " )" ] }, { "cell_type": "markdown", "id": "10", "metadata": {}, "source": [ "To access the underlying data, use the {meth}`cmomy.CentralMoments.to_numpy` method or {attr}`cmomy.CentralMoments.values` attribute. The structure is:\n", "\n", "* `values[...,0]`: total weight\n", "* `values[...,1]`: average/mean value\n", "* `values[...,k>1]`: `kth` central moment." ] }, { "cell_type": "code", "execution_count": 8, "id": "11", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 5.3105e+01, 5.5314e-01, 8.6378e-02, -5.7464e-03])" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ce.to_numpy()" ] }, { "cell_type": "markdown", "id": "12", "metadata": {}, "source": [ "To access all the central moments (zeroth and first included), use the {meth}`cmomy.CentralMoments.cmom` method." ] }, { "cell_type": "code", "execution_count": 9, "id": "13", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray (mom_0: 4)> Size: 32B\n",
       "array([ 1.    ,  0.    ,  0.0864, -0.0057])\n",
       "Dimensions without coordinates: mom_0
" ], "text/plain": [ " Size: 32B\n", "array([ 1. , 0. , 0.0864, -0.0057])\n", "Dimensions without coordinates: mom_0" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ce.cmom()" ] }, { "cell_type": "markdown", "id": "14", "metadata": {}, "source": [ "Likewise, the central moments can be converted to raw moments using the {meth}`cmomy.CentralMoments.rmom` method. This uses the {mod}`cmomy.convert` module behind the scenes. " ] }, { "cell_type": "code", "execution_count": 10, "id": "15", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray (mom_0: 4)> Size: 32B\n",
       "array([1.    , 0.5531, 0.3923, 0.3068])\n",
       "Dimensions without coordinates: mom_0
" ], "text/plain": [ " Size: 32B\n", "array([1. , 0.5531, 0.3923, 0.3068])\n", "Dimensions without coordinates: mom_0" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# \n", "ce.rmom()" ] }, { "cell_type": "markdown", "id": "16", "metadata": {}, "source": [ "Additionally, there are {class}`xarray.DataArray` like attributes" ] }, { "cell_type": "code", "execution_count": 11, "id": "17", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Coordinates:\n", " *empty*" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ce.coords" ] }, { "cell_type": "code", "execution_count": 12, "id": "18", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{}" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ce.attrs" ] }, { "cell_type": "code", "execution_count": 13, "id": "19", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Frozen({'mom_0': 4})" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ce.sizes" ] }, { "cell_type": "code", "execution_count": 14, "id": "20", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "('mom_0',)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ce.dims" ] }, { "cell_type": "markdown", "id": "21", "metadata": {}, "source": [ "To access the underlying data use {meth}`cmomy.xCentralMoments.to_dataarray` method or {attr}`cmomy.xCentralMoments.values` attribute to access the {class}`xarray.DataArray` style data, or {meth}`cmomy.xCentralMoments.to_numpy` method to access the underlying {class}`numpy.ndarray` data.b" ] }, { "cell_type": "code", "execution_count": 15, "id": "22", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray (mom_0: 4)> Size: 32B\n",
       "array([ 5.3105e+01,  5.5314e-01,  8.6378e-02, -5.7464e-03])\n",
       "Dimensions without coordinates: mom_0
" ], "text/plain": [ " Size: 32B\n", "array([ 5.3105e+01, 5.5314e-01, 8.6378e-02, -5.7464e-03])\n", "Dimensions without coordinates: mom_0" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ce.to_dataarray()" ] }, { "cell_type": "code", "execution_count": 16, "id": "23", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 5.3105e+01, 5.5314e-01, 8.6378e-02, -5.7464e-03])" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ce.to_numpy()" ] }, { "cell_type": "markdown", "id": "24", "metadata": {}, "source": [ "## Manipulating (co)moments" ] }, { "cell_type": "markdown", "id": "25", "metadata": {}, "source": [ "So we have our averages. Cool. Not very special. But what if instead we repeat our experiment. Let's say we did the experiment 10 times each time giving a single record. Then our data would look like" ] }, { "cell_type": "code", "execution_count": 17, "id": "26", "metadata": {}, "outputs": [], "source": [ "nsamp = 100\n", "nrec = 10\n", "energy = xr.DataArray(rng.random((nrec, nsamp)), dims=[\"rec\", \"samp\"])\n", "position = xr.DataArray(rng.random((nrec, nsamp, 3)), dims=[\"rec\", \"samp\", \"dim\"])\n", "\n", "# weight associated with each sample and each record\n", "w = xr.DataArray(rng.random((nrec, nsamp)), dims=[\"rec\", \"samp\"])\n", "\n", "# average over the samples\n", "ce = cmomy.xCentralMoments.from_vals(energy, weight=w, dim=\"samp\", mom=3)\n", "cp = cmomy.xCentralMoments.from_vals(position, weight=w, dim=\"samp\", mom=3)" ] }, { "cell_type": "markdown", "id": "27", "metadata": {}, "source": [ "Consider just the energy. We suspect that there is some correlation between the experiments (they where done in rapid succession). So we'd like to consider two adjacent experiments as one experiment. For this, we can use the {meth}`cmomy.xCentralMoments.block` method." ] }, { "cell_type": "code", "execution_count": 18, "id": "28", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray (rec: 10, mom_0: 4)> Size: 320B\n",
       "array([[ 5.3064e+01,  4.7292e-01,  8.0077e-02,  6.5155e-03],\n",
       "       [ 4.6744e+01,  4.7915e-01,  7.8450e-02,  1.8555e-03],\n",
       "       [ 5.3254e+01,  5.0665e-01,  9.3529e-02,  2.1183e-03],\n",
       "       [ 5.0303e+01,  5.3773e-01,  6.9736e-02, -6.0640e-03],\n",
       "       [ 4.8231e+01,  5.2371e-01,  7.8316e-02, -3.9247e-03],\n",
       "       [ 5.1988e+01,  4.4939e-01,  8.1112e-02,  3.2211e-03],\n",
       "       [ 4.6908e+01,  4.9788e-01,  9.3582e-02, -4.0934e-03],\n",
       "       [ 5.4791e+01,  4.8149e-01,  8.2545e-02,  8.0189e-04],\n",
       "       [ 5.3189e+01,  4.6463e-01,  9.5055e-02,  3.3487e-03],\n",
       "       [ 5.1267e+01,  5.4169e-01,  9.3554e-02, -4.9880e-03]])\n",
       "Dimensions without coordinates: rec, mom_0
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray (rec: 10, mom_0: 4)> Size: 320B\n",
       "array([[ 5.3064e+01,  4.7292e-01,  8.0077e-02,  6.5155e-03],\n",
       "       [ 4.6744e+01,  4.7915e-01,  7.8450e-02,  1.8555e-03],\n",
       "       [ 5.3254e+01,  5.0665e-01,  9.3529e-02,  2.1183e-03],\n",
       "       [ 5.0303e+01,  5.3773e-01,  6.9736e-02, -6.0640e-03],\n",
       "       [ 4.8231e+01,  5.2371e-01,  7.8316e-02, -3.9247e-03],\n",
       "       [ 5.1988e+01,  4.4939e-01,  8.1112e-02,  3.2211e-03],\n",
       "       [ 4.6908e+01,  4.9788e-01,  9.3582e-02, -4.0934e-03],\n",
       "       [ 5.4791e+01,  4.8149e-01,  8.2545e-02,  8.0189e-04],\n",
       "       [ 5.3189e+01,  4.6463e-01,  9.5055e-02,  3.3487e-03],\n",
       "       [ 5.1267e+01,  5.4169e-01,  9.3554e-02, -4.9880e-03]])\n",
       "Dimensions without coordinates: rec, mom_0
" ], "text/plain": [ "\n", " Size: 320B\n", "array([[ 5.3064e+01, 4.7292e-01, 8.0077e-02, 6.5155e-03],\n", " [ 4.6744e+01, 4.7915e-01, 7.8450e-02, 1.8555e-03],\n", " [ 5.3254e+01, 5.0665e-01, 9.3529e-02, 2.1183e-03],\n", " [ 5.0303e+01, 5.3773e-01, 6.9736e-02, -6.0640e-03],\n", " [ 4.8231e+01, 5.2371e-01, 7.8316e-02, -3.9247e-03],\n", " [ 5.1988e+01, 4.4939e-01, 8.1112e-02, 3.2211e-03],\n", " [ 4.6908e+01, 4.9788e-01, 9.3582e-02, -4.0934e-03],\n", " [ 5.4791e+01, 4.8149e-01, 8.2545e-02, 8.0189e-04],\n", " [ 5.3189e+01, 4.6463e-01, 9.5055e-02, 3.3487e-03],\n", " [ 5.1267e+01, 5.4169e-01, 9.3554e-02, -4.9880e-03]])\n", "Dimensions without coordinates: rec, mom_0" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ce" ] }, { "cell_type": "code", "execution_count": 19, "id": "29", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray (rec: 5, mom_0: 4)> Size: 160B\n",
       "array([[ 9.9808e+01,  4.7583e-01,  7.9325e-02,  4.3255e-03],\n",
       "       [ 1.0356e+02,  5.2174e-01,  8.2213e-02, -2.4102e-03],\n",
       "       [ 1.0022e+02,  4.8515e-01,  8.1146e-02, -3.6968e-04],\n",
       "       [ 1.0170e+02,  4.8905e-01,  8.7702e-02, -1.3211e-03],\n",
       "       [ 1.0446e+02,  5.0245e-01,  9.5802e-02, -8.2761e-04]])\n",
       "Dimensions without coordinates: rec, mom_0
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray (rec: 5, mom_0: 4)> Size: 160B\n",
       "array([[ 9.9808e+01,  4.7583e-01,  7.9325e-02,  4.3255e-03],\n",
       "       [ 1.0356e+02,  5.2174e-01,  8.2213e-02, -2.4102e-03],\n",
       "       [ 1.0022e+02,  4.8515e-01,  8.1146e-02, -3.6968e-04],\n",
       "       [ 1.0170e+02,  4.8905e-01,  8.7702e-02, -1.3211e-03],\n",
       "       [ 1.0446e+02,  5.0245e-01,  9.5802e-02, -8.2761e-04]])\n",
       "Dimensions without coordinates: rec, mom_0
" ], "text/plain": [ "\n", " Size: 160B\n", "array([[ 9.9808e+01, 4.7583e-01, 7.9325e-02, 4.3255e-03],\n", " [ 1.0356e+02, 5.2174e-01, 8.2213e-02, -2.4102e-03],\n", " [ 1.0022e+02, 4.8515e-01, 8.1146e-02, -3.6968e-04],\n", " [ 1.0170e+02, 4.8905e-01, 8.7702e-02, -1.3211e-03],\n", " [ 1.0446e+02, 5.0245e-01, 9.5802e-02, -8.2761e-04]])\n", "Dimensions without coordinates: rec, mom_0" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ce.block(block_size=2, dim=\"rec\")" ] }, { "cell_type": "markdown", "id": "30", "metadata": {}, "source": [ "Instead, we can resample the already averaged data using {meth}`cmomy.xCentralMoments.resample_and_reduce`. We produce a 20 new samples taken from the original (averaged) data." ] }, { "cell_type": "code", "execution_count": 20, "id": "31", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray (rep: 20, mom_0: 4)> Size: 640B\n",
       "array([[ 4.9894e+02,  4.8483e-01,  8.4004e-02,  7.6615e-04],\n",
       "       [ 5.0316e+02,  5.0209e-01,  8.0869e-02, -1.1553e-04],\n",
       "       [ 5.1114e+02,  4.8697e-01,  8.6689e-02,  1.2299e-03],\n",
       "       [ 5.2135e+02,  4.9141e-01,  8.4228e-02, -5.7084e-04],\n",
       "       [ 5.0592e+02,  4.9809e-01,  8.5436e-02, -8.7446e-04],\n",
       "       [ 5.1902e+02,  4.9260e-01,  8.5149e-02,  7.5026e-04],\n",
       "       [ 5.0659e+02,  5.0687e-01,  8.3342e-02, -2.2954e-03],\n",
       "       [ 5.0490e+02,  4.9669e-01,  8.6755e-02, -8.1764e-04],\n",
       "       [ 5.1172e+02,  4.9714e-01,  8.1701e-02, -1.5562e-04],\n",
       "       [ 5.1915e+02,  4.8611e-01,  9.0029e-02,  2.7399e-03],\n",
       "       [ 5.1257e+02,  4.8789e-01,  8.3948e-02,  1.4324e-03],\n",
       "       [ 5.0757e+02,  4.9311e-01,  8.1820e-02, -3.7571e-04],\n",
       "       [ 4.9210e+02,  4.7666e-01,  8.3947e-02,  2.1234e-03],\n",
       "       [ 5.2529e+02,  4.9417e-01,  8.4350e-02,  1.1154e-03],\n",
       "       [ 4.9973e+02,  4.9879e-01,  8.9895e-02, -2.9911e-04],\n",
       "       [ 5.0993e+02,  4.8937e-01,  8.6093e-02,  8.3597e-04],\n",
       "       [ 5.0860e+02,  4.7908e-01,  8.5023e-02,  9.4369e-04],\n",
       "       [ 5.0110e+02,  4.9114e-01,  8.4371e-02, -1.0724e-03],\n",
       "       [ 5.2742e+02,  4.8909e-01,  8.5711e-02,  1.4218e-03],\n",
       "       [ 4.9154e+02,  4.9741e-01,  8.1855e-02, -3.3717e-04]])\n",
       "Dimensions without coordinates: rep, mom_0
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray (rep: 20, mom_0: 4)> Size: 640B\n",
       "array([[ 4.9894e+02,  4.8483e-01,  8.4004e-02,  7.6615e-04],\n",
       "       [ 5.0316e+02,  5.0209e-01,  8.0869e-02, -1.1553e-04],\n",
       "       [ 5.1114e+02,  4.8697e-01,  8.6689e-02,  1.2299e-03],\n",
       "       [ 5.2135e+02,  4.9141e-01,  8.4228e-02, -5.7084e-04],\n",
       "       [ 5.0592e+02,  4.9809e-01,  8.5436e-02, -8.7446e-04],\n",
       "       [ 5.1902e+02,  4.9260e-01,  8.5149e-02,  7.5026e-04],\n",
       "       [ 5.0659e+02,  5.0687e-01,  8.3342e-02, -2.2954e-03],\n",
       "       [ 5.0490e+02,  4.9669e-01,  8.6755e-02, -8.1764e-04],\n",
       "       [ 5.1172e+02,  4.9714e-01,  8.1701e-02, -1.5562e-04],\n",
       "       [ 5.1915e+02,  4.8611e-01,  9.0029e-02,  2.7399e-03],\n",
       "       [ 5.1257e+02,  4.8789e-01,  8.3948e-02,  1.4324e-03],\n",
       "       [ 5.0757e+02,  4.9311e-01,  8.1820e-02, -3.7571e-04],\n",
       "       [ 4.9210e+02,  4.7666e-01,  8.3947e-02,  2.1234e-03],\n",
       "       [ 5.2529e+02,  4.9417e-01,  8.4350e-02,  1.1154e-03],\n",
       "       [ 4.9973e+02,  4.9879e-01,  8.9895e-02, -2.9911e-04],\n",
       "       [ 5.0993e+02,  4.8937e-01,  8.6093e-02,  8.3597e-04],\n",
       "       [ 5.0860e+02,  4.7908e-01,  8.5023e-02,  9.4369e-04],\n",
       "       [ 5.0110e+02,  4.9114e-01,  8.4371e-02, -1.0724e-03],\n",
       "       [ 5.2742e+02,  4.8909e-01,  8.5711e-02,  1.4218e-03],\n",
       "       [ 4.9154e+02,  4.9741e-01,  8.1855e-02, -3.3717e-04]])\n",
       "Dimensions without coordinates: rep, mom_0
" ], "text/plain": [ "\n", " Size: 640B\n", "array([[ 4.9894e+02, 4.8483e-01, 8.4004e-02, 7.6615e-04],\n", " [ 5.0316e+02, 5.0209e-01, 8.0869e-02, -1.1553e-04],\n", " [ 5.1114e+02, 4.8697e-01, 8.6689e-02, 1.2299e-03],\n", " [ 5.2135e+02, 4.9141e-01, 8.4228e-02, -5.7084e-04],\n", " [ 5.0592e+02, 4.9809e-01, 8.5436e-02, -8.7446e-04],\n", " [ 5.1902e+02, 4.9260e-01, 8.5149e-02, 7.5026e-04],\n", " [ 5.0659e+02, 5.0687e-01, 8.3342e-02, -2.2954e-03],\n", " [ 5.0490e+02, 4.9669e-01, 8.6755e-02, -8.1764e-04],\n", " [ 5.1172e+02, 4.9714e-01, 8.1701e-02, -1.5562e-04],\n", " [ 5.1915e+02, 4.8611e-01, 9.0029e-02, 2.7399e-03],\n", " [ 5.1257e+02, 4.8789e-01, 8.3948e-02, 1.4324e-03],\n", " [ 5.0757e+02, 4.9311e-01, 8.1820e-02, -3.7571e-04],\n", " [ 4.9210e+02, 4.7666e-01, 8.3947e-02, 2.1234e-03],\n", " [ 5.2529e+02, 4.9417e-01, 8.4350e-02, 1.1154e-03],\n", " [ 4.9973e+02, 4.9879e-01, 8.9895e-02, -2.9911e-04],\n", " [ 5.0993e+02, 4.8937e-01, 8.6093e-02, 8.3597e-04],\n", " [ 5.0860e+02, 4.7908e-01, 8.5023e-02, 9.4369e-04],\n", " [ 5.0110e+02, 4.9114e-01, 8.4371e-02, -1.0724e-03],\n", " [ 5.2742e+02, 4.8909e-01, 8.5711e-02, 1.4218e-03],\n", " [ 4.9154e+02, 4.9741e-01, 8.1855e-02, -3.3717e-04]])\n", "Dimensions without coordinates: rep, mom_0" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "freq = ce.randsamp_freq(dim=\"rec\", nrep=20)\n", "ce_resamp = ce.resample_and_reduce(dim=\"rec\", freq=freq)\n", "ce_resamp" ] }, { "cell_type": "markdown", "id": "32", "metadata": {}, "source": [ "This is different than the usual 'resample values'. This is also available if the original data is available." ] }, { "cell_type": "code", "execution_count": 21, "id": "33", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray (rep: 20, mom_0: 4)> Size: 640B\n",
       "array([[ 5.0470e+02,  5.0732e-01,  8.3537e-02, -1.7364e-03],\n",
       "       [ 5.1471e+02,  5.0032e-01,  8.5279e-02, -1.9318e-04],\n",
       "       [ 5.1740e+02,  4.8807e-01,  8.1873e-02, -6.0608e-04],\n",
       "       [ 5.2171e+02,  5.0050e-01,  8.3951e-02, -2.8801e-04],\n",
       "       [ 5.1191e+02,  4.9601e-01,  8.5987e-02,  5.9479e-04],\n",
       "       [ 4.9898e+02,  5.0192e-01,  8.6259e-02, -4.8733e-04],\n",
       "       [ 5.0383e+02,  5.0676e-01,  8.4769e-02, -9.1195e-04],\n",
       "       [ 5.3502e+02,  4.8362e-01,  8.1934e-02,  8.0303e-04],\n",
       "       [ 4.9916e+02,  5.1223e-01,  8.6978e-02, -2.4868e-03],\n",
       "       [ 5.1508e+02,  4.8799e-01,  8.1554e-02,  1.2730e-03],\n",
       "       [ 5.0503e+02,  4.9609e-01,  8.7332e-02, -1.2149e-03],\n",
       "       [ 5.0252e+02,  4.8657e-01,  8.4106e-02,  1.2529e-03],\n",
       "       [ 5.0575e+02,  4.8867e-01,  8.9293e-02,  9.5625e-04],\n",
       "       [ 5.0848e+02,  4.8416e-01,  8.4131e-02,  1.9068e-05],\n",
       "       [ 5.0767e+02,  4.9133e-01,  8.2855e-02,  1.3108e-03],\n",
       "       [ 5.2246e+02,  4.8245e-01,  8.5488e-02,  7.4083e-05],\n",
       "       [ 5.1387e+02,  5.0965e-01,  8.5511e-02, -1.8175e-03],\n",
       "       [ 5.2162e+02,  4.9756e-01,  8.8069e-02, -3.8196e-04],\n",
       "       [ 5.0263e+02,  4.9969e-01,  8.5556e-02, -2.0398e-03],\n",
       "       [ 5.0454e+02,  5.0938e-01,  8.2281e-02, -1.8049e-03]])\n",
       "Dimensions without coordinates: rep, mom_0
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray (rep: 20, mom_0: 4)> Size: 640B\n",
       "array([[ 5.0470e+02,  5.0732e-01,  8.3537e-02, -1.7364e-03],\n",
       "       [ 5.1471e+02,  5.0032e-01,  8.5279e-02, -1.9318e-04],\n",
       "       [ 5.1740e+02,  4.8807e-01,  8.1873e-02, -6.0608e-04],\n",
       "       [ 5.2171e+02,  5.0050e-01,  8.3951e-02, -2.8801e-04],\n",
       "       [ 5.1191e+02,  4.9601e-01,  8.5987e-02,  5.9479e-04],\n",
       "       [ 4.9898e+02,  5.0192e-01,  8.6259e-02, -4.8733e-04],\n",
       "       [ 5.0383e+02,  5.0676e-01,  8.4769e-02, -9.1195e-04],\n",
       "       [ 5.3502e+02,  4.8362e-01,  8.1934e-02,  8.0303e-04],\n",
       "       [ 4.9916e+02,  5.1223e-01,  8.6978e-02, -2.4868e-03],\n",
       "       [ 5.1508e+02,  4.8799e-01,  8.1554e-02,  1.2730e-03],\n",
       "       [ 5.0503e+02,  4.9609e-01,  8.7332e-02, -1.2149e-03],\n",
       "       [ 5.0252e+02,  4.8657e-01,  8.4106e-02,  1.2529e-03],\n",
       "       [ 5.0575e+02,  4.8867e-01,  8.9293e-02,  9.5625e-04],\n",
       "       [ 5.0848e+02,  4.8416e-01,  8.4131e-02,  1.9068e-05],\n",
       "       [ 5.0767e+02,  4.9133e-01,  8.2855e-02,  1.3108e-03],\n",
       "       [ 5.2246e+02,  4.8245e-01,  8.5488e-02,  7.4083e-05],\n",
       "       [ 5.1387e+02,  5.0965e-01,  8.5511e-02, -1.8175e-03],\n",
       "       [ 5.2162e+02,  4.9756e-01,  8.8069e-02, -3.8196e-04],\n",
       "       [ 5.0263e+02,  4.9969e-01,  8.5556e-02, -2.0398e-03],\n",
       "       [ 5.0454e+02,  5.0938e-01,  8.2281e-02, -1.8049e-03]])\n",
       "Dimensions without coordinates: rep, mom_0
" ], "text/plain": [ "\n", " Size: 640B\n", "array([[ 5.0470e+02, 5.0732e-01, 8.3537e-02, -1.7364e-03],\n", " [ 5.1471e+02, 5.0032e-01, 8.5279e-02, -1.9318e-04],\n", " [ 5.1740e+02, 4.8807e-01, 8.1873e-02, -6.0608e-04],\n", " [ 5.2171e+02, 5.0050e-01, 8.3951e-02, -2.8801e-04],\n", " [ 5.1191e+02, 4.9601e-01, 8.5987e-02, 5.9479e-04],\n", " [ 4.9898e+02, 5.0192e-01, 8.6259e-02, -4.8733e-04],\n", " [ 5.0383e+02, 5.0676e-01, 8.4769e-02, -9.1195e-04],\n", " [ 5.3502e+02, 4.8362e-01, 8.1934e-02, 8.0303e-04],\n", " [ 4.9916e+02, 5.1223e-01, 8.6978e-02, -2.4868e-03],\n", " [ 5.1508e+02, 4.8799e-01, 8.1554e-02, 1.2730e-03],\n", " [ 5.0503e+02, 4.9609e-01, 8.7332e-02, -1.2149e-03],\n", " [ 5.0252e+02, 4.8657e-01, 8.4106e-02, 1.2529e-03],\n", " [ 5.0575e+02, 4.8867e-01, 8.9293e-02, 9.5625e-04],\n", " [ 5.0848e+02, 4.8416e-01, 8.4131e-02, 1.9068e-05],\n", " [ 5.0767e+02, 4.9133e-01, 8.2855e-02, 1.3108e-03],\n", " [ 5.2246e+02, 4.8245e-01, 8.5488e-02, 7.4083e-05],\n", " [ 5.1387e+02, 5.0965e-01, 8.5511e-02, -1.8175e-03],\n", " [ 5.2162e+02, 4.9756e-01, 8.8069e-02, -3.8196e-04],\n", " [ 5.0263e+02, 4.9969e-01, 8.5556e-02, -2.0398e-03],\n", " [ 5.0454e+02, 5.0938e-01, 8.2281e-02, -1.8049e-03]])\n", "Dimensions without coordinates: rep, mom_0" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# consider 'all' the data for this\n", "energy_stack = energy.stack(c=[\"rec\", \"samp\"])\n", "weight_stack = w.stack(c=[\"rec\", \"samp\"])\n", "\n", "freq = cmomy.resample.random_freq(nrep=20, ndat=energy_stack.sizes[\"c\"])\n", "\n", "out = cmomy.xCentralMoments.from_resample_vals(\n", " energy.stack(c=[\"rec\", \"samp\"]),\n", " weight=w.stack(c=[\"rec\", \"samp\"]),\n", " dim=\"c\",\n", " freq=freq,\n", " mom=3,\n", ")\n", "out" ] }, { "cell_type": "markdown", "id": "34", "metadata": {}, "source": [ "We see that the deviation in the moments is similar using the two resampling methods:" ] }, { "cell_type": "code", "execution_count": 22, "id": "35", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray (mom_0: 3)> Size: 24B\n",
       "array([0.0093, 0.0021, 0.0012])\n",
       "Dimensions without coordinates: mom_0
" ], "text/plain": [ " Size: 24B\n", "array([0.0093, 0.0021, 0.0012])\n", "Dimensions without coordinates: mom_0" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "out.to_dataarray().sel(mom_0=slice(1, None)).std(\"rep\")" ] }, { "cell_type": "code", "execution_count": 23, "id": "36", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray (mom_0: 3)> Size: 24B\n",
       "array([0.0072, 0.0024, 0.0012])\n",
       "Dimensions without coordinates: mom_0
" ], "text/plain": [ " Size: 24B\n", "array([0.0072, 0.0024, 0.0012])\n", "Dimensions without coordinates: mom_0" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ce_resamp.to_dataarray().sel(mom_0=slice(1, None)).std(\"rep\")" ] }, { "cell_type": "markdown", "id": "37", "metadata": {}, "source": [ "We can also reduce our original data across all the records using {meth}`cmomy.xCentralMoments.reduce`" ] }, { "cell_type": "code", "execution_count": 24, "id": "38", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray (mom_0: 4)> Size: 32B\n",
       "array([ 5.0974e+02,  4.9508e-01,  8.5572e-02, -6.5659e-05])\n",
       "Dimensions without coordinates: mom_0
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.DataArray (mom_0: 4)> Size: 32B\n",
       "array([ 5.0974e+02,  4.9508e-01,  8.5572e-02, -6.5659e-05])\n",
       "Dimensions without coordinates: mom_0
" ], "text/plain": [ "\n", " Size: 32B\n", "array([ 5.0974e+02, 4.9508e-01, 8.5572e-02, -6.5659e-05])\n", "Dimensions without coordinates: mom_0" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ce.reduce(dim=\"rec\")" ] } ], "metadata": { "celltoolbar": "Tags", "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.9" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 5 }