Python 3.x 平衡利息的功能
我有以下数据帧Python 3.x 平衡利息的功能,python-3.x,pandas,Python 3.x,Pandas,我有以下数据帧df1: Bank Rate_1Y% Bank of America 2 Barclays 0.75 Nationalbanken 0.05 Deutsche Bank 0 UBS -0.75 我有以下数据帧df2: 0 2010-12-31 2010-12-31 2011-12-31 2011-12-31 2012-12-31 2012-12-31 201
df1
:
Bank Rate_1Y%
Bank of America 2
Barclays 0.75
Nationalbanken 0.05
Deutsche Bank 0
UBS -0.75
我有以下数据帧df2
:
0
2010-12-31 2010-12-31
2011-12-31 2011-12-31
2012-12-31 2012-12-31
2013-12-31 2013-12-31
2014-12-31 2014-12-31
2015-12-31 2015-12-31
2016-12-31 2016-12-31
2017-12-31 2017-12-31
2018-12-31 2018-12-31
2019-12-31 2019-12-31
我有一个输入值:
Input_Balance = 10000
Start_Date = '2010-01-01'
End_Date = '2020-01-01'
freq = '1Y'
我使用时间列创建了新的df2:
DatetimeIndex(['2010-12-31', '2011-12-31', '2012-12-31', '2013-12-31',
'2014-12-31', '2015-12-31', '2016-12-31', '2017-12-31',
'2018-12-31', '2019-12-31'],
dtype='datetime64[ns]
任何人都可以帮助找到一个简单的函数解决方案来计算输入平衡的变化,对于表示为End\u Date-Start\u Date
的期间。
我想在df2中有一个新的列,它代表定制银行的期末余额计算,在本例中我使用美国银行
预期产出:
Date End Balance
2010-12-31 10200$
2011-12-31 10200$
2012-12-31 10200$
需要在自定义银行的“期末余额”列中记下所选期间(开始期间到结束期间)如果需要在
df2
中创建新列,只需写下:
from datetime import datetime
import pandas as pd
df2.reset_index(name='Start_Date', inplace=True)
df2['End_Date'] = '2020-01-01' #or any required value
df2['Start_Date'] = pd.to_datetime(df2['Start_Date'])
df2['End_Date'] = pd.to_datetime(df2['End_Date'])
df2['Input_Balance'] = df2['End_Date']- df2['Start_Date']
若您需要为自定义银行创建新列,这意味着银行名称也应该在df2中。另一种方法是通过聚合使用
groupby
如果有
df1
、df2
的示例,以及df2
视图中清晰的预期结果,df2
。如果需要在df2
中创建新列,只需编写:
from datetime import datetime
import pandas as pd
df2.reset_index(name='Start_Date', inplace=True)
df2['End_Date'] = '2020-01-01' #or any required value
df2['Start_Date'] = pd.to_datetime(df2['Start_Date'])
df2['End_Date'] = pd.to_datetime(df2['End_Date'])
df2['Input_Balance'] = df2['End_Date']- df2['Start_Date']
若您需要为自定义银行创建新列,这意味着银行名称也应该在df2中。另一种方法是通过聚合使用
groupby
如果我正确理解OP的问题,
df1
、df2
的示例以及针对df2
的清晰预期结果将是非常好的,并且df2
的每一行应该对应于时间t的当前余额,在开始日期给出初始余额,然后我会这样说:
从datetime导入datetime,timedelta
def计算平衡(输入平衡,
上一个日期,
结束日期,
时间间隔,
银行的利率,
数据=无,
):
"""
递归计算给定年利率时t的余额
:参数输入\平衡:初始输入平衡(x0)
:param prev_date:datetime.datetime对象指定开始日期
:param end_date:datetime.datetime对象指定结束日期
:参数时间间隔:以天为单位的时间间隔
:param rate_by_bank:提供每个银行的更改率的字典{bank_name:rate,…}
:param data:字典列表(不能由用户设置)
:return.DataFrame
"""
如果数据为无:
数据=[{
“时间”:上一个日期,
**{
银行名称:输入银行余额
对于银行名称,按银行利率
}
}]
nb_天数_/年=365.0
标准化时间间隔=时间间隔/nb天/年
当前日期=上一个日期+时间增量(天=时间间隔)
如果当前日期>=结束日期:
返回pd.DataFrame(data.set_索引('time'))
每家银行的余额={
银行名称:(数据[-1][银行名称]
+(利率/100.0)*标准化时间间隔*数据[-1][银行名称]
)
对于银行名称,按银行的利率
}
data.append({
“时间”:当前日期,
**每家银行的余额
})
返回计算余额(输入余额、当前日期、结束日期、时间间隔、费率、数据)
#输入变量
输入\单位余额=10000
开始日期='2010-01-01'
结束日期='2020-01-01'
#将df_1转换为字典以获得每家银行的利率
速率=df_1.到dict(orient='split')['data']
#将日期转换为日期时间对象
开始日期=pd.Timestamp(datetime.strtime(开始日期,%Y-%d-%m)))
end_date=pd.Timestamp(datetime.strtime(end_date,%Y-%d-%m)))
df_2=计算_余额(输入_余额、开始日期、结束日期、365、费率)
然后输出:
Bank of America Barclays Deutsche Bank NationalBanken \
time
2010-01-01 10000.0000 10000.000000 10000.0 10000.000000
2011-01-01 10200.0000 10075.000000 10000.0 10005.000000
2012-01-01 10404.0000 10150.562500 10000.0 10010.002500
2012-12-31 10612.0800 10226.691719 10000.0 10015.007501
2013-12-31 10824.3216 10303.391907 10000.0 10020.015005
UBS
time
2010-01-01 10000.000000
2011-01-01 9925.000000
2012-01-01 9850.562500
2012-12-31 9776.683281
2013-12-31 9703.358157
如果我正确理解OP的问题,并且df2
的每一行都应该对应于时间t的当前余额,并在开始日期给出初始余额,那么我会这样做:
从datetime导入datetime,timedelta
def计算平衡(输入平衡,
上一个日期,
结束日期,
时间间隔,
银行的利率,
数据=无,
):
"""
递归计算给定年利率时t的余额
:参数输入\平衡:初始输入平衡(x0)
:param prev_date:datetime.datetime对象指定开始日期
:param end_date:datetime.datetime对象指定结束日期
:参数时间间隔:以天为单位的时间间隔
:param rate_by_bank:提供每个银行的更改率的字典{bank_name:rate,…}
:param data:字典列表(不能由用户设置)
:return.DataFrame
"""
如果数据为无:
数据=[{
“时间”:上一个日期,
**{
银行名称:输入银行余额
对于银行名称,按银行利率
}
}]
nb_天数_/年=365.0
标准化时间间隔=时间间隔/nb天/年
当前日期=上一个日期+时间增量(天=时间间隔)
如果当前日期>=结束日期:
返回pd.DataFrame(data.set_索引('time'))
每家银行的余额={
银行名称:(数据[-1][银行名称]
+(利率/100.0)*标准化时间间隔*数据[-1][银行名称]
)
对于银行名称,按银行的利率
}
data.append({
“时间”:当前日期,
**每家银行的余额
})
返回计算余额(输入余额、当前日期、结束日期、时间间隔、费率、数据)
#输入变量
输入\单位余额=10000
开始日期='2010-01-01'
结束日期='2020-01-01'
#将df_1转换为字典以获得每家银行的利率
速率=df_1.到dict(orient='split')['data']
#将日期转换为日期时间对象
开始日期=pd.Timestamp(datetime.strtime(开始日期,%Y-%d-%m)))
end_date=pd.Timestamp(datetime.strtime(end_date,%Y-%d-%m)))
df_2=计算_余额(输入_余额、开始日期、结束日期、365、费率)
然后输出:
Bank of America Barclays Deutsche Bank NationalBanken \
time
2010-01-01 10000.0000 10000.000000 10000.0 10000.000000
2011-01-01 10200.0000 10075.000000 10000.0 10005.000000
2012-01-01 10404.0000 10150.562500 10000.0 10010.002500
2012-12-31 10612.0800 10226.691719 10000.0 10015.007501
2013-12-31 10824.3216 10303.391907 10000.0 10020.015005
UBS
time
2010-01-01 10000.000000
2011-01-01 9925.000000
2012-01-01 9850.562500
2012-12-31 9776.683281
2013-12-31 9703.358157
IIUC,你需要