正如您在下面看到的,我的数据框中有不同的“股票行情指示器”,我想计算“ 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)
答案 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)