使用Pandas数据框进行财务建模

时间:2016-03-07 17:22:05

标签: python pandas dataframe modeling financial

我主要通过Pandas建立了一个简单的DCF模型。基本上所有计算都在一个数据帧中进行。我想找到一个更好的编码风格,因为模型变得更复杂,并且更多的变量已添加到模型中。以下示例可以说明我当前的编码风格 - 简单明了。

# some customized formulas
def GrowthRate():
def BoundedVal()
....
# some operations
df['EBIT'] = df['revenue'] - df['costs']
df['NI'] = df['EBIT'] - df['tax'] - df['interests']
df['margin'] = df['NI'] / df['revenue']

我遍历所有年份来计算价值。现在我已经为模型添加了500多个变量,计算也变得更加复杂。我正在考虑为每个变量创建一个单独的def并相应地更新主df。所以上面的代码将成为:

def EBIT(t):
    df['EBIT'][t] = df['revenue'][t] - df['costs'][t]
    #....some more ops
    return df['EBIT'][t]

def NI(t):
    df['NI'][t] = EBIT(t) - df['tax'][t] - df['interests'][t]
    #....some more ops
    return df['NI'][t]

def margin(t):
    if check_df_is_nan():
        df['margin'][t] = NI(t) - df['costs'][t]
        #....some more ops
        return df['margin'][t]
    else:
        return df['margin'][t]

每个函数都能够1)计算结果并更新df 2)如果被其他函数调用则返回值。

为了避免冗余计算(想想多次调用margin(t)),最好添加一个"检查是否已在"之前计算了val。每个def的功能。

我的问题:1)是否可以将if语句添加到一组defs?类似于上面的if子句。 2)我有超过50个自定义defs,因此主文件变得太长。我不能简单地将所有defs移动到另一个文件并导入all,因为一些defs也引用主文件中的数据帧。有什么建议?我可以将df设置为全局变量,因此其他文件的defs能够修改和更新吗?

1 个答案:

答案 0 :(得分:0)

对于1,只需检查值是否为NaN。

import pandas as pd
def EBIT(t):
    if pd.notnull(df['EBIT'][t]):
        return df['EBIT'][t]

    df['EBIT'][t] = df['revenue'][t] - df['costs'][t]
    ...

对于2,使用全局变量可能有效,但这是一个糟糕的方法。你应该尽可能避免使用它们。

你应该做的是让每个函数都将全局数据框作为参数。然后,您可以传入要操作的数据框。

# in some other file
def EBIT(df, t):
    # logic goes here

# in the main file
import operations as op
# ...
op.EBIT(df, t)
enter code here

P.S。您是否考虑过立即对整个列进行操作而不是使用t?它应该快得多。