Statistical and Visualization Functions: Thicket Tutorial

Thicket is a python-based toolkit for Exploratory Data Analysis (EDA) of parallel performance data that enables performance optimization and understanding of applications’ performance on supercomputers. It bridges the performance tool gap between being able to consider only a single instance of a simulation run (e.g., single platform, single measurement tool, or single scale) and finding actionable insights in multi-dimensional, multi-scale, multi-architecture, and multi-tool performance datasets.

NOTE: An interactive version of this notebook is available in the Binder environment.

Binder


1. Import Necessary Packages

To explore the structure and various capabilities of thicket components, we begin by importing necessary packages.

[1]:
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
from IPython.display import display
from IPython.display import HTML
import hatchet as ht

import thicket as th

pd.set_option("display.max_rows", None)
pd.set_option("display.max_columns", None)

2. Read in Performance Profiles

For this notebook, we select profiles generated on Lawrence Livermore National Lab (LLNL) machine, lassen. We create two thicket objects, one generated with the same problem size of 1048576 and the other generated with different problem sizes (1048576 and 4194304).

[2]:
clang = "../data/quartz/clang14.0.6_BaseSeq_8388608/"
gcc = "../data/quartz/GCC_10.3.1_BaseSeq_08388608/O3"

# create thickets for each dataset originating from clang and gcc compilers
clang_th = th.Thicket.from_caliperreader(clang)
gcc_th = th.Thicket.from_caliperreader(gcc)
/opt/conda/lib/python3.9/site-packages/thicket/ensemble.py:319: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.
The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.

For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.


  perfdata[col].replace({fill_value: None}, inplace=True)
/opt/conda/lib/python3.9/site-packages/thicket/ensemble.py:319: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.
The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.

For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.


  perfdata[col].replace({fill_value: None}, inplace=True)

3. More Information on a Function

You can use the help() method within Python to see the information for a given object. You can do this by typing help(object). This will allow you to see the arguments for the function, and what will be returned. An example is below.

[3]:
help(th.median)
Help on function median in module thicket.stats.median:

median(thicket, columns=None)
    Calculate the median for each node in the performance data table.

    Designed to take in a thicket, and append one or more columns to the
    aggregated statistics table for the median calculation for each node.

    Arguments:
        thicket (thicket): Thicket object
        columns (list): List of hardware/timing metrics to perform median calculation
            on. Note, if using a columnar joined thicket a list of tuples must be passed
            in with the format (column index, column name).

4. Creating a Combined Thicket

To demonstrate the functions on both a thicket and a combined thicket, we create a combined thicket.

[4]:
combined_th = th.Thicket.concat_thickets(
    axis="columns",
    thickets=[clang_th, gcc_th],
    headers=["Clang", "GCC"]
)
combined_th.dataframe.head(5)
[4]:
Clang GCC name
nid time time (exc) ProblemSize Reps Iterations/Rep Bytes/Rep Kernels/Rep Flops/Rep Retiring Frontend bound Backend bound Bad speculation Branch mispredict Machine clears Frontend latency Frontend bandwidth Memory bound Core bound External Memory L1 bound L2 bound L3 bound nid time time (exc) ProblemSize Reps Iterations/Rep Bytes/Rep Kernels/Rep Flops/Rep Retiring Frontend bound Backend bound Bad speculation Branch mispredict Machine clears Frontend latency Frontend bandwidth Memory bound Core bound External Memory L1 bound L2 bound L3 bound
node profile
{'name': 'RAJAPerf', 'type': 'function'} 0 1 1.905843e+12 4729399.0 8388608.0 50.0 8388608.0 1.073742e+09 1.0 0.0 0.106787 0.398106 0.421387 0.073720 0.996068 0.003932 0.378715 0.621285 0.321128 0.462123 0.057753 -0.107304 0.008284 0.015874 1 1.966339e+12 5297509.0 8388608.0 50.0 8388608.0 1.073742e+09 1.0 0.0 0.157708 0.458613 0.330070 0.053609 0.998281 0.001719 0.384432 0.615568 0.513634 0.182591 0.054158 0.138238 -0.019995 0.016286 RAJAPerf
1 1 1.913321e+12 4814351.0 8388608.0 50.0 8388608.0 1.073742e+09 1.0 0.0 0.172806 0.481297 0.264612 0.081284 0.998236 0.001764 0.434392 0.565608 0.384583 0.212336 0.050262 0.049129 -0.028625 0.012247 1 1.943775e+12 5431988.0 8388608.0 50.0 8388608.0 1.073742e+09 1.0 0.0 0.150984 0.430133 0.312363 0.106520 0.995933 0.004067 0.382877 0.617123 0.492416 0.441751 0.063972 0.005042 0.021894 0.017674 RAJAPerf
2 1 1.906939e+12 4854684.0 8388608.0 50.0 8388608.0 1.073742e+09 1.0 0.0 0.143608 0.659793 0.103438 0.093162 0.997614 0.002386 0.488183 0.511817 0.538117 0.137147 0.078490 0.083822 -0.109164 0.014029 1 1.947811e+12 5238545.0 8388608.0 50.0 8388608.0 1.073742e+09 1.0 0.0 0.141325 0.304490 0.491996 0.062190 0.998104 0.001896 0.256295 0.743705 0.378793 0.343142 0.054910 -0.072312 0.051793 0.014941 RAJAPerf
3 1 1.910519e+12 4716924.0 8388608.0 50.0 8388608.0 1.073742e+09 1.0 0.0 0.186494 0.368687 0.331337 0.113481 0.998489 0.001511 0.348729 0.651271 0.343237 0.351991 0.049307 0.019792 -0.031746 0.010044 1 1.945722e+12 5199698.0 8388608.0 50.0 8388608.0 1.073742e+09 1.0 0.0 0.135993 0.264352 0.509942 0.089713 0.996596 0.003404 0.283715 0.716285 0.346209 0.424362 0.041255 -0.004342 0.054536 0.007233 RAJAPerf
4 1 1.901803e+12 4840942.0 8388608.0 50.0 8388608.0 1.073742e+09 1.0 0.0 0.149482 0.362130 0.452664 0.035723 0.996418 0.003582 0.341109 0.658891 0.379500 0.459345 0.055345 -0.020517 -0.004936 0.017540 1 1.967202e+12 5446490.0 8388608.0 50.0 8388608.0 1.073742e+09 1.0 0.0 0.167547 0.418046 0.308730 0.105677 0.998092 0.001908 0.413277 0.586723 0.440381 0.280011 0.048919 0.109049 -0.021731 0.010631 RAJAPerf

NOTE - Single indexed statistical functions append columns to the right. - Columnar joined thickets are ordered in alphabetical order by column index and also by the columns underneath a column index.

5. Aggregated Statistic Functions

5.1 Maximum

The maximum function will determine the maximum value for each node in the performance data table. In other terms, the maximum is the highest observation for a node and its associated profiles.

The maximum value will be appended to the aggregated statistics table and will be denoted with _max at the end of column name i.e. column_max.

Single Index Thicket Example

[5]:
# define metrics to calculate the maximum on
metrics = ["time (exc)", "Machine clears"]
[6]:
th.maximum(clang_th, columns=metrics)
# view the first 5 entries of the aggregated statistics table
clang_th.statsframe.dataframe.head(5)
/opt/conda/lib/python3.9/site-packages/thicket/stats/maximum.py:32: FutureWarning: The provided callable <built-in function max> is currently using DataFrameGroupBy.max. In a future version of pandas, the provided callable will be used directly. To keep current behavior pass the string "max" instead.
  df = thicket.dataframe[columns].reset_index().groupby("node").agg(max)
[6]:
name time (exc)_max Machine clears_max
node
{'name': 'RAJAPerf', 'type': 'function'} RAJAPerf 4.922397e+06 0.003932
{'name': 'Algorithm', 'type': 'function'} Algorithm 5.576280e+05 0.019851
{'name': 'Algorithm_MEMCPY', 'type': 'function'} Algorithm_MEMCPY 2.008037e+09 0.997907
{'name': 'Algorithm_MEMSET', 'type': 'function'} Algorithm_MEMSET 2.036565e+09 0.997923
{'name': 'Algorithm_REDUCE_SUM', 'type': 'function'} Algorithm_REDUCE_SUM 4.511030e+08 0.996756

