Python Pandas面板数据-确定年度差距并计算回报

Python Pandas面板数据-确定年度差距并计算回报,python,pandas,data-science,finance,panel-data,Python,Pandas,Data Science,Finance,Panel Data,我正在处理大量的财务信息面板数据,但是这些数据值有点参差不齐。我试图计算面板数据中每只股票每年之间的回报率。然而,由于缺少值,有时公司会有年间隔,这使得:df['stock\u ret']=df.groupby(['tic'])['stock\u price'].pct\u change()不可能执行,因为这可能是错误的。df看起来像这样(仅举一个例子): 我要找的是一段代码,它能让我理解(每个公司)数据中是否存在任何差距,并计算两个不同系列的回报。就这样, datadate

我正在处理大量的财务信息面板数据,但是这些数据值有点参差不齐。我试图计算面板数据中每只股票每年之间的回报率。然而,由于缺少值,有时公司会有年间隔,这使得:
df['stock\u ret']=df.groupby(['tic'])['stock\u price'].pct\u change()
不可能执行,因为这可能是错误的。df看起来像这样(仅举一个例子):

我要找的是一段代码,它能让我理解(每个公司)数据中是否存在任何差距,并计算两个不同系列的回报。就这样,

       datadate      month     fyear    ticker    price   return
0    31/12/1998         12      1998      AAPL   188.92      NaN 
1    31/12/1999         12      1999      AAPL   197.44   0.0451
2    31/12/2002         12      2002      AAPL   268.13      NaN
3    31/12/2003         12      2003      AAPL   278.06   0.0370
4    31/12/2004         12      2004      AAPL   288.35   0.0370
5    31/12/2005         12      2005      AAPL   312.23   0.0828
6    31/05/2008          5      2008      TSLA    45.67      NaN
7    31/05/2009          5      2009      TSLA    38.29  -0.1616
8    31/05/2010          5      2010      TSLA    42.89   0.1201
9    31/05/2011          5      2011      TSLA    56.03   0.3063
10   31/05/2014          5      2014      TSLA   103.45      NaN
..       ...            ..       ..        ..      ..
如果您对如何处理此问题有任何其他建议,请随时分享您的知识:)我有点经验不足,因此我相信您的建议会有所帮助


提前谢谢大家

您可以创建一个掩码,告知上一年是否存在,并使用pct更改更新这些年份:

df['return'] = np.nan
mask = df.groupby('ticker')['fyear'].apply(lambda x: x.shift(1)==x-1)
df.loc[mask,'return'] = df.groupby('ticker')['price'].pct_change()

嘿@Bruno Mello,很抱歉,您共享的代码不起作用:P keyear:“fyear”是python返回的!你知道怎么了吗?你的年份栏的名字就是这个,不是吗@tigio!u是的,我的专栏名是“fyear”,这就是为什么我觉得它很奇怪:P如果可以的话,我会附上错误的截图,因为它的描述相当长。我是说,你在笔记本上试过了吗@布鲁诺:是的,我做到了!工作正常,错误发生在哪里?在
x['fprice']
部分或在行的末尾?x['fprice']?代码中没有这样的命令:P它告诉我:“在处理上述异常期间,发生了另一个异常”@Bruno Mello
df['return'] = np.nan
mask = df.groupby('ticker')['fyear'].apply(lambda x: x.shift(1)==x-1)
df.loc[mask,'return'] = df.groupby('ticker')['price'].pct_change()