Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 平衡利息的功能_Python 3.x_Pandas - Fatal编程技术网

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,你需要