Multi-Indexed Thicket Example

Example demonstrates how to pass a columnar joined thicket object. When passing a columnar joined thicket object, the columns argument will now take a list of tuples. Each tuple will consist of two elements. The first element will always be the column index, and the second element will be an associated column under the column index you passed.

  • Example: (column_index, column_name) -> (“GCC”, “Machine clears”)

[7]:
metrics = [("Clang", "time (exc)"), ("GCC", "Machine clears")]
[8]:
th.maximum(combined_th, columns=metrics)
combined_th.statsframe.dataframe.head(5)
/opt/conda/lib/python3.9/site-packages/thicket/stats/maximum.py:44: FutureWarning: The provided callable <built-in function max> is currently using DataFrameGroupBy.max. In a future version of pandas, the provided callable will be used directly. To keep current behavior pass the string "max" instead.
  df = thicket.dataframe[columns].reset_index(level=1).groupby("node").agg(max)
[8]:
Clang GCC name
time (exc)_max Machine clears_max
node
{'name': 'RAJAPerf', 'type': 'function'} 4.922397e+06 0.004523 RAJAPerf
{'name': 'Algorithm', 'type': 'function'} 5.576280e+05 0.014205 Algorithm
{'name': 'Algorithm_MEMCPY', 'type': 'function'} 2.008037e+09 0.992988 Algorithm_MEMCPY
{'name': 'Algorithm_MEMSET', 'type': 'function'} 2.036565e+09 0.997550 Algorithm_MEMSET
{'name': 'Algorithm_REDUCE_SUM', 'type': 'function'} 4.511030e+08 0.994624 Algorithm_REDUCE_SUM

5.2 Minimum

The minimum function will determine the minimum value for each node in the performance data table. In other terms, the minimum is the lowest observation for a node and its associated profiles.

The minimum value will be appended to the aggregated statistics table and will be denoted with _min at the end of column name i.e. column_min.

Single Index Thicket Example

[9]:
metrics = ["time (exc)", "Machine clears"]
[10]:
th.minimum(clang_th, columns=metrics)
clang_th.statsframe.dataframe.head(5)
/opt/conda/lib/python3.9/site-packages/thicket/stats/minimum.py:32: FutureWarning: The provided callable <built-in function min> is currently using DataFrameGroupBy.min. In a future version of pandas, the provided callable will be used directly. To keep current behavior pass the string "min" instead.
  df = thicket.dataframe[columns].reset_index().groupby("node").agg(min)
[10]:
name time (exc)_max Machine clears_max time (exc)_min Machine clears_min
node
{'name': 'RAJAPerf', 'type': 'function'} RAJAPerf 4.922397e+06 0.003932 4.696939e+06 0.001099
{'name': 'Algorithm', 'type': 'function'} Algorithm 5.576280e+05 0.019851 5.176070e+05 0.000000
{'name': 'Algorithm_MEMCPY', 'type': 'function'} Algorithm_MEMCPY 2.008037e+09 0.997907 1.982438e+09 0.990401
{'name': 'Algorithm_MEMSET', 'type': 'function'} Algorithm_MEMSET 2.036565e+09 0.997923 2.006252e+09 0.988505
{'name': 'Algorithm_REDUCE_SUM', 'type': 'function'} Algorithm_REDUCE_SUM 4.511030e+08 0.996756 4.467119e+08 0.954967

Multi-Indexed Thicket Example

Example will show how to pass a columnar joined thicket object. When passing a columnar joined thicket object, the columns argument will now take a list of tuples. Each tuple will consist of two elements. The first element will always be the column index, and the second element will be an associated column under the column index you passed.

  • Example: (column_index, column_name) -> (“GCC”, “Machine clears”)

[11]:
metrics = [("Clang", "time (exc)"), ("GCC", "Machine clears")]
[12]:
th.minimum(combined_th, columns=metrics)
combined_th.statsframe.dataframe.head(5)
/opt/conda/lib/python3.9/site-packages/thicket/stats/minimum.py:43: FutureWarning: The provided callable <built-in function min> is currently using DataFrameGroupBy.min. In a future version of pandas, the provided callable will be used directly. To keep current behavior pass the string "min" instead.
  df = thicket.dataframe[columns].reset_index(level=1).groupby("node").agg(min)
[12]:
Clang GCC name
time (exc)_max time (exc)_min Machine clears_max Machine clears_min
node
{'name': 'RAJAPerf', 'type': 'function'} 4.922397e+06 4.696939e+06 0.004523 0.001071 RAJAPerf
{'name': 'Algorithm', 'type': 'function'} 5.576280e+05 5.176070e+05 0.014205 0.000000 Algorithm
{'name': 'Algorithm_MEMCPY', 'type': 'function'} 2.008037e+09 1.982438e+09 0.992988 0.956393 Algorithm_MEMCPY
{'name': 'Algorithm_MEMSET', 'type': 'function'} 2.036565e+09 2.006252e+09 0.997550 0.980433 Algorithm_MEMSET
{'name': 'Algorithm_REDUCE_SUM', 'type': 'function'} 4.511030e+08 4.467119e+08 0.994624 0.770469 Algorithm_REDUCE_SUM

5.3 Median

The median function will determine the median for each node in the performance data table.

The median value will be appended to the aggregated statistics table and will be denoted with _median at the end of column name i.e. column_median.

Single Index Thicket Example

[13]:
metrics = ["time (exc)", "Machine clears"]
[14]:
th.median(clang_th, columns=metrics)
clang_th.statsframe.dataframe.head(5)
/opt/conda/lib/python3.9/site-packages/thicket/stats/median.py:32: FutureWarning: The provided callable <function median at 0xffff941f18b0> is currently using DataFrameGroupBy.median. In a future version of pandas, the provided callable will be used directly. To keep current behavior pass the string "median" instead.
  df = thicket.dataframe[columns].reset_index().groupby("node").agg(np.median)
[14]:
name time (exc)_max Machine clears_max time (exc)_min Machine clears_min time (exc)_median Machine clears_median
node
{'name': 'RAJAPerf', 'type': 'function'} RAJAPerf 4.922397e+06 0.003932 4.696939e+06 0.001099 4.792514e+06 0.002209
{'name': 'Algorithm', 'type': 'function'} Algorithm 5.576280e+05 0.019851 5.176070e+05 0.000000 5.386245e+05 0.004722
{'name': 'Algorithm_MEMCPY', 'type': 'function'} Algorithm_MEMCPY 2.008037e+09 0.997907 1.982438e+09 0.990401 2.001818e+09 0.996143
{'name': 'Algorithm_MEMSET', 'type': 'function'} Algorithm_MEMSET 2.036565e+09 0.997923 2.006252e+09 0.988505 2.018832e+09 0.993871
{'name': 'Algorithm_REDUCE_SUM', 'type': 'function'} Algorithm_REDUCE_SUM 4.511030e+08 0.996756 4.467119e+08 0.954967 4.498193e+08 0.990938

Multi-Indexed Thicket Example

Example will show how to pass a columnar joined thicket object. When passing a columnar joined thicket object, the columns argument will now take a list of tuples. Each tuple will consist of two elements. The first element will always be the column index, and the second element will be an associated column under the column index you passed.

  • Example: (column_index, column_name) -> (“GCC”, “Machine clears”)

[15]:
metrics = [("Clang", "time (exc)"), ("GCC", "Machine clears")]
[16]:
th.median(combined_th, columns=metrics)
combined_th.statsframe.dataframe.head(5)
/opt/conda/lib/python3.9/site-packages/thicket/stats/median.py:45: FutureWarning: The provided callable <function median at 0xffff941f18b0> is currently using DataFrameGroupBy.median. In a future version of pandas, the provided callable will be used directly. To keep current behavior pass the string "median" instead.
  thicket.dataframe[columns]
