python多次随机抽样的平均值

python average of random sample many times

我正在与 pandas 合作,我希望从 每个交易日期 抽取 2 只股票,并将平均值 "Stock_Change" 和根据抽取的样本(在这种情况下,每天 2 只股票),所讨论的给定日期的平均值 "Vol_Change"。实际数据要大得多,跨越数年和数百个名字。我的样本将有 100 个名字,为了这个问题我只使用 2 个。

样本数据集:

In [3]:

df
​
Out[3]:
        Date Symbol  Stock_Change  Vol_Change
0   1/1/2008      A         -0.05        0.07
1   1/1/2008      B         -0.06        0.17
2   1/1/2008      C         -0.05        0.07
3   1/1/2008      D          0.05        0.13
4   1/1/2008      E         -0.03       -0.10
5   1/2/2008      A          0.03       -0.17
6   1/2/2008      B          0.08        0.34
7   1/2/2008      C          0.03        0.17
8   1/2/2008      D          0.06        0.24
9   1/2/2008      E          0.02        0.16
10  1/3/2008      A          0.02        0.05
11  1/3/2008      B          0.01        0.39
12  1/3/2008      C          0.05       -0.17
13  1/3/2008      D         -0.01        0.37
14  1/3/2008      E         -0.06        0.23
15  1/4/2008      A          0.03        0.31
16  1/4/2008      B         -0.07        0.16
17  1/4/2008      C         -0.06        0.29
18  1/4/2008      D          0.00        0.09
19  1/4/2008      E          0.00       -0.02
20  1/5/2008      A          0.04       -0.04
21  1/5/2008      B         -0.06        0.16
22  1/5/2008      C         -0.08        0.07
23  1/5/2008      D          0.09        0.16
24  1/5/2008      E          0.06        0.18
25  1/6/2008      A          0.00        0.22
26  1/6/2008      B          0.08       -0.13
27  1/6/2008      C          0.07        0.18
28  1/6/2008      D          0.03        0.32
29  1/6/2008      E          0.01        0.29
30  1/7/2008      A         -0.08       -0.10
31  1/7/2008      B         -0.09        0.23
32  1/7/2008      C         -0.09        0.26
33  1/7/2008      D          0.02       -0.01
34  1/7/2008      E         -0.05        0.11
35  1/8/2008      A         -0.02        0.36
36  1/8/2008      B          0.03        0.17
37  1/8/2008      C          0.00       -0.05
38  1/8/2008      D          0.08       -0.13
39  1/8/2008      E          0.07        0.18

另外一点,样本不能多次包含相同的安全性(没有替换的样本)。我的猜测是这是一个很好的 R 问题,但我不知道关于 R 的最后一件事。 .

我什至不知道如何开始这个问题。

在此先感谢您的帮助。

OP 编辑​​

我试过了,但似乎无法让它在分组数据框(按符号和日期分组)上工作:

In [35]:

import numpy as np
import pandas as pd
from random import sample
​
# create random index
​
rindex =  np.array(sample(range(len(df)), 10))
​
# get 10 random rows from df
dfr = df.ix[rindex]
In [36]:

dfr
Out[36]:
        Date Symbol Stock_Change Vol_Change
6   1/2/2008      B           8%        34%
1   1/2/2008      B          -6%        17%
37  1/3/2008      C           0%        -5%
25  1/1/2008      A           0%        22%
3   1/4/2008      D           5%        13%
12  1/3/2008      C           5%       -17%
10  1/1/2008      A           2%         5%
2   1/3/2008      C          -5%         7%
26  1/2/2008      B           8%       -13%
17  1/3/2008      C          -6%        29%

OP 编辑​​#2

当我阅读这个问题时,我意识到我可能不是很清楚。我想要做的是每天对数据进行多次采样(称之为 X),实际上最终以 X 次“# of dates”作为我的新数据集。这可能看起来对我显示的数据没有意义,但我的实际数据有 500 个名字和 2 年 (2x365 = 730) 的日期,我希望每天抽取 50 个随机名字,总共 50 x 730 = 36500 个数据点。

first attempt gave this:
In [10]:

