0

我希望通过将我的代码转换为数组和循环来提高我的代码效率。我正在使用的数据是这样开始的:

ID    Mapping    Asset    Fixed    Performing    Payment 2017    Payment2018    Payment2019    Payment2020

1     Loan1      1        1        1              90             30             30             30
2     Loan1      1        1        0              80             20             40             20  
3     Loan1      1        0        1              60             40             10             10
4     Loan1      1        0        0              120            60             30             30
5     Loan2     ...       ...      ...            ...            ...            ...             ...

因此,对于每个 ID(基本上是按映射、资产、固定和执行排序的数据),我希望为支付方案构建一个配置文件。

第一个 ID 的支付向量如下所示:

PaymentVector1    PaymentVector2    PaymentVector3    PaymentVector4
1                 0.33              0.33              0.33

它由公式表示

PaymentVector(I)=Payment(I)/Payment(1)

以上可以在数组中创建,如果您愿意,可以给出示例代码。

接下来,假设每次付款都会被替换,即 2018 年支付 30 时,必须替换,依此类推。

我正在寻找一个显示付款移动的配置文件(并且为了说明,但在代码中不需要,在括号中的流入),这样的付款移动 - 对于 ID = 1:

    Payment2017    Payment2018    Payment2019    Payment2020

17         (+90)            -30            -30           -30

18           N/A          (+30)            -10           -10

19          N/A           N/A              (+40)         -13.3

20         N/A             N/A             N/A          (+53.3)

因此,如果您向前看,可以想到行是哪一年,而列则代表即将到来的年份。

因此,在 2019 年,查看 2017 年和 2018 年要支付的款项是不适用的,因为这些款项已经过去/现在无法支付。

至于 2018 年,看 2019 年必须支付的费用,你必须支付你现在拥有的钱的三分之一,所以 -10。

我一直在努力将这个数据集逐行转换为数组,但肯定有一种使用数组的更快方法:

到目前为止,我使用的代码如下所示:

Data Want;
Set Have;

Array Vintage(2017:2020) Vintage2017-Vintage2020;
Array PaymentSchedule(2017:2020) PaymentSchedule2017-PaymentSchedule2020;
Array PaymentVector(2017:2020) PaymentVector2017-PaymentVector2020;
Array PaymentVolume(2017:2020) PaymentVolume2017-PaymentVolume2020;

do i=1 to 4;

PaymentVector(i)=PaymentSchedule(i)/PaymentSchedule(1);

end;

明天我会添加代码......但无论如何代码都不起作用。

4

2 回答 2

2
data have;
input
ID    Mapping $  Asset    Fixed    Performing    Payment2017    Payment2018    Payment2019    Payment2020; datalines;
1     Loan1      1        1        1              90             30             30             30
2     Loan1      1        1        0              80             20             40             20  
3     Loan1      1        0        1              60             40             10             10
4     Loan1      1        0        0              120            60             30             30

data want(keep=id payment: fraction:);
  set have;
  array p payment:;
  array fraction(4); * track constant fraction determined at start of profile;
  array out(4); * track outlay for ith iteration;

  * compute constant (over iterations) fraction for row;
  do i = dim(p) to 1 by -1;
    fraction(i) = p(i) / p(1);
  end;

  * reset to missing to allow for sum statement, which is <variable> + <expression>;
  call missing(of out(*));

  out(1) = p(1);
  do iter = 1 to 4;
    p(iter) = out(iter);
    do i = iter+1 to dim(p);
      p(i) = -fraction(i) * p(iter); 
      out(i) + (-p(i));  * <--- compute next iteration outlay with ye olde sum statement ;
    end;
    output;
    p(iter) = .;
  end;

  format fract: best4. payment: 7.2;
run;
于 2018-03-07T17:49:23.063 回答
1

您已使用 2017:2020 为数组编制索引,但随后尝试使用 1 到 4 索引来使用它们。那是行不通的,你需要保持一致。

Array PaymentSchedule(2017:2020) PaymentSchedule2017-PaymentSchedule2020;
Array PaymentVector(2017:2020) PaymentVector2017-PaymentVector2020;


do i=2017 to 2020;

PaymentVector(i)=PaymentSchedule(i)/PaymentSchedule(2017);

end;
于 2018-03-07T17:40:55.180 回答