[16]:
Clang GCC name
time (exc)_max time (exc)_median time (exc)_min Machine clears_max Machine clears_median Machine clears_min
node
{'name': 'RAJAPerf', 'type': 'function'} 4.922397e+06 4.792514e+06 4.696939e+06 0.004523 0.003061 0.001071 RAJAPerf
{'name': 'Algorithm', 'type': 'function'} 5.576280e+05 5.386245e+05 5.176070e+05 0.014205 0.004810 0.000000 Algorithm
{'name': 'Algorithm_MEMCPY', 'type': 'function'} 2.008037e+09 2.001818e+09 1.982438e+09 0.992988 0.984356 0.956393 Algorithm_MEMCPY
{'name': 'Algorithm_MEMSET', 'type': 'function'} 2.036565e+09 2.018832e+09 2.006252e+09 0.997550 0.991464 0.980433 Algorithm_MEMSET
{'name': 'Algorithm_REDUCE_SUM', 'type': 'function'} 4.511030e+08 4.498193e+08 4.467119e+08 0.994624 0.925987 0.770469 Algorithm_REDUCE_SUM

5.4 Mean

The mean function will determine the mean for each node in the performance data table.

The mean value will be appended to the aggregated statistics table and will be denoted with _mean at the end of column name i.e. column_mean.

Single Index Thicket Example

[17]:
metrics = ["time (exc)", "Machine clears"]
[18]:
th.mean(clang_th, columns=metrics)
clang_th.statsframe.dataframe.head(5)
/opt/conda/lib/python3.9/site-packages/thicket/stats/mean.py:32: FutureWarning: The provided callable <function mean at 0xffff943dca60> is currently using DataFrameGroupBy.mean. In a future version of pandas, the provided callable will be used directly. To keep current behavior pass the string "mean" instead.
  df = thicket.dataframe[columns].reset_index().groupby("node").agg(np.mean)
[18]:
name time (exc)_max Machine clears_max time (exc)_min Machine clears_min time (exc)_median Machine clears_median time (exc)_mean Machine clears_mean
node
{'name': 'RAJAPerf', 'type': 'function'} RAJAPerf 4.922397e+06 0.003932 4.696939e+06 0.001099 4.792514e+06 0.002209 4.788171e+06 0.002266
{'name': 'Algorithm', 'type': 'function'} Algorithm 5.576280e+05 0.019851 5.176070e+05 0.000000 5.386245e+05 0.004722 5.383793e+05 0.007061
{'name': 'Algorithm_MEMCPY', 'type': 'function'} Algorithm_MEMCPY 2.008037e+09 0.997907 1.982438e+09 0.990401 2.001818e+09 0.996143 1.997560e+09 0.995425
{'name': 'Algorithm_MEMSET', 'type': 'function'} Algorithm_MEMSET 2.036565e+09 0.997923 2.006252e+09 0.988505 2.018832e+09 0.993871 2.020861e+09 0.993798
{'name': 'Algorithm_REDUCE_SUM', 'type': 'function'} Algorithm_REDUCE_SUM 4.511030e+08 0.996756 4.467119e+08 0.954967 4.498193e+08 0.990938 4.492754e+08 0.981222

Multi-Indexed Thicket Example

Example will show how to pass a columnar joined thicket object. When passing a columnar joined thicket object, the columns argument will now take a list of tuples. Each tuple will consist of two elements. The first element will always be the column index, and the second element will be an associated column under the column index you passed.

  • Example: (column_index, column_name) -> (“GCC”, “Machine clears”)

[19]:
metrics = [("Clang", "time (exc)"), ("GCC", "Machine clears")]
[20]:
th.mean(combined_th, columns=metrics)
combined_th.statsframe.dataframe.head(5)
/opt/conda/lib/python3.9/site-packages/thicket/stats/mean.py:44: FutureWarning: The provided callable <function mean at 0xffff943dca60> is currently using DataFrameGroupBy.mean. In a future version of pandas, the provided callable will be used directly. To keep current behavior pass the string "mean" instead.
  thicket.dataframe[columns].reset_index(level=1).groupby("node").agg(np.mean)
[20]:
Clang GCC name
time (exc)_max time (exc)_mean time (exc)_median time (exc)_min Machine clears_max Machine clears_mean Machine clears_median Machine clears_min
node
{'name': 'RAJAPerf', 'type': 'function'} 4.922397e+06 4.788171e+06 4.792514e+06 4.696939e+06 0.004523 0.002853 0.003061 0.001071 RAJAPerf
{'name': 'Algorithm', 'type': 'function'} 5.576280e+05 5.383793e+05 5.386245e+05 5.176070e+05 0.014205 0.005249 0.004810 0.000000 Algorithm
{'name': 'Algorithm_MEMCPY', 'type': 'function'} 2.008037e+09 1.997560e+09 2.001818e+09 1.982438e+09 0.992988 0.978926 0.984356 0.956393 Algorithm_MEMCPY
{'name': 'Algorithm_MEMSET', 'type': 'function'} 2.036565e+09 2.020861e+09 2.018832e+09 2.006252e+09 0.997550 0.990934 0.991464 0.980433 Algorithm_MEMSET
{'name': 'Algorithm_REDUCE_SUM', 'type': 'function'} 4.511030e+08 4.492754e+08 4.498193e+08 4.467119e+08 0.994624 0.922818 0.925987 0.770469 Algorithm_REDUCE_SUM

5.5 Variance

The variance function will determine the variance for each node in the performance data table. Variance will allow a user to see the spread of tdata within a node and that nodes associated profiles.

The variance value will be appended to the aggregated statistics table and will be denoted with _var at the end of column name i.e. column_var.

Single Index Thicket Example

[21]:
metrics = ["time (exc)", "Machine clears"]
[22]:
th.variance(clang_th, columns=metrics)
clang_th.statsframe.dataframe.head(5)
/opt/conda/lib/python3.9/site-packages/thicket/stats/variance.py:35: FutureWarning: The provided callable <function var at 0xffff943dcca0> is currently using DataFrameGroupBy.var. In a future version of pandas, the provided callable will be used directly. To keep current behavior pass the string "var" instead.
  df = thicket.dataframe[columns].reset_index().groupby("node").agg(np.var)
[22]:
name time (exc)_max Machine clears_max time (exc)_min Machine clears_min time (exc)_median Machine clears_median time (exc)_mean Machine clears_mean time (exc)_var Machine clears_var
node
{'name': 'RAJAPerf', 'type': 'function'} RAJAPerf 4.922397e+06 0.003932 4.696939e+06 0.001099 4.792514e+06 0.002209 4.788171e+06 0.002266 5.320529e+09 9.199162e-07
{'name': 'Algorithm', 'type': 'function'} Algorithm 5.576280e+05 0.019851 5.176070e+05 0.000000 5.386245e+05 0.004722 5.383793e+05 0.007061 1.773236e+08 4.328011e-05
{'name': 'Algorithm_MEMCPY', 'type': 'function'} Algorithm_MEMCPY 2.008037e+09 0.997907 1.982438e+09 0.990401 2.001818e+09 0.996143 1.997560e+09 0.995425 9.221915e+13 5.530862e-06
{'name': 'Algorithm_MEMSET', 'type': 'function'} Algorithm_MEMSET 2.036565e+09 0.997923 2.006252e+09 0.988505 2.018832e+09 0.993871 2.020861e+09 0.993798 8.949541e+13 9.666489e-06
{'name': 'Algorithm_REDUCE_SUM', 'type': 'function'} Algorithm_REDUCE_SUM 4.511030e+08 0.996756 4.467119e+08 0.954967 4.498193e+08 0.990938 4.492754e+08 0.981222 2.442450e+12 2.613859e-04

Multi-Indexed Thicket Example

Example will show how to pass a columnar joined thicket object. When passing a columnar joined thicket object, the columns argument will now take a list of tuples. Each tuple will consist of two elements. The first element will always be the column index, and the second element will be an associated column under the column index you passed.

  • Example: (column_index, column_name) -> (“GCC”, “Machine clears”)

[23]:
metrics = [("Clang", "time (exc)"), ("GCC", "Machine clears")]
[24]:
th.variance(combined_th, columns=metrics)
combined_th.statsframe.dataframe.head(5)
/opt/conda/lib/python3.9/site-packages/thicket/stats/variance.py:46: FutureWarning: The provided callable <function var at 0xffff943dcca0> is currently using DataFrameGroupBy.var. In a future version of pandas, the provided callable will be used directly. To keep current behavior pass the string "var" instead.
  df = thicket.dataframe[columns].reset_index(level=1).groupby("node").agg(np.var)
