Skip to content

histogram labels: bucket names repeat when the range is narrow next to its magnitude (years read 2K–2K) #1081

Open

Description

@paddymul

Problem

fmt_num (histogram.py:19) picks an SI suffix from the largest bound and, after scaling, caps the decimals at 2 (line 30). A column whose spread is small next to its magnitude gets bucket names that repeat: years from 1990 to 2020 read 1.99K–1.99K, 2K–2K (three buckets) and 2.01K–2.01K, integers from 1,000,000 to 1,000,099 read 1M–1M for all twelve bars, and epoch seconds read 1.7B–1.7B. The plain branch caps at 6 decimals (line 33), which is #620's 0–0 for small numbers. pandas, polars and xorq all label with fmt_num.

The suffix stops at T, so a value above 1e15 prints every digit: a 1e30 fill value labels its tail 99–1000000000000000000T, and 1e308 makes a 300-character label. Separately, a bound of -0.5 rounded to 0 decimals keeps its sign, so an int8 column has buckets named -25<>-0 and -0<>24.

import pandas as pd
from buckaroo.customizations.histogram import fmt_tail_bucket
from buckaroo.customizations.pd_stats_v2 import PD_ANALYSIS_V2
from buckaroo.pluggable_analysis_framework.stat_pipeline import StatPipeline

def names(values):
    sd, _ = StatPipeline(PD_ANALYSIS_V2, unit_test=False).process_df(pd.DataFrame({"a": values}))
    return [b["name"] for b in sd["a"]["histogram"]]

print(names(list(range(1990, 2021)) * 10))
# ['1.99K–1.99K', '1.99K–1.99K', '1.99K–2K', '2K–2K', '2K–2K', '2K–2K', '2K–2.01K', '2.01K–2.01K', ...]
print(names([1_000_000 + i for i in range(100)]))
# ['1M–1M', '1M–1M', '1M–1M', ...]
print(fmt_tail_bucket(99.0, 1e30, 9.6))
# 99–1000000000000000000T

Suggested fix

Choose the decimals from the bucket width at the scale shown, so neighbouring edges differ. Skip the SI suffix when the width is small next to the magnitude (years would read 1990–1993). Switch to scientific notation past T.

Context

Found while probing histogram edge cases after #1069. Reproduces on main at e88ace9.