# do sampling: get a random subsample with size 3 out of 5 symbols for each date
# ==============================
def get_subsample(group, sample_size=3):
    symbols = group.Symbol.values
    symbols_selected = np.random.choice(symbols, size=sample_size, replace=False)
    return group.loc[group.Symbol.isin(symbols_selected)]
​
df.groupby(['Date']).apply(get_subsample).reset_index(drop=True)
​
Out[10]:
        Date Symbol Stock_Change Vol_Change
0   1/1/2008      A          -5%         7%
1   1/1/2008      A           3%       -17%
2   1/1/2008      A           2%         5%
3   1/1/2008      A           3%        31%
4   1/1/2008      A           4%        -4%
5   1/1/2008      A           0%        22%
6   1/1/2008      A          -8%       -10%
7   1/1/2008      A          -2%        36%
8   1/2/2008      B          -6%        17%
9   1/2/2008      B           8%        34%
10  1/2/2008      B           1%        39%
11  1/2/2008      B          -7%        16%
12  1/2/2008      B          -6%        16%
13  1/2/2008      B           8%       -13%
14  1/2/2008      B          -9%        23%
15  1/2/2008      B           3%        17%
16  1/3/2008      C          -5%         7%
17  1/3/2008      C           3%        17%
18  1/3/2008      C           5%       -17%
19  1/3/2008      C          -6%        29%
20  1/3/2008      C          -8%         7%
21  1/3/2008      C           7%        18%
22  1/3/2008      C          -9%        26%
23  1/3/2008      C           0%        -5%
24  1/4/2008      D           5%        13%
25  1/4/2008      D           6%        24%
26  1/4/2008      D          -1%        37%
27  1/4/2008      D           0%         9%
28  1/4/2008      D           9%        16%
29  1/4/2008      D           3%        32%
30  1/4/2008      D           2%        -1%
31  1/4/2008      D           8%       -13%
32  1/5/2008      E          -3%       -10%
33  1/5/2008      E           2%        16%
34  1/5/2008      E          -6%        23%
35  1/5/2008      E           0%        -2%
36  1/5/2008      E           6%        18%
37  1/5/2008      E           1%        29%
38  1/5/2008      E          -5%        11%
39  1/5/2008      E           7%        18%
import pandas as pd
import numpy as np

# replicate your data structure
# ==============================
np.random.seed(0)
dates = pd.date_range('2008-01-01', periods=100, freq='B')
symbols = 'A B C D E'.split()
multi_index = pd.MultiIndex.from_product([dates, symbols], names=['Date', 'Symbol'])
stock_change = np.random.randn(500)
vol_change = np.random.randn(500)
df = pd.DataFrame({'Stock_Change': stock_change, 'Vol_Change': vol_change}, index=multi_index).reset_index()



# do sampling: get a random subsample with size 3 out of 5 symbols for each date
# ==============================
def get_subsample(group, X=100, sample_size=3):
    frame = pd.DataFrame(columns=['sample_{}'.format(x) for x in range(1,X+1)])
    for col in frame.columns.values:
        frame[col] = group.loc[group.Symbol.isin(np.random.choice(symbols, size=sample_size, replace=False)), ['Stock_Change', 'Vol_Change']].mean()
    return frame.mean(axis=1)


result = df.groupby(['Date']).apply(get_subsample)

    Out[169]: 
            Stock_Change  Vol_Change
Date                                
2008-01-01        1.3937      0.2005
2008-01-02        0.0406     -0.7280
2008-01-03        0.6073     -0.2699
2008-01-04        0.2310      0.7415
2008-01-07        0.0718     -0.7269
2008-01-08        0.3808     -0.0584
2008-01-09       -0.5595     -0.2968
2008-01-10        0.3919     -0.2741
2008-01-11       -0.4856      0.0386
2008-01-14       -0.4700     -0.4090
...                  ...         ...
2008-05-06        0.1510      0.1628
2008-05-07       -0.1452      0.2824
2008-05-08       -0.4626      0.2173
2008-05-09       -0.2984      0.6324
2008-05-12       -0.3817      0.7698
2008-05-13        0.5796     -0.4318
2008-05-14        0.2875      0.0067
2008-05-15        0.0269      0.3559
2008-05-16        0.7374      0.1065
2008-05-19       -0.4428     -0.2014

[100 rows x 2 columns]