[24]:
Clang GCC name
time (exc)_max time (exc)_mean time (exc)_median time (exc)_min time (exc)_var Machine clears_max Machine clears_mean Machine clears_median Machine clears_min Machine clears_var
node
{'name': 'RAJAPerf', 'type': 'function'} 4.922397e+06 4.788171e+06 4.792514e+06 4.696939e+06 5.320529e+09 0.004523 0.002853 0.003061 0.001071 0.000001 RAJAPerf
{'name': 'Algorithm', 'type': 'function'} 5.576280e+05 5.383793e+05 5.386245e+05 5.176070e+05 1.773236e+08 0.014205 0.005249 0.004810 0.000000 0.000019 Algorithm
{'name': 'Algorithm_MEMCPY', 'type': 'function'} 2.008037e+09 1.997560e+09 2.001818e+09 1.982438e+09 9.221915e+13 0.992988 0.978926 0.984356 0.956393 0.000161 Algorithm_MEMCPY
{'name': 'Algorithm_MEMSET', 'type': 'function'} 2.036565e+09 2.020861e+09 2.018832e+09 2.006252e+09 8.949541e+13 0.997550 0.990934 0.991464 0.980433 0.000029 Algorithm_MEMSET
{'name': 'Algorithm_REDUCE_SUM', 'type': 'function'} 4.511030e+08 4.492754e+08 4.498193e+08 4.467119e+08 2.442450e+12 0.994624 0.922818 0.925987 0.770469 0.005237 Algorithm_REDUCE_SUM

5.6 Standard Deviation

The std function will determine the standard deviation for each node in the performance data table. Standard deviation describes how dispersed the data is in relation to the mean.

The standard deviation value will be appended to the aggregated statistics table and will be denoted with _std at the end of column name i.e. column_std.

Single Index Thicket Example

[25]:
metrics = ["time (exc)", "Machine clears"]
[26]:
th.std(clang_th, columns=metrics)
clang_th.statsframe.dataframe.head(5)
/opt/conda/lib/python3.9/site-packages/thicket/stats/std.py:34: FutureWarning: The provided callable <function std at 0xffff943dcb80> is currently using DataFrameGroupBy.std. In a future version of pandas, the provided callable will be used directly. To keep current behavior pass the string "std" instead.
  df = thicket.dataframe[columns].reset_index().groupby("node").agg(np.std)
[26]:
name time (exc)_max Machine clears_max time (exc)_min Machine clears_min time (exc)_median Machine clears_median time (exc)_mean Machine clears_mean time (exc)_var Machine clears_var time (exc)_std Machine clears_std
node
{'name': 'RAJAPerf', 'type': 'function'} RAJAPerf 4.922397e+06 0.003932 4.696939e+06 0.001099 4.792514e+06 0.002209 4.788171e+06 0.002266 5.320529e+09 9.199162e-07 7.294195e+04 0.000959
{'name': 'Algorithm', 'type': 'function'} Algorithm 5.576280e+05 0.019851 5.176070e+05 0.000000 5.386245e+05 0.004722 5.383793e+05 0.007061 1.773236e+08 4.328011e-05 1.331629e+04 0.006579
{'name': 'Algorithm_MEMCPY', 'type': 'function'} Algorithm_MEMCPY 2.008037e+09 0.997907 1.982438e+09 0.990401 2.001818e+09 0.996143 1.997560e+09 0.995425 9.221915e+13 5.530862e-06 9.603080e+06 0.002352
{'name': 'Algorithm_MEMSET', 'type': 'function'} Algorithm_MEMSET 2.036565e+09 0.997923 2.006252e+09 0.988505 2.018832e+09 0.993871 2.020861e+09 0.993798 8.949541e+13 9.666489e-06 9.460201e+06 0.003109
{'name': 'Algorithm_REDUCE_SUM', 'type': 'function'} Algorithm_REDUCE_SUM 4.511030e+08 0.996756 4.467119e+08 0.954967 4.498193e+08 0.990938 4.492754e+08 0.981222 2.442450e+12 2.613859e-04 1.562834e+06 0.016167

Multi-Indexed Thicket Example

Example will show how to pass a columnar joined thicket object. When passing a columnar joined thicket object, the columns argument will now take a list of tuples. Each tuple will consist of two elements. The first element will always be the column index, and the second element will be an associated column under the column index you passed.

  • Example: (column_index, column_name) -> (“GCC”, “Machine clears”)

[27]:
metrics = [("Clang", "time (exc)"), ("GCC", "Machine clears")]
[28]:
th.std(combined_th, columns=metrics)
combined_th.statsframe.dataframe.head(5)
/opt/conda/lib/python3.9/site-packages/thicket/stats/std.py:45: FutureWarning: The provided callable <function std at 0xffff943dcb80> is currently using DataFrameGroupBy.std. In a future version of pandas, the provided callable will be used directly. To keep current behavior pass the string "std" instead.
  df = thicket.dataframe[columns].reset_index(level=1).groupby("node").agg(np.std)
[28]:
Clang GCC name
time (exc)_max time (exc)_mean time (exc)_median time (exc)_min time (exc)_std time (exc)_var Machine clears_max Machine clears_mean Machine clears_median Machine clears_min Machine clears_std Machine clears_var
node
{'name': 'RAJAPerf', 'type': 'function'} 4.922397e+06 4.788171e+06 4.792514e+06 4.696939e+06 7.294195e+04 5.320529e+09 0.004523 0.002853 0.003061 0.001071 0.001155 0.000001 RAJAPerf
{'name': 'Algorithm', 'type': 'function'} 5.576280e+05 5.383793e+05 5.386245e+05 5.176070e+05 1.331629e+04 1.773236e+08 0.014205 0.005249 0.004810 0.000000 0.004414 0.000019 Algorithm
{'name': 'Algorithm_MEMCPY', 'type': 'function'} 2.008037e+09 1.997560e+09 2.001818e+09 1.982438e+09 9.603080e+06 9.221915e+13 0.992988 0.978926 0.984356 0.956393 0.012691 0.000161 Algorithm_MEMCPY
{'name': 'Algorithm_MEMSET', 'type': 'function'} 2.036565e+09 2.020861e+09 2.018832e+09 2.006252e+09 9.460201e+06 8.949541e+13 0.997550 0.990934 0.991464 0.980433 0.005403 0.000029 Algorithm_MEMSET
{'name': 'Algorithm_REDUCE_SUM', 'type': 'function'} 4.511030e+08 4.492754e+08 4.498193e+08 4.467119e+08 1.562834e+06 2.442450e+12 0.994624 0.922818 0.925987 0.770469 0.072369 0.005237 Algorithm_REDUCE_SUM

5.7 Percentiles

The percentiles function will determine the q-th percentiles for each node in the performance data table.

  • The 25th percentile is the lower quartile, and is the value at which 25% of the answers lie below that value.

  • The 50th percentile is the median and half othe values lie below the median and half lie above the median.

  • The 75th percentile is the upper quartiles, and is the value at which 25% of the answers lie above that value and 75% of the answer lie below that value.

The calculated percentiles will be appended to the aggregated statistics table and will be denoted with _percentiles at the end of column name i.e. column_percentiles.

Single Index Thicket Example

[29]:
metrics = ["time (exc)", "Machine clears"]
[30]:
th.percentiles(clang_th, columns=metrics)
clang_th.statsframe.dataframe.head(5)
/opt/conda/lib/python3.9/site-packages/thicket/stats/percentiles.py:47: FutureWarning: unique with argument that is not not a Series, Index, ExtensionArray, or np.ndarray is deprecated and will raise in a future version.
  for node in pd.unique(df.reset_index()["node"].tolist()):
/opt/conda/lib/python3.9/site-packages/thicket/stats/percentiles.py:47: FutureWarning: unique with argument that is not not a Series, Index, ExtensionArray, or np.ndarray is deprecated and will raise in a future version.
  for node in pd.unique(df.reset_index()["node"].tolist()):
