Сумма данных в Python для определенных столбцов - PullRequest
0 голосов
/ 04 января 2019

Моя задача - рассчитать совокупный основной капитал. Используя numpy.ppmt, он дает только оплаченный основной счет за конкретный месяц, поэтому я хочу добавить столбцы, которые содержат ежемесячный основной размер для каждой записи, а затем взять сумму, чтобы получить совокупный основной размер.

Например, у меня датафрейм выглядит следующим образом:

frame = pd.DataFrame({'rate':[0.1, 0.1], 'per':[2, 4], 'nper':[360, 360], 'pv':[100000, 200000]})

max_per = frame['per'].max()
columns = ['principal%s'%i for i in range(1, max_per + 1)]
df = pd.DataFrame(index=frame.index, columns=columns, dtype='float').fillna(0)

for index, column in enumerate(columns):
    df[column] = -np.ppmt(rate=frame['rate'] / 100 / 12, per=index + 1, nper=frame['nper'], 
                          pv=frame['pv'], when=when)
frame.join(df)

Фрейм данных будет выглядеть следующим образом:

   nper  per      pv  rate          epp  principal1  principal2  principal3  \
0   360    2  100000   0.1   547.309838  273.643517  273.666321  273.689126   
1   360    4  200000   0.1  2189.421796  547.287034  547.332642  547.378253   

   principal4  
0  273.711934  
1  547.423868

Проблема в том, что для записи один, принципал 3 и принципал 4 должны быть равны 0. Один из обходных путей - это вычисление суммы суммы принципала1-принципала4 на основе столбца per, например, если frame.per == 2, тогда я только суммирую принципал1 и принципал 2, а если frame.per == 4, то я суммирую только сумму от принципала1 до принципала4. Любая помощь, чтобы сделать это.

Я могу рассчитать совокупный принципал, вызвав apply, но я не хочу этого делать, потому что он медленный.

Спасибо.

1 Ответ

0 голосов
/ 04 января 2019

Одно возможное решение задается 0 с помощью mask до join с помощью логической маски со сравнением аранжировки по длине столбца с per для 2d numpy array:

#subtract 1 because python counts from 0
mask = np.arange(len(df.columns)) > frame['per'].values[:, None] - 1
df = frame.join(df.mask(mask, 0))
print(df)
   rate  per  nper      pv  principal1  principal2  principal3  principal4
0   0.1    2   360  100000  273.643517  273.666321    0.000000    0.000000
1   0.1    4   360  200000  547.287034  547.332642  547.378253  547.423868

Другое решение с numpy.where:

mask = np.arange(len(df.columns)) > frame['per'].values[:, None] - 1
df[:] = np.where(mask, 0, df)
df = frame.join(df)
print(df)
   rate  per  nper      pv  principal1  principal2  principal3  principal4
0   0.1    2   360  100000  273.643517  273.666321    0.000000    0.000000
1   0.1    4   360  200000  547.287034  547.332642  547.378253  547.423868
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...