Python 返回矩阵超出索引

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

我有一个年度指数,想计算每一年组合的回报矩阵。起始年(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])
我目前能够在列表设置中解决这个问题,我想知道是否有更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来了解这里发生了什么