Python 返回矩阵超出索引
我有一个年度指数,想计算每一年组合的回报矩阵。起始年(2000年)作为起始值Python 返回矩阵超出索引,python,pandas,Python,Pandas,我有一个年度指数,想计算每一年组合的回报矩阵。起始年(2000年)作为起始值 import pandas as pd df = pd.DataFrame({'year': [2000, 2001, 2002, 2003, 2004], 'Value': [100, 105, 110, 120, 107]}, index=[1, 2, 3, 4, 5]) 我目前能够在列表设置中解决这个问题,我想知道是否有更pyhton
import pandas as pd
df = pd.DataFrame({'year': [2000, 2001, 2002, 2003, 2004],
'Value': [100, 105, 110, 120, 107]},
index=[1, 2, 3, 4, 5])
我目前能够在列表设置中解决这个问题,我想知道是否有更pyhtonic的方法
value = 100.00
return_list = []
years = df["year"].tolist()
df_len = len(years) - 1
for index, row in df[1:].iterrows():
year = row["year"]
df[year] = df["Value"] / value - 1
returns = df[year].tolist()
if len(returns) < df_len:
dif = df_len - len(returns)
returns = dif * [0] + returns
else:
returns = returns[1:]
return_list.append(returns)
value = row["Value"]
df = df[df["year"] > year]
df = pd.DataFrame(return_list, columns=years[1:])
df = df.set_index(df.columns)
value=100.00
return_list=[]
年份=df[“年”]。tolist()
df_len=len(年)-1
对于索引,df[1:]中的行。iterrows()
年=行[“年”]
df[年]=df[“值”]/值-1
returns=df[year].tolist()
如果len(返回)year]
df=pd.DataFrame(返回列表,列=years[1:])
df=df.set_索引(df.columns)
这看起来像是“值”列中的每个值,除以其他值,然后减去1。您可以使用numpy
执行此操作:
import numpy as np
a = df['Value'].to_numpy()
vals = (a / a[:, None]) - 1
如果您只对上部三角形感兴趣(如示例中所示),可以执行以下操作:
vals = np.triu(vals)
然后,您可以从新的numpy阵列创建数据帧:
results = pd.DataFrame(vals, columns=df['year'], index=df['year'])
给予:
year 2000 2001 2002 2003 2004
year
2000 0.0 0.05 0.100000 0.200000 0.070000
2001 0.0 0.00 0.047619 0.142857 0.019048
2002 0.0 0.00 0.000000 0.090909 -0.027273
2003 0.0 0.00 0.000000 0.000000 -0.108333
2004 0.0 0.00 0.000000 0.000000 0.000000
我认为最难理解的是这句话:
vals = (a / a[:, None]) - 1
值得一读numpy来了解这里发生了什么