How can I estimate unique occurrence counts from a random sampling of data? Let's say I have a large set of $S$ values which sometimes repeat.  I wish to estimate the total number of unique values in the large set.
If I take a random sample of $T$ values, and determine that it contains $T_u$ unique values, can I use this to estimate the number of unique values in the large set?
 A: There is a python package estndv for this task. For example, your sample is [1,1,1,3,5,5,12] and the original large set has 100000 values:
from estndv import ndvEstimator
estimator = ndvEstimator()
ndv = estimator.sample_predict(S=[1,1,1,3,5,5,12], N=100000)

ndv is the estimated number of unique/distinct values for the large set.
This method achieves the best results on sampled-based estimation for the number of unique values, see the paper: https://vldb.org/pvldb/vol15/p272-wu.pdf
A: Here is a whole paper about the problem, with a summary of various approaches.  It's called Distinct Value Estimation in the literature.
If I had to do this myself, without having read fancy papers, I'd do this.  In building language models, one often has to estimate the probability of observing a previously unknown word, given a bunch of text.  A pretty good approach at solving this problem for language models in particular is to use the number of words that occurred exactly once, divided by the total number of tokens.  It's called the Good Turing Estimate.
Let u1 be the number of values that occurred exactly once in a sample of m items.
P[new item next] ~= u1 / m.

Let u be the number of unique items in your sample of size m.
If you mistakenly assume that the 'new item next' rate didn't decrease as you got more data, then using Good Turing, you'll have
total uniq set of size s ~= u + u1 / m * (s - m) 

This has some nasty behavior as u1 becomes really small, but that might not be a problem for you in practice.
A: The simulation strategy
Collect m random samples of size n from the set S. For each of the m samples, compute the number u of unique values and divide by n to normalize. From the simulated distribution of normalized u, compute summary statistics of interest (e.g., mean, variance, interquartile range). Multiply the simulated mean of normalized u by the cardinality of S to estimate the number of unique values.
The greater are m and n, the more closely your simulated mean will match the true number of unique values.
A: Here's an implementation for pandas:
import math
import numpy as np
from collections import Counter

def estimate_uniqueness(df, col, r=10000, n=None):
    """ Draws a sample of size r from column col from dataframe df and 
        returns an estimate for the number of unique values given a
        population size of n """
    n = n or df.shape[0]
    sample = df[col][np.random.randint(0, n, r)]
    counts = sample.value_counts()
    fis = Counter(counts)
    estimate = math.sqrt(n / r) * fis[1] + sum([fis[x] for x in fis if x > 1])
    return estimate

Relies on Section 2 and 4 of this paper: http://ftp.cse.buffalo.edu/users/azhang/disc/disc01/cd1/out/papers/pods/towardsestimatimosur.pdf