Activity

  1. paddymul commented on Oct 7, 2026

    @paddymul
    CollaboratorAuthor

    Probe script for this issue. Save it as probe_1081.py in a buckaroo checkout and run uv run python probe_1081.py. The output below is from main at e88ace9. Each case prints the histogram from pandas (pd), polars (pl) and xorq (xo): the bar kinds, the sum of the population bars, the sum of the categorical bars and the NA bar, then each bar as name:kind=value, and below that the histogram_bins range, min, max, nan_per and distinct_count.

    probe_1081.py
    """Histogram probe: runs columns through the pandas, polars and xorq stat pipelines and prints each histogram.
    
    Each line is [bar kinds, population sum, categorical sum, NA, duplicate names] then the bars as name:kind=value.
    """
    import logging
    import warnings
    from collections import Counter
    
    logging.disable(logging.CRITICAL)
    warnings.filterwarnings('ignore')
    
    import numpy as np
    import pandas as pd
    import polars as pl
    import pyarrow as pa
    import xorq.api as xo
    
    from buckaroo.customizations.pd_stats_v2 import PD_ANALYSIS_V2
    from buckaroo.customizations.pl_stats_v2 import PL_ANALYSIS_V2
    from buckaroo.customizations.xorq_stats_v2 import XORQ_STATS_V2
    from buckaroo.pluggable_analysis_framework.stat_pipeline import StatPipeline
    from buckaroo.pluggable_analysis_framework.xorq_stat_pipeline import XorqStatPipeline
    
    rng = np.random.default_rng(0)
    
    
    def summarize(h):
        if not isinstance(h, list):
            return f'NOT-A-LIST {type(h).__name__}'
        if len(h) == 0:
            return 'EMPTY'
        kinds = Counter(k for b in h for k in b if k != 'name')
        parts = []
        for b in h:
            k = next((k for k in b if k != 'name'), '?')
            v = b.get(k)
            parts.append(f"{b['name']}:{k[:3]}={v:g}" if isinstance(v, (int, float, np.number)) else f"{b['name']}:{k}={v}")
        dups = [n for n, c in Counter(b['name'] for b in h).items() if c > 1]
        pop = sum(b.get('population', 0) for b in h)
        cat = sum(b.get(k, 0) for b in h for k in ('cat_pop', 'unique', 'longtail'))
        na = sum(b.get('NA', 0) for b in h)
        return f"[{dict(kinds)} pop={pop:g} cat={cat:g} NA={na:g}{' DUPNAMES=' + str(dups) if dups else ''}] " + ' | '.join(parts)
    
    
    def bins_s(b):
        if not b:
            return 'bins=[]'
        arr = np.asarray(b, dtype=float)
        return f'bins={len(b)} [{arr[0]:.6g}..{arr[-1]:.6g}]' + ('' if np.isfinite(arr).all() else ' NONFINITE')
    
    
    def run(backend, values, pd_dtype=None, pl_dtype=None, pa_type=None):
        if backend == 'pd':
            sd, errs = StatPipeline(PD_ANALYSIS_V2, unit_test=False).process_df(pd.DataFrame({'a': pd.Series(values, dtype=pd_dtype)}))
        elif backend == 'pl':
            sd, errs = StatPipeline(PL_ANALYSIS_V2, unit_test=False).process_df(pl.DataFrame({'a': pl.Series('a', values, dtype=pl_dtype, strict=False)}))
        else:
            table = xo.memtable(pa.table({'a': pa.array(values, type=pa_type)}), name='t')
            sd, errs = XorqStatPipeline(XORQ_STATS_V2, unit_test=False).process_table(table)
        return sd.get('a', {}), sorted({f'{e.stat_key}:{type(e.error).__name__}' for e in errs})
    
    
    def case(name, values, pd_dtype=None, pl_dtype=None, pa_type=None, backends=('pd', 'pl', 'xo')):
        print(f'\n### {name}')
        for b in backends:
            try:
                c, errs = run(b, values, pd_dtype, pl_dtype, pa_type)
            except Exception as e:
                print(f'  {b}: RAISED {type(e).__name__}: {str(e)[:150]}')
                continue
            print(f"  {b}: {summarize(c.get('histogram'))}")
            print(f"      {bins_s(c.get('histogram_bins'))} min={c.get('min')!r:.30} max={c.get('max')!r:.30} "
                  f"nan_per={c.get('nan_per')} distinct={c.get('distinct_count')}" + (f' ERRS={errs}' if errs else ''))
    
    case('years 1990..2020', list(range(1990, 2021)) * 10, pa_type=pa.int64())
    case('offset 1,000,000 + 0..99', [1_000_000 + i for i in range(100)], pa_type=pa.int64())
    case('epoch seconds, a minute apart', [1_704_067_200 + 60 * i for i in range(100)], pa_type=pa.int64())
    case('epoch ns, an hour apart', [1_704_067_200_000_000_000 + 3_600_000_000_000 * i for i in range(100)], pa_type=pa.int64())
    case('1e15..1e16', [1e15 + i * 1e14 for i in range(100)], pa_type=pa.float64())
    case('1e30 fill value beside 0..99', [float(i) for i in range(100)] + [1e30], pa_type=pa.float64())
    case('+-1e308 beside 0..99', [-1e308, 1e308] + [float(i) for i in range(100)], pa_type=pa.float64())
    case('tiny i*1e-9 (#620)', [i * 1e-9 for i in range(100)], pa_type=pa.float64())
    case('int8 -128..127 (the -0 bounds)', list(range(-128, 128)), pd_dtype='int8', pl_dtype=pl.Int8, pa_type=pa.int8())
    Output at e88ace9
    ### years 1990..2020
      pd: [{'tail': 2, 'population': 10} pop=97 cat=0 NA=0 DUPNAMES=['1.99K–1.99K', '2K–2K', '2.01K–2.01K', '2.02K–2.02K']] 1.99K–1.99K:tai=1 | 1.99K–1.99K:pop=10 | 1.99K–2K:pop=10 | 2K–2K:pop=10 | 2K–2K:pop=10 | 2K–2K:pop=7 | 2K–2.01K:pop=10 | 2.01K–2.01K:pop=10 | 2.01K–2.01K:pop=10 | 2.01K–2.02K:pop=10 | 2.02K–2.02K:pop=10 | 2.02K–2.02K:tai=1
          bins=11 [1991..2019] min=np.int64(1990) max=np.int64(2020) nan_per=0.0 distinct=31
      pl: [{'tail': 2, 'population': 10} pop=97 cat=0 NA=0 DUPNAMES=['1.99K–1.99K', '2K–2K', '2.01K–2.01K', '2.02K–2.02K']] 1.99K–1.99K:tai=1 | 1.99K–1.99K:pop=10 | 1.99K–2K:pop=10 | 2K–2K:pop=10 | 2K–2K:pop=10 | 2K–2K:pop=7 | 2K–2.01K:pop=10 | 2.01K–2.01K:pop=10 | 2.01K–2.01K:pop=10 | 2.01K–2.02K:pop=10 | 2.02K–2.02K:pop=10 | 2.02K–2.02K:tai=1
          bins=11 [1991..2019] min=1990 max=2020 nan_per=0.0 distinct=31
      xo: [{'population': 10} pop=100.2 cat=0 NA=0 DUPNAMES=['2K–2K', '2.01K–2.01K']] 1.99K–1.99K:pop=9.7 | 1.99K–2K:pop=9.7 | 2K–2K:pop=9.7 | 2K–2K:pop=9.7 | 2K–2K:pop=9.7 | 2K–2.01K:pop=9.7 | 2.01K–2.01K:pop=9.7 | 2.01K–2.01K:pop=9.7 | 2.01K–2.02K:pop=9.7 | 2.02K–2.02K:pop=12.9
          bins=11 [1990..2020] min=1990 max=2020 nan_per=0.0 distinct=31
    
    ### offset 1,000,000 + 0..99
      pd: [{'tail': 2, 'population': 10} pop=98 cat=0 NA=0 DUPNAMES=['1M–1M']] 1M–1M:tai=1 | 1M–1M:pop=10 | 1M–1M:pop=10 | 1M–1M:pop=10 | 1M–1M:pop=9 | 1M–1M:pop=10 | 1M–1M:pop=10 | 1M–1M:pop=9 | 1M–1M:pop=10 | 1M–1M:pop=10 | 1M–1M:pop=10 | 1M–1M:tai=1
          bins=11 [1e+06..1.0001e+06] min=np.int64(1000000) max=np.int64(1000099) nan_per=0.0 distinct=100
      pl: [{'tail': 2, 'population': 10} pop=96 cat=0 NA=0 DUPNAMES=['1M–1M']] 1M–1M:tai=1 | 1M–1M:pop=10 | 1M–1M:pop=9 | 1M–1M:pop=10 | 1M–1M:pop=9 | 1M–1M:pop=10 | 1M–1M:pop=9 | 1M–1M:pop=10 | 1M–1M:pop=9 | 1M–1M:pop=10 | 1M–1M:pop=10 | 1M–1M:tai=1
          bins=11 [1e+06..1.0001e+06] min=1000000 max=1000099 nan_per=0.0 distinct=100
      xo: [{'population': 10} pop=100 cat=0 NA=0 DUPNAMES=['1M–1M']] 1M–1M:pop=10 | 1M–1M:pop=10 | 1M–1M:pop=10 | 1M–1M:pop=10 | 1M–1M:pop=10 | 1M–1M:pop=10 | 1M–1M:pop=10 | 1M–1M:pop=10 | 1M–1M:pop=10 | 1M–1M:pop=10
          bins=11 [1e+06..1.0001e+06] min=1000000 max=1000099 nan_per=0.0 distinct=100
    
    ### epoch seconds, a minute apart
      pd: [{'tail': 2, 'population': 10} pop=98 cat=0 NA=0 DUPNAMES=['1.7B–1.7B']] 1.7B–1.7B:tai=1 | 1.7B–1.7B:pop=10 | 1.7B–1.7B:pop=10 | 1.7B–1.7B:pop=10 | 1.7B–1.7B:pop=9 | 1.7B–1.7B:pop=10 | 1.7B–1.7B:pop=10 | 1.7B–1.7B:pop=9 | 1.7B–1.7B:pop=10 | 1.7B–1.7B:pop=10 | 1.7B–1.7B:pop=10 | 1.7B–1.7B:tai=1
          bins=11 [1.70407e+09..1.70407e+09] min=np.int64(1704067200) max=np.int64(1704073140) nan_per=0.0 distinct=100
      pl: [{'tail': 2, 'population': 10} pop=96 cat=0 NA=0 DUPNAMES=['1.7B–1.7B']] 1.7B–1.7B:tai=1 | 1.7B–1.7B:pop=10 | 1.7B–1.7B:pop=9 | 1.7B–1.7B:pop=10 | 1.7B–1.7B:pop=9 | 1.7B–1.7B:pop=10 | 1.7B–1.7B:pop=9 | 1.7B–1.7B:pop=10 | 1.7B–1.7B:pop=9 | 1.7B–1.7B:pop=10 | 1.7B–1.7B:pop=10 | 1.7B–1.7B:tai=1
          bins=11 [1.70407e+09..1.70407e+09] min=1704067200 max=1704073140 nan_per=0.0 distinct=100
      xo: [{'population': 10} pop=100 cat=0 NA=0 DUPNAMES=['1.7B–1.7B']] 1.7B–1.7B:pop=10 | 1.7B–1.7B:pop=10 | 1.7B–1.7B:pop=10 | 1.7B–1.7B:pop=10 | 1.7B–1.7B:pop=10 | 1.7B–1.7B:pop=10 | 1.7B–1.7B:pop=10 | 1.7B–1.7B:pop=10 | 1.7B–1.7B:pop=10 | 1.7B–1.7B:pop=10
          bins=11 [1.70407e+09..1.70407e+09] min=1704067200 max=1704073140 nan_per=0.0 distinct=100
    
    ### epoch ns, an hour apart
      pd: [{'tail': 2, 'population': 10} pop=98 cat=0 NA=0] 1704067T–1704071T:tai=1 | 1704071T–1704106T:pop=10 | 1704106T–1704141T:pop=10 | 1704141T–1704176T:pop=10 | 1704176T–1704210T:pop=9 | 1704210T–1704245T:pop=10 | 1704245T–1704280T:pop=10 | 1704280T–1704315T:pop=9 | 1704315T–1704350T:pop=10 | 1704350T–1704385T:pop=10 | 1704385T–1704420T:pop=10 | 1704420T–1704424T:tai=1
          bins=11 [1.70407e+18..1.70442e+18] min=np.int64(1704067200000000000) max=np.int64(1704423600000000000) nan_per=0.0 distinct=100
      pl: [{'tail': 2, 'population': 10} pop=96 cat=0 NA=0] 1704067T–1704071T:tai=1 | 1704074T–1704109T:pop=10 | 1704109T–1704143T:pop=9 | 1704143T–1704177T:pop=10 | 1704177T–1704211T:pop=9 | 1704211T–1704245T:pop=10 | 1704245T–1704280T:pop=9 | 1704280T–1704314T:pop=10 | 1704314T–1704348T:pop=9 | 1704348T–1704382T:pop=10 | 1704382T–1704416T:pop=10 | 1704420T–1704424T:tai=1
          bins=11 [1.70407e+18..1.70442e+18] min=1704067200000000000 max=1704423600000000000 nan_per=0.0 distinct=100
      xo: [{'population': 10} pop=100 cat=0 NA=0] 1704067T–1704103T:pop=10 | 1704103T–1704138T:pop=10 | 1704138T–1704174T:pop=10 | 1704174T–1704210T:pop=10 | 1704210T–1704245T:pop=10 | 1704245T–1704281T:pop=10 | 1704281T–1704317T:pop=10 | 1704317T–1704352T:pop=10 | 1704352T–1704388T:pop=10 | 1704388T–1704424T:pop=10
          bins=11 [1.70407e+18..1.70442e+18] min=1704067200000000000 max=1704423600000000000 nan_per=0.0 distinct=99 ERRS=['median:ArrowInvalid']
    
    ### 1e15..1e16
      pd: [{'tail': 2, 'population': 10} pop=98 cat=0 NA=0] 1000T–1099T:tai=1 | 1100T–2070T:pop=10 | 2070T–3040T:pop=10 | 3040T–4010T:pop=10 | 4010T–4980T:pop=9 | 4980T–5950T:pop=10 | 5950T–6920T:pop=10 | 6920T–7890T:pop=9 | 7890T–8860T:pop=10 | 8860T–9830T:pop=10 | 9830T–10800T:pop=10 | 10801T–10900T:tai=1
          bins=11 [1.1e+15..1.08e+16] min=np.float64(1000000000000000.0) max=np.float64(1.09e+16) nan_per=0.0 distinct=100
      pl: [{'tail': 2, 'population': 10} pop=96 cat=0 NA=0] 1000T–1100T:tai=1 | 1200T–2150T:pop=10 | 2150T–3100T:pop=9 | 3100T–4050T:pop=10 | 4050T–5000T:pop=9 | 5000T–5950T:pop=10 | 5950T–6900T:pop=9 | 6900T–7850T:pop=10 | 7850T–8800T:pop=9 | 8800T–9750T:pop=10 | 9750T–10700T:pop=10 | 10800T–10900T:tai=1
          bins=11 [1.2e+15..1.07e+16] min=1000000000000000.0 max=1.09e+16 nan_per=0.0 distinct=100
      xo: [{'population': 10} pop=100 cat=0 NA=0] 1000T–1990T:pop=10 | 1990T–2980T:pop=10 | 2980T–3970T:pop=10 | 3970T–4960T:pop=10 | 4960T–5950T:pop=10 | 5950T–6940T:pop=10 | 6940T–7930T:pop=10 | 7930T–8920T:pop=10 | 8920T–9910T:pop=10 | 9910T–10900T:pop=10
          bins=11 [1e+15..1.09e+16] min=1000000000000000.0 max=1.09e+16 nan_per=0.0 distinct=None
    
    ### 1e30 fill value beside 0..99
      pd: [{'tail': 2, 'population': 10} pop=97 cat=0 NA=0] 0–1:tai=1 | 2–11.6:pop=10 | 11.6–21.2:pop=10 | 21.2–30.8:pop=9 | 30.8–40.4:pop=10 | 40.4–50:pop=9 | 50–59.6:pop=10 | 59.6–69.2:pop=10 | 69.2–78.8:pop=9 | 78.8–88.4:pop=10 | 88.4–98:pop=10 | 99–1000000000000000000T:tai=1
          bins=11 [2..98] min=np.float64(0.0) max=np.float64(1e+30) nan_per=0.0 distinct=101
      pl: [{'tail': 2, 'population': 10} pop=97 cat=0 NA=0] 0–1:tai=1 | 2–11.6:pop=10 | 11.6–21.2:pop=10 | 21.2–30.8:pop=9 | 30.8–40.4:pop=10 | 40.4–50:pop=9 | 50–59.6:pop=10 | 59.6–69.2:pop=10 | 69.2–78.8:pop=9 | 78.8–88.4:pop=10 | 88.4–98:pop=10 | 99–1000000000000000000T:tai=1
          bins=11 [2..98] min=0.0 max=1e+30 nan_per=0.0 distinct=101
      xo: [{'population': 2} pop=100 cat=0 NA=0] 0T–100000000000000016T:pop=99 | 900000000000000000T–1000000000000000000T:pop=1
          bins=11 [0..1e+30] min=0.0 max=1e+30 nan_per=0.0 distinct=None
    
    ### +-1e308 beside 0..99
      pd: [{'tail': 2, 'population': 10} pop=98 cat=0 NA=0] -99999999999999998134867772062300415778155607198205813300984837204468478832795008398842977267828545807373626970040225815727702936870449359100155289601680494988872072239402046841988962644563396584878879514845800049027585211004144644909839626131908358862432902604247279245705105301413805838450032640T<>0:tai=1 | 1–10.7:pop=10 | 10.7–20.4:pop=10 | 20.4–30.1:pop=10 | 30.1–39.8:pop=9 | 39.8–49.5:pop=10 | 49.5–59.2:pop=10 | 59.2–68.9:pop=9 | 68.9–78.6:pop=10 | 78.6–88.3:pop=10 | 88.3–98:pop=10 | 99–99999999999999998134867772062300415778155607198205813300984837204468478832795008398842977267828545807373626970040225815727702936870449359100155289601680494988872072239402046841988962644563396584878879514845800049027585211004144644909839626131908358862432902604247279245705105301413805838450032640T:tai=1
          bins=11 [1..98] min=np.float64(-1e+308) max=np.float64(1e+308) nan_per=0.0 distinct=102
      pl: [{'tail': 2, 'population': 10} pop=98 cat=0 NA=0] -99999999999999998134867772062300415778155607198205813300984837204468478832795008398842977267828545807373626970040225815727702936870449359100155289601680494988872072239402046841988962644563396584878879514845800049027585211004144644909839626131908358862432902604247279245705105301413805838450032640T<>0:tai=1 | 1–10.7:pop=10 | 10.7–20.4:pop=10 | 20.4–30.1:pop=10 | 30.1–39.8:pop=9 | 39.8–49.5:pop=10 | 49.5–59.2:pop=10 | 59.2–68.9:pop=9 | 68.9–78.6:pop=10 | 78.6–88.3:pop=10 | 88.3–98:pop=10 | 99–99999999999999998134867772062300415778155607198205813300984837204468478832795008398842977267828545807373626970040225815727702936870449359100155289601680494988872072239402046841988962644563396584878879514845800049027585211004144644909839626131908358862432902604247279245705105301413805838450032640T:tai=1
          bins=11 [1..98] min=-1e+308 max=1e+308 nan_per=0.0 distinct=102
      xo: EMPTY
          bins=11 [nan..inf] NONFINITE min=-1e+308 max=1e+308 nan_per=0.0 distinct=None
    
    ### tiny i*1e-9 (#620)
      pd: [{'tail': 2, 'population': 10} pop=98 cat=0 NA=0 DUPNAMES=['0–0']] 0–0:tai=1 | 0–0:pop=10 | 0–0:pop=10 | 0–0:pop=10 | 0–0:pop=9 | 0–0:pop=10 | 0–0:pop=10 | 0–0:pop=9 | 0–0:pop=10 | 0–0:pop=10 | 0–0:pop=10 | 0–0:tai=1
          bins=11 [1e-09..9.8e-08] min=np.float64(0.0) max=np.float64(9.9e-08) nan_per=0.0 distinct=100
      pl: [{'tail': 2, 'population': 10} pop=96 cat=0 NA=0 DUPNAMES=['0–0']] 0–0:tai=1 | 0–0:pop=10 | 0–0:pop=9 | 0–0:pop=10 | 0–0:pop=9 | 0–0:pop=10 | 0–0:pop=9 | 0–0:pop=10 | 0–0:pop=9 | 0–0:pop=10 | 0–0:pop=10 | 0–0:tai=1
          bins=11 [2e-09..9.7e-08] min=0.0 max=9.9e-08 nan_per=0.0 distinct=100
      xo: [{'population': 10} pop=100 cat=0 NA=0 DUPNAMES=['0–0']] 0–0:pop=10 | 0–0:pop=10 | 0–0:pop=10 | 0–0:pop=10 | 0–0:pop=10 | 0–0:pop=10 | 0–0:pop=10 | 0–0:pop=10 | 0–0:pop=10 | 0–0:pop=10
          bins=11 [0..9.9e-08] min=0.0 max=9.9e-08 nan_per=0.0 distinct=None
    
    ### int8 -128..127 (the -0 bounds)
      pd: [{'tail': 2, 'population': 10} pop=100 cat=0 NA=0] 0<>-125:tai=1 | -125<>-100:pop=10 | -100<>-75:pop=10 | -75<>-50:pop=10 | -50<>-25:pop=10 | -25<>-0:pop=10 | -0<>24:pop=10 | 24–49:pop=10 | 49–74:pop=10 | 74–99:pop=10 | 99–124:pop=10 | 124–127:tai=1
          bins=11 [-125..124] min=np.int8(-128) max=np.int8(127) nan_per=0.0 distinct=256
      pl: [{'tail': 2, 'population': 10} pop=100 cat=0 NA=0] -128<>-125:tai=1 | -124<>-99:pop=10 | -99<>-75:pop=10 | -75<>-50:pop=10 | -50<>-25:pop=10 | -25<>-0:pop=10 | -0<>24:pop=10 | 24–49:pop=10 | 49–74:pop=10 | 74–98:pop=10 | 98–123:pop=10 | 124–127:tai=1
          bins=11 [-124..123] min=-128 max=127 nan_per=0.0 distinct=256
      xo: [{'population': 10} pop=100.4 cat=0 NA=0] -128<>-102:pop=10.2 | -102<>-77:pop=9.8 | -77<>-52:pop=10.2 | -52<>-26:pop=9.8 | -26<>-0:pop=10.2 | -0<>25:pop=9.8 | 25–50:pop=10.2 | 50–76:pop=9.8 | 76–102:pop=10.2 | 102–127:pop=10.2
          bins=11 [-128..127] min=-128 max=127 nan_per=0.0 distinct=254
    
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions