【问题标题】:How to improve the speed of specific routines?如何提高特定套路的速度?
【发布时间】:2020-02-02 06:33:08
【问题描述】:

我正在尝试在 Python 中使用一些基本的精算数学。

我有一个包含 1000 多人及其养老金信息的数据库。

在这个问题中,我正在处理这些变量: m_age:被保险人的年龄(月) m_tmpness:福利的暂时性,如果是暂时的。 m_tmbenef:从福利开始算起经过的时间(以月为单位)。 m_interest:收益的利率。 tableid:精算表的 ID 号。 mytable_n:来自精算表的 qx(在 x 岁结束前死亡的概率)。我有几张桌子,所以是 mytable_1, mytable_2, ... mytable_n

In[2]: m_age
Out[2]: [877, 877, 797, 797, 794]

In[3]: m_tmpness
Out[3]: [240, 240, 0, 120, 120]

In[4]: m_tmbenef
Out[4]: [101, 28, 0, 118, 118]

In[5]: m_interest
Out[5]: [0.0016515813019202241,
 0.0016515813019202241,
 0.0023039138595752906,
 0.0040741237836483535,
 0.0040741237836483535]

In[6]: mytable_1
Out[6]:
0       0.000337
1       0.000337
2       0.000337
...
1500    1.000000
Name: at49m, Length: 1501, dtype: float64

我已经为每个表计算了 lx(生活在 x 岁的人数)值,以支持计算 Nx 和 Dx。我必须根据他们的数据计算数据库中每个人的 Dx 和 Nx。 Dx 就是 lx * 1/(1+interest)^x。 Nx 是某个点的所有 Dx 值的总和。如果 x = 0,则 Nx = D0 + D1 + D2 + ... + Dn。如果 x = 50,则 Nx = D50 + D51 + ... + Dn。 计算每个人的 Dx 绝对容易,但我正在为此苦苦挣扎,因为我需要每个人从 Dx 到特定年龄的所有值来计算他们在特定年龄的 Nx。

所以,这就是我迄今为止一直在尝试的:

import pandas
lx_mytable_1 = [100000 if i==0 else 0 for i in range(len(mytable_1))]
for i in range(len(mytable_1)):
lx_mytable_1[i] = lx_mytable_1[i-1]*(1-mytable_1[i-1])
### Replicate it to n tables

### Dx and Nx
def Dx(x,lx,qx,interest):
    D_x = [((1/(1+interest))**i)*lx[i] for i in range(len(qx))]
    return(D_x[x])

def Nx(x,lx,qx,interest):
    N_x = 0
    for i in range(len(qx)):
        N_x = N_x + Dx(x=i,lx=lx,qx=qx,interest=interest)
    return(N_x)

### And one should run it like this, for example:
### Nx(x=100,lx=lx_mytable_1,qx=mytable_1,interest=m_interest)

aux_NX = [0 for i in range(len(tableid))]
for i in range(len(tableid)):
    if (tableid[i] == 0):
        aux_NX[i] = 0.0
    else:
        if (tableid[i] == 1):
            aux_NX[i] = Nx(x=PBCIDADE[i],lx=lx_mytable_1,qx=mytable_1,interest=m_interest[i])
        else:
            if (tableid[i] == 2):
                aux_NX[i] = Nx(x=PBCIDADE[i],lx=lx_mytable_2,qx=mytable_2,interest=m_interest[i])
            else:
                if (tableid[i] == 3):
                    aux_NX[i] = Nx(x=PBCIDADE[i],lx=lx_mytable_3,qx=mytable_3,interest=m_interest[i])
                else:
                    if (tableid[i] == 4):
                        aux_NX[i] = Nx(x=PBCIDADE[i],lx=lx_mytable_4,qx=mytable_4,interest=m_interest[i])
                    else:
                        if (tableid[i] == 5):
                            aux_NX[i] = Nx(x=PBCIDADE[i],lx=lx_mytable_5,qx=mytable_5,interest=m_interest[i])
                        ### And as many elses and ifs as necessary... Currently I'm using 15 tables.

当我为一行运行它时,这很好。但是当我运行它超过 1000 行时,可能需要几个小时才能正常运行。可能是因为我在 Nx 中调用了一个 for 循环,而 Dx 正在使用另一个 for 循环,在 Dx 和 Nx 中进行了 1500 次迭代...

我的问题是:有没有一种计算速度更快的方法来做同样的事情?怎么样?

【问题讨论】:

    标签: python python-3.x pandas for-loop statistics


    【解决方案1】:

    我建议使用timeit 模块进行一些测试。

    然后您可以准确找出代码的哪些部分需要很长时间才能运行,哪些运行得很快。然后,您可以使用这些知识来询问有关如何优化代码的更具体的问题。

    快速扫描您的代码,我建议您使用字典来存储您的lx_mytable_2 表。然后您可以将它们称为 lx_mytable[i] 并在现有的 for 循环中使用相同的索引,而不是 10 个 if else 语句。这将使您的代码更加简洁,并且随着数据的增长,您不必编写新的代码行。

    附带说明,请尝试在单独的行中使用 elif 语法而不是 else: if:

    【讨论】:

      猜你喜欢
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      • 2019-03-19
      • 2015-12-20
      • 2018-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多