from random import random 
@xl_func("object x: var")
def unmix_func(x):
    """Return a list of lists
    Args:
        x: a 1-dimensional list object
    Returns:
        a list of lists (suitable for PyXLL) 
    Raises:
        "empty" if function fails
    """
    try:
        return [[e] for e in x]
    except:
        return 'empty'
# from myst_nb import glue
import myst_nb as mnb
a = "sine"
mnb.glue("my_variable_a", a, display=False)
b = "cosine"
mnb.glue("my_variable_b", b, display=False)
'sine'
Show code cell source
from myst_nb import glue
import myst_nb as mnb
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 200)
y = np.sin(x)
fig, ax = plt.subplots()
ax.plot(x, y, 'b-', linewidth=2)
fig.set_size_inches(0.5, 0.166)
fig.set_facecolor('white')
fig.set_edgecolor('white')
ax.set_xticks([])
ax.set_yticks([])
ax.set_axis_off()
mnb.glue("glued_fig_b", fig, display=False)
temp = ''
 
Show code cell source
from myst_nb import glue
import myst_nb as mnb
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
x = np.linspace(0, 10, 200)
y = np.cos(x)
fig, ax = plt.subplots()
ax.plot(x, y, 'r-', linewidth=2)
fig.set_size_inches(0.5, 0.166)
fig.set_facecolor('white')
fig.set_edgecolor('white')
ax.set_xticks([])
ax.set_yticks([])
ax.set_axis_off()
mnb.glue("glued_fig_r", fig, display=False)
temp = ''
Show code cell output
 
 
'sine'
'cosine'
This is an example of inline text featuring a sparkline ‘sine’ wave,  , emphasized text.
, emphasized text.
This is an example of inline text featuring a sparkline ‘cosine’ wave,  , italics text.
, italics text.
Show code cell source
import itertools
from collections import Counter
from random import random
from decimal import *
from numbers import Number
import myst_nb as mnb
def KLHfloatround(myfloat, my10power):
    return float(
        Decimal(round(myfloat, my10power)).quantize(Decimal(str(10**-my10power)))
    )
def interval_compare_X(bracket_number1, bracket_number2, interval_type):
    """Given an Excel cell, filter the numeric value, retaining only if within the interval
    Args:
        bracket_number1: one extreme value in the interval (*)
        bracket_number2: the other extreme value in the interval (*)
        interval_type: type of interval closure (closed/open and combinations)
        number_entry: a single Excel cell to be filtered
        sortQ: a boolean, True indicates an ascending sort
        reverseQ: a boolean, True indicates sorted descending
        unique_onlyQ: a boolean, indicates removal of duplicates
        (*) or in ["minf", "pinf", "-inf", "inf"]
    Returns:
        List of values meeting the comparison specification, if any. Otherwise, the string 'empty'
        
    Raises:
        ValueError("Expected 2 numeric values and string interval_type")
    """
    b1, b2 = min(bracket_number1, bracket_number2), max(bracket_number1, bracket_number2)
    b1_ok, b2_ok = False, False
    
    if isinstance(b1, str):
        b1 = bracket_inf(b1)
        if not b1:
            input_check = False
            # print("ValueError('bracket1 must be numeric")
            raise ValueError('bracket1 must be numeric or in ["minf", "pinf", "-inf", "inf"]')
        else:
            b1_ok =True
    if isinstance(b2, str):
        b2 = bracket_inf(b2)
        if not b2:
            # print("ValueError('bracket2 must be numeric")
            raise ValueError('bracket2 must be numeric or in ["minf", "pinf", "-inf", "inf"]')
        else:
            b2_ok =True
    
    if not ((isinstance(b1, Number) or b1_ok) 
            and (isinstance(b2, Number) or b2_ok) 
            and isinstance(interval_type, str)):
        # print("ValueError('Expected ...")
        raise ValueError("Expected 2 numeric values (*) and string interval_type")
    ivupper = interval_type.upper()
    if not(ivupper in ['[]','[)','(]','()','CC','CO','OC','OO']):
        raise ValueError("Interval_type must be \n['[]','[)','(]','()','CC','CO','OC','OO']")
                                   
    if ivupper in ['[]','CC']:
        def CC(x):
            if (b1 < x < b2):
                return x
            else:
                return None
        return CC
    elif ivupper in ['[)','CO']:
        def CO(x):
            if (b1 < x <= b2):
                return x
            else:
                return None
        return CO
    elif ivupper in ['(]','OC']:
        def OC(x):
            if (b1 <= x < b2):
                return x
            else:
                return None
        return OC
    elif ivupper in ['()','OO']:
        def OO(x):
            if (b1 <= x <= b2):
                return x
            else:
                return None
        return OO
