Python 如何获得列“的最大差值”;“通过时间”;在数据帧中

Python 如何获得列“的最大差值”;“通过时间”;在数据帧中,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个名为“stock_data”的pandas数据框架,它有一个多索引('Date','StockID')和一列“Price”。行是按日期排序的,因此对于相同的股票,较晚的日期将具有较高的行索引。我想添加一个新列,每个股票(即按股票分组)都包含一个数字,该数字随时间变化在股票价格之间具有最大的正差值,如max_price-min_price 为了进一步解释这一点,可以通过以下公式计算O(股票*行^2)中的值: 在pandas中如何做到这一点,而不实际计算每个值,并将其一次一个地分配到data

我有一个名为“stock_data”的pandas数据框架,它有一个多索引('Date','StockID')和一列“Price”。行是按日期排序的,因此对于相同的股票,较晚的日期将具有较高的行索引。我想添加一个新列,每个股票(即按股票分组)都包含一个数字,该数字随时间变化在股票价格之间具有最大的正差值,如max_price-min_price

为了进一步解释这一点,可以通过以下公式计算O(股票*行^2)中的值:

在pandas中如何做到这一点,而不实际计算每个值,并将其一次一个地分配到dataframe新列的正确位置,就像上面的算法一样(这可能通过排序得到改进,但这不是重点)

到目前为止,我只知道我可以通过“StockID”进行分组:
stock\u data.groupby(level='stock')
并选择列
stock\u data.groupby(level='stock')['Price']
。但有点像:

stock_data.groupby(level='Stock')['Price'].max() - stock_data.groupby(level='Stock')['Price'].min()
不是我上面所描述的,因为没有最大值()必须在最小值()之后的重定义

编辑:接受的解决方案有效。现在我还想知道是否有一种方法可以通过最大值与最小值之间的距离来惩罚该距离,因此较短的收益比具有较大差异的长期收益更高(因此更可取)


例如,我们可以在min之后将cumsum()的长度增加到一定的长度,而不是直到最后?不知何故?

让我们尝试一下
[:-1]
来颠倒顺序,以便能够在“未来”中获得最大值,然后在
groupby
之后是
cummin
cummax

# sample data
np.random.seed(1)
stock_data = pd.DataFrame({'Price':np.random.randint(0,100, size=14)}, 
                          index=pd.MultiIndex.from_product(
                              [pd.date_range('2020-12-01', '2020-12-07', freq='D'), 
                               list('ab')], 
                              names=['date','stock'])
                         )
假设日期按时间顺序排列,您可以执行以下操作:

stock_data['diff'] = (df.loc[::-1, 'Price'].groupby(level='stock').cummax()
                      - df.groupby(level='stock')['Price'].cummin())
print(stock_data)
                  Price  diff
date       stock             
2020-12-01 a         37    42
           b         12    59
2020-12-02 a         72    42
           b          9    62
2020-12-03 a         75    42
           b          5    66
2020-12-04 a         79    42
           b         64    66
2020-12-05 a         16    60
           b          1    70
2020-12-06 a         76    60
           b         71    70
2020-12-07 a          6     0
           b         25    24

请尝试使用
cummax
cummin
,而不是在
groupby
之后使用
max
cummin
?不完全正确。这对于最小值很方便,但是对于最大值,我需要使用前面的值,并排除前面的值。如果我可以在反向价格值中应用cummax,可能会有用!我目前正在尝试,但在按对象反转组时遇到了问题。如果有人知道怎么做的话,告诉我吧?实际上我需要为每只股票分别做这件事。我尽力做到了,但这是错误的。。。这很难。你们能提供一个样本数据吗?太棒了。我认为它有效!我只是想也许我们需要在减法之前重新反转它?或者日期索引会自动处理吗?@Michael我一开始是这样做的,但是索引对齐应该自己完成:)太棒了,非常感谢@Michael,如果你编辑的话,我会看一看
滚动
,但像这样太模糊了。最好再问一个更详细的问题;)我想到了另一种方法,通过购买各种股票(其中一些股票可能会有短期峰值),直观地平衡这一点。不确定它最终会起多大作用。如果我以后还想编辑,我可能会提出一个单独的问题。
stock_data['diff'] = (df.loc[::-1, 'Price'].groupby(level='stock').cummax()
                      - df.groupby(level='stock')['Price'].cummin())
print(stock_data)
                  Price  diff
date       stock             
2020-12-01 a         37    42
           b         12    59
2020-12-02 a         72    42
           b          9    62
2020-12-03 a         75    42
           b          5    66
2020-12-04 a         79    42
           b         64    66
2020-12-05 a         16    60
           b          1    70
2020-12-06 a         76    60
           b         71    70
2020-12-07 a          6     0
           b         25    24