【发布时间】:2019-04-16 02:53:07
【问题描述】:
我试图在我的 pyspark 数据框中使用 2 列来使用 numpy.npv() 函数计算净现值。我收到以下错误
return (values / (1+rate)**np.arange(0, len(values))).sum(axis=0) TypeError: len() of unsized object
我也尝试使用 numpy.npv 函数作为 udf 失败
请求帮助以解决此问题
# Creating the DataFrame
df = sc.parallelize([('a',1,100),('a',2,200),('a',3,300),('a',4,400),
('a',5,500),('a',6,600),('b',1,23),('b',2,32),('b',3,34),('b',4,55),
('b',5,43)]).toDF(['Name','yr','cash'])
df.show()
# Loading the requisite packages
from pyspark.sql import Window
from pyspark.sql.functions import col, collect_list
import numpy as np
w = (Window.partitionBy('Name').orderBy(col('yr').desc()).rangeBetween(Window.unboundedPreceding, 0))
df = df.withColumn('cash_list', collect_list('cash').over(w))
df.show(truncate=False)
df = df.withColumn('discount_rate', lit(0.3))
#calculate npv
df = df.withColumn('npv_value', np.npv(df.discount_rate, df.cash_list))
【问题讨论】:
-
假设
Name=1 yr=1,你想要600/(1.3)**5 + 500/(1.3)**4 + ...200/(1.3)**1 + 100/ (1.3)**0?或者另一个在附近?顺便说一句,您不能以这种方式使用np.npv。为此,您必须使用UDF。 -
正确!这就是我想要达到的目标。我认为 NPV 函数会为我做到这一点。但很明显,我离得很远。我尝试了UDF方式。重新编写函数如下@udf(returnType=DoubleType()) def calc_npv_value(rate, values): values = np.asarray(values) return (values / (1+rate)**np.arange(1,len( values)+1)).sum(axis=0)
-
但仍然遇到错误。如果您可以协助使用 UDF 方法,将会非常有帮助
标签: python-3.x numpy pyspark