def interval_compare_X(bracket_number1, bracket_number2, interval_type):
    """Given an Excel cell, filter the numeric value, retaining only if within the interval
    Args:
        bracket_number1: one extreme value in the interval (*)
        bracket_number2: the other extreme value in the interval (*)
        interval_type: type of interval closure (closed/open and combinations)
        number_entry: a single Excel cell to be filtered
        sortQ: a boolean, True indicates an ascending sort
        reverseQ: a boolean, True indicates sorted descending
        unique_onlyQ: a boolean, indicates removal of duplicates
        (*) or in ["minf", "pinf", "-inf", "inf"]
    Returns:
        List of values meeting the comparison specification, if any. Otherwise, the string 'empty'
        
    Raises:
        ValueError("Expected 2 numeric values and string interval_type")
    """
    b1, b2 = min(bracket_number1, bracket_number2), max(bracket_number1, bracket_number2)
    b1_ok, b2_ok = False, False
    
    if isinstance(b1, str):
        b1 = bracket_inf(b1)
        if not b1:
            input_check = False
            # print("ValueError('bracket1 must be numeric")
            raise ValueError('bracket1 must be numeric or in ["minf", "pinf", "-inf", "inf"]')
        else:
            b1_ok =True
    if isinstance(b2, str):
        b2 = bracket_inf(b2)
        if not b2:
            # print("ValueError('bracket2 must be numeric")
            raise ValueError('bracket2 must be numeric or in ["minf", "pinf", "-inf", "inf"]')
        else:
            b2_ok =True
    
    if not ((isinstance(b1, Number) or b1_ok) 
            and (isinstance(b2, Number) or b2_ok) 
            and isinstance(interval_type, str)):
        # print("ValueError('Expected ...")
        raise ValueError("Expected 2 numeric values (*) and string interval_type")
    ivupper = interval_type.upper()
    if not(ivupper in ['[]','[)','(]','()','CC','CO','OC','OO']):
        raise ValueError("Interval_type must be \n['[]','[)','(]','()','CC','CO','OC','OO']")
                                   
    if ivupper in ['[]','CC']:
        def CC(x):
            if (b1 < x < b2):
                return x
            else:
                return None
        return CC
    elif ivupper in ['[)','CO']:
        def CO(x):
            if (b1 < x <= b2):
                return x
            else:
                return None
        return CO
    elif ivupper in ['(]','OC']:
        def OC(x):
            if (b1 <= x < b2):
                return x
            else:
                return None
        return OC
    elif ivupper in ['()','OO']:
        def OO(x):
            if (b1 <= x <= b2):
                return x
            else:
                return None
        return OO
    
def filter_int_comp_list_X(bracket_number1, bracket_number2, interval_type, number_entry_list, sortQ=False, reverseQ=False, unique_onlyQ=False):
    """Given an Excel range, filter the numeric values, retaining only those that are within the interval
    Args:
        bracket_number1: one extreme value in the interval
        bracket_number2: the other extreme value in the interval
        interval_type: type of interval closure (closed/open and combinations)
        number_entry_list: a LIST of values to be filtered
        sortQ: a boolean, True indicates sorted ascending
        reverseQ: a boolean, True indicates sorted descending
        unique_onlyQ: a boolean, indicates removal of duplicates
    Returns:
        List of values meeting the comparison specification, if any. Otherwise, the string 'empty'
        
    Raises:
        string 'Error in multiple range input': If the function fails.
    """
    ret = []
    icx=interval_compare_X(bracket_number1, bracket_number2, interval_type)
    # rg_flattened = itertools.chain.from_iterable(number_entry_range)
    # for e in number_entry_list:
    #     e_value = None
    #     if e == '' or e is None:
    #         # no conversion
    #         e_value = ''
    #     else:
    #         try:
    #             e_value = e.Value
    #         except:
    #             e_value = e
    #     if type(e_value) == float:
    #         comparison = icx(e_value)
    #         if comparison:
    #             ret.append(e_value)
    # ret = [icx(x) for x in number_entry_list]       
    ret = [y for x in number_entry_list for y in [icx(x)] if y is not None]
    if unique_onlyQ:
        ret = list(set(ret))
    if sortQ:
        ret.sort()
    if reverseQ:
        ret.reverse()
    if len(ret) == 0:
        return 0
    else:
        return ret
    
