如何在索引点之前获取五行并计算平均值并在具有日期索引的pandas数据帧中的下一行中存储

时间:2017-10-10 23:11:03

标签: python pandas

我有这样的数据 enter image description here

我需要计算前5天的“平仓”价格的平均值,并将其存储在下一行的新列“Average_price”中。 对于1950-01-10,我需要计算从1950-01-03到1950-01-09并在1950-01-10中输入'Average_price'。

3 个答案:

答案 0 :(得分:1)

设置

stock_data = pd.DataFrame({
    'Open':      [16.66, 16.85, 16.93, 16.98, 17.08] * 2,
    'High':      [16.66, 16.85, 16.93, 16.98, 17.08] * 2,
    'Low':       [16.66, 16.85, 16.93, 16.98, 17.08] * 2,
    'Close':     [16.66, 16.85, 16.93, 16.98, 17.08] * 2,
    'Volume':    [1260000.0, 1890000.0, 2550000.0, 2010000.0, 2520000.0] * 2,
    'Adj Close': [16.66, 16.85, 16.93, 16.98, 17.08] * 2
}, pd.date_range('1950-01-03', periods=10, freq='B'))

<强>解决方案
使用pd.Series.rollingpd.Series.shift

的组合
stock_data.assign(
    Average_price=
        stock_data['Adj Close'].rolling(5).mean().shift()
)

            Adj Close  Close   High    Low   Open     Volume  Average_price
1950-01-03      16.66  16.66  16.66  16.66  16.66  1260000.0            NaN
1950-01-04      16.85  16.85  16.85  16.85  16.85  1890000.0            NaN
1950-01-05      16.93  16.93  16.93  16.93  16.93  2550000.0            NaN
1950-01-06      16.98  16.98  16.98  16.98  16.98  2010000.0            NaN
1950-01-09      17.08  17.08  17.08  17.08  17.08  2520000.0            NaN
1950-01-10      16.66  16.66  16.66  16.66  16.66  1260000.0           16.9
1950-01-11      16.85  16.85  16.85  16.85  16.85  1890000.0           16.9
1950-01-12      16.93  16.93  16.93  16.93  16.93  2550000.0           16.9
1950-01-13      16.98  16.98  16.98  16.98  16.98  2010000.0           16.9
1950-01-16      17.08  17.08  17.08  17.08  17.08  2520000.0           16.9

答案 1 :(得分:0)

我在pandas

中使用pd.rolling()方法得到了答案
avg_price=stock_data.rolling(window=5).mean().shift()['Close']
stock_data['Average_Close_5_days']=avg_price

滚动方法也采用当前行,所以我不得不将行移一行来存储正确的值。

答案 2 :(得分:-1)

这是@piRSquared的一个非常复杂的答案。

我通常使用.loc,因为它更适合索引,并且副本

没有问题
stock_data.loc[:, 'Average_price'] = stock_data.loc[:, 'Adj Close'].rolling(window = 5).mean().shift()