Skip to content

Instantly share code, notes, and snippets.

View swo's full-sized avatar

Scott Olesen swo

View GitHub Profile
@swo
swo / streamlit_example.py
Created May 7, 2025 13:42
Streamlit example
import streamlit as st
import re
st.title("A regex checker")
s = st.text_input("string")
r = re.compile(st.text_input("regex"))
st.write(re.findall(string=s, pattern=r))
@swo
swo / my_curve.py
Created April 4, 2025 15:35
Two-part logistic
import altair as alt
import numpy as np
import polars as pl
import streamlit as st
def logistic(x, y0, scale, x0, k):
return y0 + scale / (1 + np.exp(-k * (x - x0)))
@swo
swo / xkcd.py
Last active December 10, 2024 19:01
XKCD 3015
from sympy import *
import functools
a, b, z = var('a b z')
# discrete uniform pgf
G_du = (z ** a - z ** (b + 1)) / ((b - a + 1) * (1 - z))
# pgf for 3d6 + 1d4
G = G_du.subs(a, 1).subs(b, 6) ** 3 * G_du.subs(a, 1).subs(b, 4)
@swo
swo / diff0.py
Created December 6, 2024 23:50
polars diff with leading zero
def diff0(x: pl.Expr, first_value=0.0) -> pl.Expr:
"""
Get the differenced vector, putting a certain value (not null)
in the first place
"""
i = pl.arange(0, x.len())
return pl.when(i == 0).then(first_value).otherwise(x.diff())
@swo
swo / peaks.R
Created December 3, 2024 19:25
Find peaks in a vector
#' Find peaks in a vector
#'
#' Which elements of a vector are greater than the value to their left and
#' right? First and last values need only be greater than their adjacent value.
#'
#' @param x vector of values
#' @return boolean vector of peak positions
is_peak <- function(x) {
n <- length(x)
x_i_minus_1 <- c(-Inf, x[1:(n - 1)])
@swo
swo / super.py
Created November 22, 2024 19:40
Python `__super__` calls
class MyClass:
def __init__(self):
self.report()
def report(self):
print("Initializing MyClass")
class MySubClass(MyClass):
def __init__(self):
@swo
swo / rng.py
Last active November 13, 2024 16:16
Why use `np.random.Generator` objects
import numpy as np
class MyRNG:
def __init__(self, seed):
# store the global state, so we can reset it
global_state = np.random.get_state()
# set the seed and get the state
np.random.seed(seed)
self.state = np.random.get_state()
@swo
swo / gold.py
Created November 12, 2024 18:44
import polars as pl
import numpy as np
baseline_pars = {
"N": int(1e3),
"p_hospitalized": 0.10,
"hosp_time_fun": lambda rng, size: rng.normal(loc=0.0, scale=1.0, size=size),
"p_vax": 0.25,
"vax_time_fun": lambda rng, size: rng.normal(loc=0.0, scale=1.0, size=size),
"ve": 0.50,
@swo
swo / multipage_pdf.R
Created November 7, 2023 15:26
Make a multipage pdf with ggplot
#' @param list_of_plots plots to save, one per page
#' @param path path to output pdf
#' @param ... additional arguments to `ggplot2::ggsave()`
save_multipage_pdf <- function(list_of_plots, path, ...) {
# path must end with .pdf
stopifnot(grepl("\\.pdf$", path))
ggplot2::ggsave(
path,
gridExtra::marrangeGrob(list_of_plots, ncol = 1, nrow = 1)
...
@swo
swo / polars_cheat_sheet.py
Last active December 6, 2023 03:24
Polars cheat sheet
import polars as pl
# Making data frames ------------------------------------------
# with dictionary
df = pl.DataFrame({
'name': ['foo', 'bar', 'baz'],
'bar': [0, 1, 2],
'qux': [0.0, 1.0, 2.0]
})