[30]:
name time (exc)_max Machine clears_max time (exc)_min Machine clears_min time (exc)_median Machine clears_median time (exc)_mean Machine clears_mean time (exc)_var Machine clears_var time (exc)_std Machine clears_std time (exc)_percentiles Machine clears_percentiles
node
{'name': 'RAJAPerf', 'type': 'function'} RAJAPerf 4.922397e+06 0.003932 4.696939e+06 0.001099 4.792514e+06 0.002209 4.788171e+06 0.002266 5.320529e+09 9.199162e-07 7.294195e+04 0.000959 [4723135.0, 4792513.5, 4834294.25] [0.00157425, 0.002209, 0.002657]
{'name': 'Algorithm', 'type': 'function'} Algorithm 5.576280e+05 0.019851 5.176070e+05 0.000000 5.386245e+05 0.004722 5.383793e+05 0.007061 1.773236e+08 4.328011e-05 1.331629e+04 0.006579 [533120.25, 538624.5, 545153.5] [0.0025005, 0.0047220000000000005, 0.00878175]
{'name': 'Algorithm_MEMCPY', 'type': 'function'} Algorithm_MEMCPY 2.008037e+09 0.997907 1.982438e+09 0.990401 2.001818e+09 0.996143 1.997560e+09 0.995425 9.221915e+13 5.530862e-06 9.603080e+06 0.002352 [1988997772.0, 2001817999.5, 2004877745.25] [0.99408025, 0.9961425, 0.9970844999999999]
{'name': 'Algorithm_MEMSET', 'type': 'function'} Algorithm_MEMSET 2.036565e+09 0.997923 2.006252e+09 0.988505 2.018832e+09 0.993871 2.020861e+09 0.993798 8.949541e+13 9.666489e-06 9.460201e+06 0.003109 [2014797196.0, 2018832431.0, 2027420716.75] [0.99133675, 0.993871, 0.9959795]
{'name': 'Algorithm_REDUCE_SUM', 'type': 'function'} Algorithm_REDUCE_SUM 4.511030e+08 0.996756 4.467119e+08 0.954967 4.498193e+08 0.990938 4.492754e+08 0.981222 2.442450e+12 2.613859e-04 1.562834e+06 0.016167 [448020898.75, 449819291.0, 450391779.5] [0.9703815, 0.990938, 0.99332575]

Multi-Indexed Thicket Example Example will show how to pass a columnar joined thicket object. When passing a columnar joined thicket object, the columns argument will now take a list of tuples. Each tuple will consist of two elements. The first element will always be the column index, and the second element will be an associated column under the column index you passed.

  • Example: (column_index, column_name) -> (“GCC”, “Machine clears”)

[31]:
metrics = [("Clang", "time (exc)"), ("GCC", "Machine clears")]
[32]:
th.percentiles(combined_th, columns=metrics)
combined_th.statsframe.dataframe.head(5)
/opt/conda/lib/python3.9/site-packages/thicket/stats/percentiles.py:64: FutureWarning: unique with argument that is not not a Series, Index, ExtensionArray, or np.ndarray is deprecated and will raise in a future version.
  for node in pd.unique(df.reset_index()["node"].tolist()):
/opt/conda/lib/python3.9/site-packages/thicket/stats/percentiles.py:64: FutureWarning: unique with argument that is not not a Series, Index, ExtensionArray, or np.ndarray is deprecated and will raise in a future version.
  for node in pd.unique(df.reset_index()["node"].tolist()):
[32]:
Clang GCC name
time (exc)_max time (exc)_mean time (exc)_median time (exc)_min time (exc)_percentiles time (exc)_std time (exc)_var Machine clears_max Machine clears_mean Machine clears_median Machine clears_min Machine clears_percentiles Machine clears_std Machine clears_var
node
{'name': 'RAJAPerf', 'type': 'function'} 4.922397e+06 4.788171e+06 4.792514e+06 4.696939e+06 [4723135.0, 4792513.5, 4834294.25] 7.294195e+04 5.320529e+09 0.004523 0.002853 0.003061 0.001071 [0.0018989999999999999, 0.0030615, 0.00361175] 0.001155 0.000001 RAJAPerf
{'name': 'Algorithm', 'type': 'function'} 5.576280e+05 5.383793e+05 5.386245e+05 5.176070e+05 [533120.25, 538624.5, 545153.5] 1.331629e+04 1.773236e+08 0.014205 0.005249 0.004810 0.000000 [0.00244575, 0.00481, 0.006431] 0.004414 0.000019 Algorithm
{'name': 'Algorithm_MEMCPY', 'type': 'function'} 2.008037e+09 1.997560e+09 2.001818e+09 1.982438e+09 [1988997772.0, 2001817999.5, 2004877745.25] 9.603080e+06 9.221915e+13 0.992988 0.978926 0.984356 0.956393 [0.968337, 0.984356, 0.9885772500000001] 0.012691 0.000161 Algorithm_MEMCPY
{'name': 'Algorithm_MEMSET', 'type': 'function'} 2.036565e+09 2.020861e+09 2.018832e+09 2.006252e+09 [2014797196.0, 2018832431.0, 2027420716.75] 9.460201e+06 8.949541e+13 0.997550 0.990934 0.991464 0.980433 [0.98897875, 0.991464, 0.9943077499999999] 0.005403 0.000029 Algorithm_MEMSET
{'name': 'Algorithm_REDUCE_SUM', 'type': 'function'} 4.511030e+08 4.492754e+08 4.498193e+08 4.467119e+08 [448020898.75, 449819291.0, 450391779.5] 1.562834e+06 2.442450e+12 0.994624 0.922818 0.925987 0.770469 [0.8846215, 0.9259875, 0.987635] 0.072369 0.005237 Algorithm_REDUCE_SUM

5.8 Check Normality

The check_normality function will determine if the data is normal or non-normal for each node in the performance data table. For this test, the more data the better. Perferably you would want to have 20 data points (20 files) in a dataset to have an accurate result.

A True boolean will be appended to the aggregated statistics table if the data is normal and a False boolean will be appended to the aggregated statistics table if the data is non-normal. The appended column will be denoted with _normality at the end of column name i.e. column_normality.

Single Index Thicket Example

[33]:
metrics = ["time (exc)", "Machine clears"]
[34]:
th.check_normality(clang_th, columns=metrics)
clang_th.statsframe.dataframe.head(5)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:46: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[column][i].pvalue
[34]:
name time (exc)_max Machine clears_max time (exc)_min Machine clears_min time (exc)_median Machine clears_median time (exc)_mean Machine clears_mean time (exc)_var Machine clears_var time (exc)_std Machine clears_std time (exc)_percentiles Machine clears_percentiles time (exc)_normality Machine clears_normality
node
{'name': 'RAJAPerf', 'type': 'function'} RAJAPerf 4.922397e+06 0.003932 4.696939e+06 0.001099 4.792514e+06 0.002209 4.788171e+06 0.002266 5.320529e+09 9.199162e-07 7.294195e+04 0.000959 [4723135.0, 4792513.5, 4834294.25] [0.00157425, 0.002209, 0.002657] True True
{'name': 'Algorithm', 'type': 'function'} Algorithm 5.576280e+05 0.019851 5.176070e+05 0.000000 5.386245e+05 0.004722 5.383793e+05 0.007061 1.773236e+08 4.328011e-05 1.331629e+04 0.006579 [533120.25, 538624.5, 545153.5] [0.0025005, 0.0047220000000000005, 0.00878175] True True
{'name': 'Algorithm_MEMCPY', 'type': 'function'} Algorithm_MEMCPY 2.008037e+09 0.997907 1.982438e+09 0.990401 2.001818e+09 0.996143 1.997560e+09 0.995425 9.221915e+13 5.530862e-06 9.603080e+06 0.002352 [1988997772.0, 2001817999.5, 2004877745.25] [0.99408025, 0.9961425, 0.9970844999999999] True True
{'name': 'Algorithm_MEMSET', 'type': 'function'} Algorithm_MEMSET 2.036565e+09 0.997923 2.006252e+09 0.988505 2.018832e+09 0.993871 2.020861e+09 0.993798 8.949541e+13 9.666489e-06 9.460201e+06 0.003109 [2014797196.0, 2018832431.0, 2027420716.75] [0.99133675, 0.993871, 0.9959795] True True
{'name': 'Algorithm_REDUCE_SUM', 'type': 'function'} Algorithm_REDUCE_SUM 4.511030e+08 0.996756 4.467119e+08 0.954967 4.498193e+08 0.990938 4.492754e+08 0.981222 2.442450e+12 2.613859e-04 1.562834e+06 0.016167 [448020898.75, 449819291.0, 450391779.5] [0.9703815, 0.990938, 0.99332575] True False

