PANDAS:根据其他列值查找列的标准偏差

时间:2020-09-10 16:45:58

标签: python pandas numpy

正如您在下面看到的,我的数据框中有不同的“股票行情指示器”,我想计算“ lret”列的标准差,但要计算每个独立的股票行情指示器。目前,它正在将整列计算为一行。如何计算数据框中每个股票的标准差?任何帮助,将不胜感激。另外,请参见下面的函数,了解当前代码的作用。

数据帧输出

        price       date ticker      lret       std
0  104.000000 2016-07-01      A       NaN  0.019456
1  104.878151 2016-07-05      A  0.008408  0.019456
2  104.411909 2016-07-06      A -0.004455  0.019456
3  104.931957 2016-07-07      A  0.004968  0.019456
4  104.421274 2016-07-08      A -0.004879  0.019456
....
         price       date ticker      lret       std
499  85.293078 2017-06-26      B -0.008033  0.019456
500  86.521425 2017-06-27      B  0.014299  0.019456
501  85.596974 2017-06-28      B -0.010742  0.019456
502  86.384999 2017-06-29      B  0.009164  0.019456
503  87.479757 2017-06-30      B  0.012593  0.019456

功能

def get_most_volatile(prices):
    """Return the ticker symbol for the most volatile stock.
    
    Parameters
    ----------
    prices : pandas.DataFrame
        a pandas.DataFrame object with columns: ['ticker', 'date', 'price']
    
    Returns
    -------
    ticker : string
        ticker symbol for the most volatile stock
    """ 
    # lret = Log Returns.
    # I would like to find the standard deviation for the log returns for each ticker in the dataframe
    prices['lret'] = np.log(prices['price'] / prices['price'].shift(1))
    prices['std'] = prices['lret'].std(skipna=True)

2 个答案:

答案 0 :(得分:1)

您需要使用df.groupby来获取需要分组的功能组合的分组。然后,如果要计算每个组的某些聚合,则可以使用.agg.transform

使用.agg将创建一个具有唯一组(在此情况下为股票代号)和聚合函数结果的新df。

使用.transform将计算相同的聚合,但将广播到与self具有相同形状的数据帧/系列(本身就是被分组的数据帧)。

prices['std'] = prices.groupby('ticker')['lret'].transform('std')

groupby之后的通知['lret']仅在计算任何聚合之前选择该列。

输出

        price        date ticker      lret       std
0  104.000000  2016-07-01      A       NaN  0.006707
1  104.878151  2016-07-05      A  0.008408  0.006707
2  104.411909  2016-07-06      A -0.004455  0.006707
3  104.931957  2016-07-07      A  0.004968  0.006707
4  104.421274  2016-07-08      A -0.004879  0.006707
5   85.293078  2017-06-26      B -0.008033  0.011908
6   86.521425  2017-06-27      B  0.014299  0.011908
7   85.596974  2017-06-28      B -0.010742  0.011908
8   86.384999  2017-06-29      B  0.009164  0.011908
9   87.479757  2017-06-30      B  0.012593  0.011908

一个类似的例子,但是使用.agg

# st_dev = prices.groupby('ticker')['lret'].std() # for std deviation
# or
# st_dev = prices.groupby('ticker')['lret'].agg('std') # for std deviation
# or even
st_dev = prices.groupby('ticker')['lret'].agg(['mean', 'std']) # for mean and std deviation

输出

            mean       std
ticker
A       0.001011  0.006707
B       0.003456  0.011908

Groupby section of the user guide中了解更多信息。

有关控制std中的自由度的信息,请参见this question

答案 1 :(得分:0)

使用熊猫的groupby操作:

从DataFrame df开始:

standard_deviations = df.groupby('ticker').std()