为了账号安全,请及时绑定邮箱和手机立即绑定

基于当前行和之后的 N 行的计算列

基于当前行和之后的 N 行的计算列

HUH函数 2023-06-13 14:56:37
我正在处理 1000 多行股票数据,目前正在将其加载到数据框中(我也是使用 pandas 的新手,但目前它很棒,我仍在学习):          open      high       low     close    volume        date0     339.0500  339.6100  336.6200  337.2300  68054244  2020-08-191     338.3400  339.1000  336.6100  338.6400  38733908  2020-08-182     337.9400  338.3400  336.8517  337.9100  34496002  2020-08-173     336.4100  337.4200  335.6200  336.8400  47260390  2020-08-144     336.6100  338.2514  335.8300  336.8300  41816146  2020-08-13...        ...       ...       ...       ...       ...         ...5229  138.6250  139.1093  136.7812  137.8750   7431500  1999-11-055230  136.7500  137.3593  135.7656  136.5312   7907500  1999-11-045231  136.0000  136.3750  135.1250  135.5000   7222300  1999-11-035232  135.9687  137.2500  134.5937  134.5937   6516900  1999-11-025233  136.5000  137.0000  135.5625  135.5625   4006500  1999-11-01我有一个简单移动平均线的动态平均值数组,我想根据列的动态选择对每一行执行该计算,例如,我选择了一个基于列的 5 天简单移动平均线open:          open      high       low     close    volume        date       5-day avg0      |339.0500|  339.6100  336.6200  337.2300  68054244  2020-08-19      |337.67|1     >|338.3400|  339.1000  336.6100  338.6400  38733908  2020-08-18     >297.5852     >|337.9400|  338.3400  336.8517  337.9100  34496002  2020-08-17       ...3     >|336.4100|  337.4200  335.6200  336.8400  47260390  2020-08-14       ...4     >|336.6100|  338.2514  335.8300  336.8300  41816146  2020-08-13       ...5229  >138.6250  139.1093  136.7812  137.8750   7431500  1999-11-05         ...我最接近的是:for avg in avgs:            overview[avg] = {}            for i in range(avg):                overview[avg][i] = {}                overview[avg][i] = df.loc[df['date'] <= str((date - td(days=(avg - i)))), ['close']].head(avg).sum(numeric_only=True).div(avg).to_json()但我觉得它有点笨拙,不是一种非常有效的方法。我看过做:df['5-Day Avg'] = df['open'].head(5).sum().div(5) ....但是不会做我想做的事情,因为我不断地从顶部而不是从当前索引中抓取。
查看完整描述

2 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

您可以对值进行排序并使用df.rolling(5)['open'].mean()


df = df.sort_values('date')

df['5-day avg'] = df.rolling(5)['open'].mean()

df = df.sort_values('date', ascending=False)

df

Out[184]: 

          open      high       low     close    volume        date  5-day avg

0     339.0500  339.6100  336.6200  337.2300  68054244  2020-08-19  337.67000

1     338.3400  339.1000  336.6100  338.6400  38733908  2020-08-18  297.58500

2     337.9400  338.3400  336.8517  337.9100  34496002  2020-08-17  257.26700

3     336.4100  337.4200  335.6200  336.8400  47260390  2020-08-14  216.87900

4     336.6100  338.2514  335.8300  336.8300  41816146  2020-08-13  176.79074

5229  138.6250  139.1093  136.7812  137.8750   7431500  1999-11-05  136.76874

5230  136.7500  137.3593  135.7656  136.5312   7907500  1999-11-04        NaN

5231  136.0000  136.3750  135.1250  135.5000   7222300  1999-11-03        NaN

5232  135.9687  137.2500  134.5937  134.5937   6516900  1999-11-02        NaN

5233  136.5000  137.0000  135.5625  135.5625   4006500  1999-11-01        NaN


查看完整回答
反对 回复 2023-06-13
?
慕的地8271018

TA贡献1796条经验 获得超4个赞

在具有窗口大小的熊猫中尝试滚动方法来计算滚动平均值并移动结果。

df['5-Day Avg'] = df['open'].rolling(5).mean().shift(periods=-4)



查看完整回答
反对 回复 2023-06-13
  • 2 回答
  • 0 关注
  • 96 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信