Cálculo da TIR variável do fluxo de caixa em Python (pandas)

Eu tenho um DataFrame de fluxos de caixa imprevisíveis e períodos imprevisíveis e preciso gerar uma TIR retrospectiva.

Fazê-lo no Excel é bastante simples, usando o solucionador, imaginando se existe uma boa maneira de fazê-lo no Python. (Acho que poderia aproveitar o openpyxl para que o solucionador funcione no excel a partir de python, mas isso parece desnecessariamente complicado).

O problema é bem direto:

VAL do fluxo de caixa = ((cash_flow) / (1 + TIR) ^ anos_ago)

META: Encontre TIR em que SUM (NPV) = 0

Meu dataframe é mais ou menos assim:

cash_flow    |years_ago
-----------------------
-3.60837e+06 |4.09167    
31462        |4.09167    
1.05956e+06  |3.63333    
-1.32718e+06 |3.28056    
-4.46554e+06 |3.03889    

Parece que outras calculadoras de TIR (como numpy.irr) assumem limites estritos de período (a cada 3 meses, 1 ano, etc.), o que não funciona. A outra opção parece ser a rota iterativa, onde eu continuamente adivinho, verifico e itero, mas isso parece a maneira errada de lidar com isso. Idealmente, estou procurando por algo que faria isso:

irr = calc_irr((cash_flow1,years_ago1),(cash_flow2,years_ago2),etc)

Edição: Aqui está o código que estou executando o problema. Eu tenho uma lista de transações e optei por criar tabelas temporárias por ID.

for id in df_tran.id.unique():
   temp_df = df_tran[df_tran.id == id] 

   cash_flow = temp_df.cash_flows.values
   years = temp_df.years.values

   print(id, cash_flow)
   print(years)
#irr_calc = irr(cfs=cash_flow, yrs=years,x0=0.100000)
#print(sid, irr_calc)

onde df_tran (no qual temp_df se baseia) se parece com:

    cash_flow       |years     |id
0   -3.60837e+06     4.09167    978237
1   31462            4.09167    978237
4   1.05956e+06      3.63333    978237
6   -1.32718e+06     3.28056    978237
8   -4.46554e+06     3.03889    978237
10  -3.16163e+06     2.81944    978237
12  -5.07288e+06     2.58889    978237
14  268833           2.46667    978237
17  -4.74703e+06     1.79167    978237
20  -964987          1.40556    978237
22  -142920          1.12222    978237
24  163894           0.947222   978237
26  -2.2064e+06      0.655556   978237
27  1.23804e+06      0.566667   978237
29  180655           0.430556   978237
30  -85297           0.336111   978237
34  -2.3529e+07      0.758333   1329483
36  21935            0.636111   1329483
38  -3.55067e+06     0.366667   1329483
41  -4e+06           4.14167    1365051

temp_df parece idêntico ao df_tran, exceto que apenas mantém transações para um único ID.

questionAnswers(1)

yourAnswerToTheQuestion