Multi-Indexed Thicket Example Example will show how to pass a columnar joined thicket object. When passing a columnar joined thicket object, the columns argument will now take a list of tuples. Each tuple will consist of two elements. The first element will always be the column index, and the second element will be an associated column under the column index you passed.

  • Example: (column_index, column_name) -> (“GCC”, “Machine clears”)

[35]:
metrics = [("Clang", "time (exc)"), ("GCC", "Machine clears")]
[36]:
th.check_normality(combined_th, columns=metrics)
combined_th.statsframe.dataframe.head(5)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/scipy/stats/_axis_nan_policy.py:531: UserWarning: scipy.stats.shapiro: Input data has range zero. The results may not be accurate.
  res = hypotest_fun_out(*samples, **kwds)
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
/opt/conda/lib/python3.9/site-packages/thicket/stats/check_normality.py:76: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`
  pvalue = df[(idx, column)][i].pvalue
[36]:
Clang GCC name
time (exc)_max time (exc)_mean time (exc)_median time (exc)_min time (exc)_normality time (exc)_percentiles time (exc)_std time (exc)_var Machine clears_max Machine clears_mean Machine clears_median Machine clears_min Machine clears_normality Machine clears_percentiles Machine clears_std Machine clears_var
node
{'name': 'RAJAPerf', 'type': 'function'} 4.922397e+06 4.788171e+06 4.792514e+06 4.696939e+06 True [4723135.0, 4792513.5, 4834294.25] 7.294195e+04 5.320529e+09 0.004523 0.002853 0.003061 0.001071 True [0.0018989999999999999, 0.0030615, 0.00361175] 0.001155 0.000001 RAJAPerf
{'name': 'Algorithm', 'type': 'function'} 5.576280e+05 5.383793e+05 5.386245e+05 5.176070e+05 True [533120.25, 538624.5, 545153.5] 1.331629e+04 1.773236e+08 0.014205 0.005249 0.004810 0.000000 True [0.00244575, 0.00481, 0.006431] 0.004414 0.000019 Algorithm
{'name': 'Algorithm_MEMCPY', 'type': 'function'} 2.008037e+09 1.997560e+09 2.001818e+09 1.982438e+09 True [1988997772.0, 2001817999.5, 2004877745.25] 9.603080e+06 9.221915e+13 0.992988 0.978926 0.984356 0.956393 True [0.968337, 0.984356, 0.9885772500000001] 0.012691 0.000161 Algorithm_MEMCPY
{'name': 'Algorithm_MEMSET', 'type': 'function'} 2.036565e+09 2.020861e+09 2.018832e+09 2.006252e+09 True [2014797196.0, 2018832431.0, 2027420716.75] 9.460201e+06 8.949541e+13 0.997550 0.990934 0.991464 0.980433 True [0.98897875, 0.991464, 0.9943077499999999] 0.005403 0.000029 Algorithm_MEMSET
{'name': 'Algorithm_REDUCE_SUM', 'type': 'function'} 4.511030e+08 4.492754e+08 4.498193e+08 4.467119e+08 True [448020898.75, 449819291.0, 450391779.5] 1.562834e+06 2.442450e+12 0.994624 0.922818 0.925987 0.770469 True [0.8846215, 0.9259875, 0.987635] 0.072369 0.005237 Algorithm_REDUCE_SUM

5.9 Nodewise Correlation

The correlation_nodewise function will perform nodewise correlation for each node in the performance data table.

The correlation values will be appended to the aggregated statistics table and will be denoted with correlation type where correlation type can be {pearson, spearman, kendall}.

When working with a multi-indexed thicket (columnar join) a new column index will be created titled: Union statistics. See the Multi-Indexed Thicket Example to see the implementation of this.

Single Index Thicket Example

[37]:
th.correlation_nodewise(
    clang_th,
    column1="time (exc)",
    column2="Machine clears",
    correlation="spearman"
)
[38]:
clang_th.statsframe.dataframe.head(5)
[38]:
name time (exc)_max Machine clears_max time (exc)_min Machine clears_min time (exc)_median Machine clears_median time (exc)_mean Machine clears_mean time (exc)_var Machine clears_var time (exc)_std Machine clears_std time (exc)_percentiles Machine clears_percentiles time (exc)_normality Machine clears_normality time (exc)_vs_Machine clears spearman
node
{'name': 'RAJAPerf', 'type': 'function'} RAJAPerf 4.922397e+06 0.003932 4.696939e+06 0.001099 4.792514e+06 0.002209 4.788171e+06 0.002266 5.320529e+09 9.199162e-07 7.294195e+04 0.000959 [4723135.0, 4792513.5, 4834294.25] [0.00157425, 0.002209, 0.002657] True True 0.503030
{'name': 'Algorithm', 'type': 'function'} Algorithm 5.576280e+05 0.019851 5.176070e+05 0.000000 5.386245e+05 0.004722 5.383793e+05 0.007061 1.773236e+08 4.328011e-05 1.331629e+04 0.006579 [533120.25, 538624.5, 545153.5] [0.0025005, 0.0047220000000000005, 0.00878175] True True -0.660606
{'name': 'Algorithm_MEMCPY', 'type': 'function'} Algorithm_MEMCPY 2.008037e+09 0.997907 1.982438e+09 0.990401 2.001818e+09 0.996143 1.997560e+09 0.995425 9.221915e+13 5.530862e-06 9.603080e+06 0.002352 [1988997772.0, 2001817999.5, 2004877745.25] [0.99408025, 0.9961425, 0.9970844999999999] True True 0.078788
{'name': 'Algorithm_MEMSET', 'type': 'function'} Algorithm_MEMSET 2.036565e+09 0.997923 2.006252e+09 0.988505 2.018832e+09 0.993871 2.020861e+09 0.993798 8.949541e+13 9.666489e-06 9.460201e+06 0.003109 [2014797196.0, 2018832431.0, 2027420716.75] [0.99133675, 0.993871, 0.9959795] True True 0.054545
{'name': 'Algorithm_REDUCE_SUM', 'type': 'function'} Algorithm_REDUCE_SUM 4.511030e+08 0.996756 4.467119e+08 0.954967 4.498193e+08 0.990938 4.492754e+08 0.981222 2.442450e+12 2.613859e-04 1.562834e+06 0.016167 [448020898.75, 449819291.0, 450391779.5] [0.9703815, 0.990938, 0.99332575] True False -0.345455

Multi-Indexed Thicket Example

Example will show how to pass a columnar joined thicket object. When passing a columnar joined thicket object, the columns argument will now take a list of tuples. Each tuple will consist of two elements. The first element will always be the column index, and the second element will be an associated column under the column index you passed.

  • Example: (column_index, column_name) -> (“GCC”, “Machine clears”)

[39]:
th.correlation_nodewise(
    combined_th,
    column1=("Clang", "time (exc)"),
    column2=("GCC", "Machine clears"),
    correlation="spearman"
)
[40]:
combined_th.statsframe.dataframe.head(5)
[40]:
Clang GCC Union statistics name
time (exc)_max time (exc)_mean time (exc)_median time (exc)_min time (exc)_normality time (exc)_percentiles time (exc)_std time (exc)_var Machine clears_max Machine clears_mean Machine clears_median Machine clears_min Machine clears_normality Machine clears_percentiles Machine clears_std Machine clears_var time (exc)_vs_Machine clears spearman
node
{'name': 'RAJAPerf', 'type': 'function'} 4.922397e+06 4.788171e+06 4.792514e+06 4.696939e+06 True [4723135.0, 4792513.5, 4834294.25] 7.294195e+04 5.320529e+09 0.004523 0.002853 0.003061 0.001071 True [0.0018989999999999999, 0.0030615, 0.00361175] 0.001155 0.000001 -0.030303 RAJAPerf
{'name': 'Algorithm', 'type': 'function'} 5.576280e+05 5.383793e+05 5.386245e+05 5.176070e+05 True [533120.25, 538624.5, 545153.5] 1.331629e+04 1.773236e+08 0.014205 0.005249 0.004810 0.000000 True [0.00244575, 0.00481, 0.006431] 0.004414 0.000019 0.158055 Algorithm
{'name': 'Algorithm_MEMCPY', 'type': 'function'} 2.008037e+09 1.997560e+09 2.001818e+09 1.982438e+09 True [1988997772.0, 2001817999.5, 2004877745.25] 9.603080e+06 9.221915e+13 0.992988 0.978926 0.984356 0.956393 True [0.968337, 0.984356, 0.9885772500000001] 0.012691 0.000161 -0.381818 Algorithm_MEMCPY
{'name': 'Algorithm_MEMSET', 'type': 'function'} 2.036565e+09 2.020861e+09 2.018832e+09 2.006252e+09 True [2014797196.0, 2018832431.0, 2027420716.75] 9.460201e+06 8.949541e+13 0.997550 0.990934 0.991464 0.980433 True [0.98897875, 0.991464, 0.9943077499999999] 0.005403 0.000029 0.066667 Algorithm_MEMSET
{'name': 'Algorithm_REDUCE_SUM', 'type': 'function'} 4.511030e+08 4.492754e+08 4.498193e+08 4.467119e+08 True [448020898.75, 449819291.0, 450391779.5] 1.562834e+06 2.442450e+12 0.994624 0.922818 0.925987 0.770469 True [0.8846215, 0.9259875, 0.987635] 0.072369 0.005237 -0.030303 Algorithm_REDUCE_SUM

5.10 Calculate Boxplot

The calc_boxplot_statistics function will calculate a boxplots {q1, q2, q3, iqr, lowerfence, upperfence} for each node in the performance data table.

Each column will have the values: {q1,q2,q3,iqr,lowerfence, upperfence} calculated. The appended columns to the aggregated statistics table will be denoted with either col + {_q1, _q2, _q3,_iqr, _lowerfence, _upperfence}.

Lastly, calc_boxplot_statistics will calculate outliers as well. The outliers will be appended to the aggregated statistics table and denoted with _outliers at the end of the column name i.e. column_outliers.

Single Indexed Thicket

[41]:
metrics = ["time (exc)", "Machine clears"]
[42]:
th.calc_boxplot_statistics(clang_th, columns=metrics)
clang_th.statsframe.dataframe.head(5)
[42]:
name time (exc)_max Machine clears_max time (exc)_min Machine clears_min time (exc)_median Machine clears_median time (exc)_mean Machine clears_mean time (exc)_var Machine clears_var time (exc)_std Machine clears_std time (exc)_percentiles Machine clears_percentiles time (exc)_normality Machine clears_normality time (exc)_vs_Machine clears spearman time (exc)_q1(0.25, 0.5, 0.75) time (exc)_q2(0.25, 0.5, 0.75) time (exc)_q3(0.25, 0.5, 0.75) time (exc)_iqr(0.25, 0.5, 0.75) time (exc)_lowerfence(0.25, 0.5, 0.75) time (exc)_upperfence(0.25, 0.5, 0.75) time (exc)_outliers(0.25, 0.5, 0.75) Machine clears_q1(0.25, 0.5, 0.75) Machine clears_q2(0.25, 0.5, 0.75) Machine clears_q3(0.25, 0.5, 0.75) Machine clears_iqr(0.25, 0.5, 0.75) Machine clears_lowerfence(0.25, 0.5, 0.75) Machine clears_upperfence(0.25, 0.5, 0.75) Machine clears_outliers(0.25, 0.5, 0.75)
node
{'name': 'RAJAPerf', 'type': 'function'} RAJAPerf 4.922397e+06 0.003932 4.696939e+06 0.001099 4.792514e+06 0.002209 4.788171e+06 0.002266 5.320529e+09 9.199162e-07 7.294195e+04 0.000959 [4723135.0, 4792513.5, 4834294.25] [0.00157425, 0.002209, 0.002657] True True 0.503030 4.723135e+06 4.792514e+06 4.834294e+06 111159.25 4.556396e+06 5.001033e+06 [] 0.001574 0.002209 0.002657 0.001083 -0.000050 0.004281 []
{'name': 'Algorithm', 'type': 'function'} Algorithm 5.576280e+05 0.019851 5.176070e+05 0.000000 5.386245e+05 0.004722 5.383793e+05 0.007061 1.773236e+08 4.328011e-05 1.331629e+04 0.006579 [533120.25, 538624.5, 545153.5] [0.0025005, 0.0047220000000000005, 0.00878175] True True -0.660606 5.331202e+05 5.386245e+05 5.451535e+05 12033.25 5.150704e+05 5.632034e+05 [] 0.002501 0.004722 0.008782 0.006281 -0.006921 0.018204 [2507715123]
{'name': 'Algorithm_MEMCPY', 'type': 'function'} Algorithm_MEMCPY 2.008037e+09 0.997907 1.982438e+09 0.990401 2.001818e+09 0.996143 1.997560e+09 0.995425 9.221915e+13 5.530862e-06 9.603080e+06 0.002352 [1988997772.0, 2001817999.5, 2004877745.25] [0.99408025, 0.9961425, 0.9970844999999999] True True 0.078788 1.988998e+09 2.001818e+09 2.004878e+09 15879973.25 1.965178e+09 2.028698e+09 [] 0.994080 0.996143 0.997084 0.003004 0.989574 1.001591 []
{'name': 'Algorithm_MEMSET', 'type': 'function'} Algorithm_MEMSET 2.036565e+09 0.997923 2.006252e+09 0.988505 2.018832e+09 0.993871 2.020861e+09 0.993798 8.949541e+13 9.666489e-06 9.460201e+06 0.003109 [2014797196.0, 2018832431.0, 2027420716.75] [0.99133675, 0.993871, 0.9959795] True True 0.054545 2.014797e+09 2.018832e+09 2.027421e+09 12623520.75 1.995862e+09 2.046356e+09 [] 0.991337 0.993871 0.995980 0.004643 0.984373 1.002944 []
{'name': 'Algorithm_REDUCE_SUM', 'type': 'function'} Algorithm_REDUCE_SUM 4.511030e+08 0.996756 4.467119e+08 0.954967 4.498193e+08 0.990938 4.492754e+08 0.981222 2.442450e+12 2.613859e-04 1.562834e+06 0.016167 [448020898.75, 449819291.0, 450391779.5] [0.9703815, 0.990938, 0.99332575] True False -0.345455 4.480209e+08 4.498193e+08 4.503918e+08 2370880.75 4.444646e+08 4.539481e+08 [] 0.970382 0.990938 0.993326 0.022944 0.935965 1.027742 []

Multi-indexed Thicket

Example will show how to pass a columnar joined thicket object. When passing a columnar joined thicket object, the columns argument will now take a list of tuples. Each tuple will consist of two elements. The first element will always be the column index, and the second element will be an associated column under the column index you passed.

  • Example: (column_index, column_name) -> (“GCC”, “Machine clears”)

[43]:
metrics = [("Clang", "time (exc)"), ("GCC", "Machine clears")]
[44]:
th.calc_boxplot_statistics(combined_th, columns=metrics)
combined_th.statsframe.dataframe.head(5)
[44]:
Clang GCC Union statistics name
time (exc)_iqr(0.25, 0.5, 0.75) time (exc)_lowerfence(0.25, 0.5, 0.75) time (exc)_max time (exc)_mean time (exc)_median time (exc)_min time (exc)_normality time (exc)_outliers(0.25, 0.5, 0.75) time (exc)_percentiles time (exc)_q1(0.25, 0.5, 0.75) time (exc)_q2(0.25, 0.5, 0.75) time (exc)_q3(0.25, 0.5, 0.75) time (exc)_std time (exc)_upperfence(0.25, 0.5, 0.75) time (exc)_var Machine clears_iqr(0.25, 0.5, 0.75) Machine clears_lowerfence(0.25, 0.5, 0.75) Machine clears_max Machine clears_mean Machine clears_median Machine clears_min Machine clears_normality Machine clears_outliers(0.25, 0.5, 0.75) Machine clears_percentiles Machine clears_q1(0.25, 0.5, 0.75) Machine clears_q2(0.25, 0.5, 0.75) Machine clears_q3(0.25, 0.5, 0.75) Machine clears_std Machine clears_upperfence(0.25, 0.5, 0.75) Machine clears_var time (exc)_vs_Machine clears spearman
node
{'name': 'RAJAPerf', 'type': 'function'} 111159.25 4.556396e+06 4.922397e+06 4.788171e+06 4.792514e+06 4.696939e+06 True [] [4723135.0, 4792513.5, 4834294.25] 4.723135e+06 4.792514e+06 4.834294e+06 7.294195e+04 5.001033e+06 5.320529e+09 0.001713 -0.000670 0.004523 0.002853 0.003061 0.001071 True [] [0.0018989999999999999, 0.0030615, 0.00361175] 0.001899 0.003061 0.003612 0.001155 0.006181 0.000001 -0.030303 RAJAPerf
{'name': 'Algorithm', 'type': 'function'} 12033.25 5.150704e+05 5.576280e+05 5.383793e+05 5.386245e+05 5.176070e+05 True [] [533120.25, 538624.5, 545153.5] 5.331202e+05 5.386245e+05 5.451535e+05 1.331629e+04 5.632034e+05 1.773236e+08 0.003985 -0.003532 0.014205 0.005249 0.004810 0.000000 True [6] [0.00244575, 0.00481, 0.006431] 0.002446 0.004810 0.006431 0.004414 0.012409 0.000019 0.158055 Algorithm
{'name': 'Algorithm_MEMCPY', 'type': 'function'} 15879973.25 1.965178e+09 2.008037e+09 1.997560e+09 2.001818e+09 1.982438e+09 True [] [1988997772.0, 2001817999.5, 2004877745.25] 1.988998e+09 2.001818e+09 2.004878e+09 9.603080e+06 2.028698e+09 9.221915e+13 0.020240 0.937977 0.992988 0.978926 0.984356 0.956393 True [] [0.968337, 0.984356, 0.9885772500000001] 0.968337 0.984356 0.988577 0.012691 1.018938 0.000161 -0.381818 Algorithm_MEMCPY
{'name': 'Algorithm_MEMSET', 'type': 'function'} 12623520.75 1.995862e+09 2.036565e+09 2.020861e+09 2.018832e+09 2.006252e+09 True [] [2014797196.0, 2018832431.0, 2027420716.75] 2.014797e+09 2.018832e+09 2.027421e+09 9.460201e+06 2.046356e+09 8.949541e+13 0.005329 0.980985 0.997550 0.990934 0.991464 0.980433 True [8] [0.98897875, 0.991464, 0.9943077499999999] 0.988979 0.991464 0.994308 0.005403 1.002301 0.000029 0.066667 Algorithm_MEMSET
{'name': 'Algorithm_REDUCE_SUM', 'type': 'function'} 2370880.75 4.444646e+08 4.511030e+08 4.492754e+08 4.498193e+08 4.467119e+08 True [] [448020898.75, 449819291.0, 450391779.5] 4.480209e+08 4.498193e+08 4.503918e+08 1.562834e+06 4.539481e+08 2.442450e+12 0.103014 0.730101 0.994624 0.922818 0.925987 0.770469 True [] [0.8846215, 0.9259875, 0.987635] 0.884621 0.925987 0.987635 0.072369 1.142155 0.005237 -0.030303 Algorithm_REDUCE_SUM

6. Visualization Thicket Functions

6.1 Displaying Heatmap

The display_heatmap function will display a color encoded map with the color representing the magnitude of the value for that specific node and column cell.

Columns must be from the aggregated statistics table.

Single Index Thicket Example

[45]:
# filter nodes to first five entries in the aggregated statistics table
stats_nodes = [
    "Base_Seq",
    "Algorithm",
    "Algorithm_MEMCPY",
]
th_stats_name = clang_th.filter_stats(lambda x: x["name"] in stats_nodes)
[46]:
plt.figure(figsize=(30, 30))
metrics = ["time (exc)_std", "time (exc)_var"]
th.display_heatmap(th_stats_name, columns=metrics)
[46]:
<Axes: ylabel='node'>
_images/stats-functions_84_1.png

Multi-Indexed Thicket Example

Example will show how to pass a columnar joined thicket object. When passing a columnar joined thicket object, the columns argument will now take a list of tuples. Each tuple will consist of two elements. The first element will always be the column index, and the second element will be an associated column under the column index you passed.

  • Example: (column_index, column_name) -> (“GCC”, “Machine clears”)

[47]:
plt.figure(figsize=(30, 30))
metrics = [("Clang", "time (exc)_std"), ("Clang", "time (exc)_var")]
th.display_heatmap(combined_th, columns=metrics)
[47]:
<Axes: title={'center': 'Clang'}, ylabel='node'>
_images/stats-functions_86_1.png

Example of Not Passing the Same Column Index for Multi-Indexed Thicket

[48]:
#metrics = [("Clang", "time (exc)_std"), ("GCC", "Machine clears_var")]
#th.display_heatmap(combined_th, columns=metrics)

6.2 Displaying Histogram

The display_histogram function will display a histogram for a user passed node and columns. Node and column must come from the performance data table.

A histogram allows for a user to see outliers and the overall distribution of their data.

[49]:
# Getting nodes to pass
n = pd.unique(combined_th.dataframe.reset_index()["node"])[4]

Single Index Thicket Example

[50]:
plt.figure(figsize=(30, 30))
th.display_histogram(
    clang_th,
    node=n,
    column="Machine clears"
)
[50]:
<seaborn.axisgrid.FacetGrid at 0xffff4a17f970>
<Figure size 2160x2160 with 0 Axes>
_images/stats-functions_92_2.png

Multi-Indexed Thicket Example

Example will show how to pass a columnar joined thicket object. When passing a columnar joined thicket object, the columns argument will now take a list of tuples. Each tuple will consist of two elements. The first element will always be the column index, and the second element will be an associated column under the column index you passed.

  • Example: (column_index, column_name) -> (“GCC”, “Machine clears”)

[51]:
plt.figure(figsize=(30, 30))
th.display_histogram(
    combined_th,
    node=n,
    column=("Clang", "Machine clears")
)
[51]:
<seaborn.axisgrid.FacetGrid at 0xffff4c6bd730>
<Figure size 2160x2160 with 0 Axes>
_images/stats-functions_94_2.png

Example of Error if Not Passing a Hatchet Node

[52]:
# n = "not_hatchet_node"
# th.display_histogram(
#     combined_th,
#     node=n,
#     column=("Clang", "Machine clears")
# )

6.3 Displaying Boxplot

The display_boxplot function will display a boxplot for each passed in node(s) and column(s). The passed nodes and columns must be from the performance data table.

[53]:
# Getting nodes to pass
n = pd.unique(combined_th.dataframe.reset_index()["node"])[0:2].tolist()

Single Index Thicket Example

[54]:
plt.figure(figsize=(30, 30))
th.display_boxplot(
    clang_th,
    nodes=n,
    columns=["Machine clears", "Frontend latency"]
)
[54]:
<Axes: xlabel='node', ylabel=' '>
_images/stats-functions_100_1.png

Multi-Indexed Thicket Example

Example will show how to pass a columnar joined thicket object. When passing a columnar joined thicket object, the columns argument will now take a list of tuples. Each tuple will consist of two elements. The first element will always be the column index, and the second element will be an associated column under the column index you passed.

  • Example: (column_index, column_name) -> (“GCC”, “Machine clears”)

[55]:
plt.figure(figsize=(30, 30))
th.display_boxplot(
    combined_th,
    nodes=n,
    columns=[("Clang", "time (exc)"), ("Clang", "Machine clears")]
)
[55]:
<Axes: xlabel='node', ylabel=' '>
_images/stats-functions_102_1.png

Example of Error if Not Passing Same Column Index

[56]:
# th.display_boxplot(
#     combined_th,
#     nodes=n,
#     columns=[("Clang", "time (exc)"), ("GCC", "Machine clears")]
# )