The formulas for cutoff frequencies of a bandpass filter are different for different filter designs and can be calculated from the transfer function $H(ω)$. For a "basic" series RLC filter
$$
H(ω) = {\frac {ωRC} {\sqrt{(1-ω^2LC)^2 + (ωRC)^2}} }
$$
and this filter can be made narrowband if implemented with a high quality factor (see later in this text), but there are better designs for narrowband bandpass filters.
The 3dB level in amplitude is a ratio $1\over{\sqrt{2}}$; for an RLC filter the cutoff frequencies are calculated by solving the equation
$$
{\frac {ωRC} {\sqrt{(1-ω^2LC)^2 + (ωRC)^2}} } = {1\over{\sqrt{2}}}
$$
which is reduced to a quadratic equation having two roots
$$
ω_1 = -{R\over{2L}}+{\sqrt{\left({R\over{2L}}\right)^2+{ω_c^2}}} \\
ω_2 = {R\over{2L}}+{\sqrt{\left({R\over{2L}}\right)^2+{ω_c^2}}}
$$
$ω_c = {\frac {1} {\sqrt{LC}}}$ is a central frequency, $ω_1$ is a lower cutoff frequency, and $ω_2$ is a high cutoff frequency of the RLC filter. Unlike your guessed arithmetic mean, the central frequency of a RLC filter is a geometric mean
$$
ω_c = {\sqrt{ω_1 ω_2}}
$$
Another useful formula defines the filter bandwidth
$$
BW_{LRC} = ω_2 - ω_1 = {\frac {ω_c} {Q}}
$$
where $Q$ is a quality factor of the series RLC resonant tank:
$$
Q = {\frac {ω_cL} {R}} = \frac {1} {ω_cRC}
$$
For the other filter designs, the formulas are different.
Notice the use of an angular frequency ω in the formulas, $ω = 2\pi f$, which is customary for a signal processing math. Angular frequency is measured in radians per second.
UPDATE on question edit
The practical approach to constructing the filter is in the opposite direction to what you are seeking: given the design requirements, as the critical frequencies, ripple levels, and the sharpness of the cutoff, the priority of these requirements and the bill of materials, the developer selects the filter type, as Bessel, Butterworth, Chebyshev, elliptic or else, and adjusts the parameters to satisfy the requirements. See the filter example in your question's reference
sos = signal.iirfilter(17, [50, 200], rs=60, btype='band',
analog=False, ftype='cheby2', fs=2000,
output='sos')
the second parameter, [50, 200], sets the lower (50) and high (200) cutoff frequencies. Notice also in passing that in the Wikipedia article on the Chebyshev filter you can read
The common practice of defining the cutoff frequency at −3 dB is
usually not applied to Chebyshev filters; instead the cutoff is taken
as the point at which the gain falls to the value of the ripple for
the final time.
Usually you do not select these frequencies arbitrarily. Your decision depends on what is the purpose of your filter. For example, when you design a filter for audio signal, you can set the lower cutoff 16Hz, and the high cutoff 20KHz, because it is the hearing range of humans, and the transmission or amplification of frequencies outside this range would only enhance distortions and waste the electric power.