def mix_func(x):
    """Return a list of x random values
    Args:
        x: integer number of values to produce
        
    Returns:
        an x-length list of random numbers
        
    Raises:
        zero, if x == 0
        "Function error" if function fails
    Disclosure:
        Lifted from Page 56 of https://www.pyxll.com/docs/pyxll-5.5.4.pdf         
    """
    try:
        if x == 0:
            # return as a number to Excel
            return 0
        # return a list of values as an 'object'
        array = [random() for i in range(x)]
        return array
    except:
        return "Function error"
def stats_X(x, n, decimal_places=3):
    """Return a list of lists counting and comparing number of runs with each possible length
    :param x: integer number of values per run
    :param n: integer number of runs
    :param decimal_places: decimal places in ratio result 
    Returns:
        a 3-column by x-row range
        column 1: possible values of counter function
        column 2: count of runs for each possible value
        column 3: ratio of specific count of runs to total runs, n
        
    Raises:
        "Function error" if function fails
    Example:
        = stats_X(10,50000,3) returns
        0:	47     0.001
        1:	489    0.010
        2:	2224   0.044
        3:	5882   0.118
        4:	10232  0.205
        5:	12299  0.246
        6:	10183  0.204
        7:	5933   0.119
        8:	2135   0.043
        9:	533    0.011
        10:	43     0.001
    """
    try:
        # consider x might be a list or an int
        # this avoids the error from len(an_integer)
        len_int_or_list = lambda x: 0 if x == 0 else len(x)
        results = []
        # for f in range(n):
        #     mfx = mix_func(x)
        #     this_run = filter_int_comp_list(0.0, 0.5, 'oo', mfx)
        #     results.append(len_int_or_list(this_run))
        results = [len_int_or_list(filter_int_comp_list_X(0.5, 1.0, 'oo', mix_func(x))) \
                   for e in range(n)]
        
        counts = Counter(results)
        output = []
        # total = sum([counts.get(e, 0) for e in counts])
        for e in range(x+1):
            output.append([str(e)+':', counts.get(e, 0), KLHfloatround(counts.get(e, 0)/n,decimal_places)])
        return output
    except:
        return 'Function error'
# list of lists
temp = stats_X(10,50000,3)
# create a dataframe
# using list comprehension to get last two columns of all rows
temp_trimmed = [row[-2:] for row in temp]
df = pd.DataFrame(temp_trimmed, columns = ['Count', 'Fraction'])
# Inserting variables into pages using glue: entire table
mnb.glue("table_of_results", df, display=False)
# Inserting variables into pages using glue:
# now just one item from the list of lists
t51 = temp[5][1]
mnb.glue("exact_5H_in_10", t51, display=False)
Model Results
  
    
       
  
  
    
       Count 
      Fraction 
    
       
    0 
      51 
      0.001 
    
       
    1 
      500 
      0.010 
    
       
    2 
      2199 
      0.044 
    
       
    3 
      5820 
      0.116 
    
       
    4 
      10210 
      0.204 
    
       
    5 
      12346 
      0.247 
    
       
    6 
      10261 
      0.205 
    
       
    7 
      5877 
      0.118 
    
       
    8 
      2193 
      0.044 
    
       
    9 
      501 
      0.010 
    
       
  
10 
      42 
      0.001 
    
In the 50,000 experiments of 10 coin tosses each, exactly 5 heads occurred 12346 times.
 
- 16
- List - 0 - 0.192206 - 1 - 0.197810 - 2 - 0.283948 - 3 - 0.611066 - 4 - 0.512147 - 5 - 0.786452 - 6 - 0.874998 - 7 - 0.292821 - 8 - 0.637193 - 9 - 0.552829 
| name | insert | item | ||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| exact number of tosses | 12346 | 1 | ||||||||||||||||||||||||||||||||||||
| table of result | 
 | 2 | ||||||||||||||||||||||||||||||||||||
| a simple variable | 
 | 3 | ||||||||||||||||||||||||||||||||||||
| an entire dataframe | 
 | 4 | 
Link to my non-Sphinx Plotly HTML file
1 NOT BAD
2 GOOD
To get to my standalone, non-generated Plotly HTML file, just (click here BEST)
3 EXCELLENT
Embedded .png image
