def bc35_price(beyield, coupon, cpr, age, origfixedterm, origterm,
    dayofmonth=1, delay=47, servicing_fee=0, root=None):
    """
    This implements BC35 in core Python (vs columnwise in a pandas.DataFrame)
    """
    epsilon = servicing_fee / 1200
    r = coupon / 1200
    y = (1 + beyield / 200) ** (1 / 6) - 1
    s = 1 - (1 - cpr / 100) ** (1 / 12)
    m = origfixedterm - age
    n = origterm - age
    qn = 1 - 1 / (1 + r) ** n
    l1 = (r * (1 - s) - epsilon + s * (1 + r)) / qn
    l2 = (s * (1 + r) - epsilon) * (1 - 1 / qn)
    l3 = (1 - 1 / qn) * ((1 + r) * (1 - s)) ** m + 1 / qn * (1 - s) ** m
    pvl1 = l1 / (y + s) * (1 - ((1 - s) / (1 + y)) ** m)
    pvl2 = l2 / (y - (1 + r) * (1 - s) + 1) * (1 - ((1 + r) * (1 - s) / (1 +
        y)) ** m)
    pvb = l3 / (1 + y) ** m
    price = 100 * (pvl1 + pvl2 + pvb)
    dvl1 = l1 / (y + s) * (m / (1 + y) * ((1 - s) / (1 + y)) ** m) - l1 / (y +
        s) ** 2 * (1 - ((1 - s) / (1 + y)) ** m)
    dvl2 = l2 / (y - (1 + r) * (1 - s) + 1) * (m / (1 + y) * ((1 + r) * (1 -
        s) / (1 + y)) ** m) - l2 / (y - (1 + r) * (1 - s) + 1) ** 2 * (1 - 
        ((1 + r) * (1 - s) / (1 + y)) ** m)
    dvb = -m * l3 / (1 + y) ** (m + 1)
    adjfactor = 12 * (1 + beyield / 200) ** (5 / 6)
    staticdv01 = -(dvl1 + dvl2 + dvb) / adjfactor
    moddurn = staticdv01 / (price / 100)
    l1 = (r * (1 - s) + s * (1 + r)) / qn
    l2 = s * (1 + r) * (1 - 1 / qn)
    multl1 = l1 - r / qn
    wall1 = ((1 - (1 - s) ** (m + 1)) / (1 - (1 - s)) - (m + 1) * (1 - s) ** m
        ) / (1 - (1 - s))
    multl2 = l2 + r / qn / (1 + r) ** n
    wall2 = ((1 - ((1 - s) * (1 + r)) ** (m + 1)) / (1 - (1 - s) * (1 + r)) -
        (m + 1) * ((1 - s) * (1 + r)) ** m) / (1 - (1 - s) * (1 + r))
    qnlessm = 1 - 1 / (1 + r) ** (n - m)
    walb = m * qnlessm / qn * (1 - s) ** m
    wal = (multl1 * wall1 + multl2 * wall2 + walb) / 12
    forwardprice = price * (1 + y) ** ((dayofmonth - 1 + 30 - delay) / 30)
    cleanprice = forwardprice - coupon * (dayofmonth - 1) / 360
    waladjustment = (dayofmonth - 1 + 30 - delay) / 360
    adjwal = wal - waladjustment
    adjmoddurn = moddurn - waladjustment / (1 + beyield / 200)
    if root is None:
        return cleanprice, adjmoddurn, adjwal
    else:
        return cleanprice - root
