Объединить np.equal и np.less для создания единого кадра данных? - PullRequest
0 голосов
/ 17 января 2019

У меня есть следующее:

df1 = pd.DataFrame({'Effective_Date':pd.to_datetime(['12/31/2017', '1/31/2018', '2/28/2018', '3/31/2018', '9/30/2020']),
                'Amount':[100,150,300,500,750]})


Date_Range = pd.date_range('12/31/2017', periods=150, freq='M')

Я пытаюсь создать отдельный фрейм данных, который возвращает df1 ['Amount'], когда месяц df1 ['Effective_Date'] = месяц Date_Range. Однако, если Date_Range равен

Например, дата вступления в силу 31.01.19 с Amount = 5 будет иметь 5 для Date_Range = 1/31/19, 1/31/20, 1/31/21 и т. Д. Везде 0.

Я могу сделать две части отдельно:

Если месяцы равны:

df2 = (pd.DataFrame(np.equal.outer(df1.Effective_Date.dt.month, Date_Range.month) * df1.Amount.values[:,None], columns = Date_Range))

Если Date_Range <Дата вступления в силу, вернуть 0: </p>

df3 = (pd.DataFrame(np.less_equal.outer(df1.Effective_Date, Date_Range) * df1['Amount'].values[:,None], columns = Date_Range))

Но я не уверен, как их объединить. Ценю твою помощь.

1 Ответ

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

Я считаю, что вам нужно numpy.where:

a = np.equal.outer(df1.Effective_Date.dt.month, Date_Range.month) * df1.Amount.values[:,None]
b = np.less_equal.outer(df1.Effective_Date, Date_Range) * df1['Amount'].values[:,None]

m =  Date_Range.values < df1['Effective_Date'].values[:,None]
df = pd.DataFrame(np.where(m, a, b), columns = Date_Range)
print (df)
   2017-12-31  2018-01-31  2018-02-28  2018-03-31  2018-04-30  2018-05-31  \
0         100         100         100         100         100         100   
1           0         150         150         150         150         150   
2           0           0         300         300         300         300   
3           0           0           0         500         500         500   
4           0           0           0           0           0           0   

     2029-12-31  2030-01-31  2030-02-28  2030-03-31  2030-04-30  \
0     ...             100         100         100         100         100   
1     ...             150         150         150         150         150   
2     ...             300         300         300         300         300   
3     ...             500         500         500         500         500   
4     ...             750         750         750         750         750   

   2030-05-31  
0         100  
1         150  
2         300  
3         500  
4         750  

[5 rows x 150 columns]
...