python - 带日期的 Python EWMA
问题描述
我有一个看起来像这样的数据框:
Date AAPL TSLA NESN FB ROCH TOT VISA JPM
2/1/2019 0.00259 0.00164 0.00122 0.00179 0.00116 0.00023 0.00145 0.00141
3/1/2019 -0.09961 -0.03147 0.02545 -0.02904 0.02241 0.00227 -0.03604 -0.02215
4/1/2019 0.04269 0.0577 0.01679 0.04714 0.01017 0.0293 0.04308 0.03687
7/1/2019 -0.00223 0.05436 -0.01053 0.00072 -0.00881 -0.00184 0.01803 0.0007
8/1/2019 0.01906 0.00116 0.00314 0.03245 0.02633 -0.00313 0.00544 -0.00189
9/1/2019 0.01698 0.00948 0.00928 0.01193 0.00093 0.02196 0.01177 -0.00169
10/1/2019 0.0032 0.01902 0.00776 -0.00021 0.00679 -0.00758 0.00188 -1.00E-04
11/1/2019 -0.00982 0.00664 0.00142 -0.00277 -0.00583 -0.01947 -0.0044 -0.00478
14/1/2019 -0.01504 -0.03703 -0.00095 0.01106 -0.00247 0.00761 -0.00695 0.01031
15/1/2019 0.02047 0.02999 0.00308 0.02449 0.00495 -0.00902 0.00175 0.00733
16/1/2019 0.01222 0.0047 -0.00803 -0.00947 -0.00154 -0.0039 0 0.00806
17/1/2019 0.00594 0.00364 0.00607 0.00515 -0.00062 0.00299 -0.00044 0.0041
我想最终得到一个由 EWMA(lambda:0.94)组成的数组,用于我考虑的每只股票,作为我时间序列的最后一天。我能够使用常规升序索引(0、1、2、3 等)来获得它,但是在处理日期时遇到了问题。
谢谢你的帮助。
解决方案
首先,我创建了数据框;将日期更改为类型日期时间;并将 Date 设为索引:
from io import StringIO
import pandas as pd
data = '''Date AAPL TSLA NESN FB ROCH TOT VISA JPM
2/1/2019 0.00259 0.00164 0.00122 0.00179 0.00116 0.00023 0.00145 0.00141
3/1/2019 -0.09961 -0.03147 0.02545 -0.02904 0.02241 0.00227 -0.03604 -0.02215
4/1/2019 0.04269 0.0577 0.01679 0.04714 0.01017 0.0293 0.04308 0.03687
7/1/2019 -0.00223 0.05436 -0.01053 0.00072 -0.00881 -0.00184 0.01803 0.0007
8/1/2019 0.01906 0.00116 0.00314 0.03245 0.02633 -0.00313 0.00544 -0.00189
9/1/2019 0.01698 0.00948 0.00928 0.01193 0.00093 0.02196 0.01177 -0.00169
10/1/2019 0.0032 0.01902 0.00776 -0.00021 0.00679 -0.00758 0.00188 -1.00E-04
11/1/2019 -0.00982 0.00664 0.00142 -0.00277 -0.00583 -0.01947 -0.0044 -0.00478
14/1/2019 -0.01504 -0.03703 -0.00095 0.01106 -0.00247 0.00761 -0.00695 0.01031
15/1/2019 0.02047 0.02999 0.00308 0.02449 0.00495 -0.00902 0.00175 0.00733
16/1/2019 0.01222 0.0047 -0.00803 -0.00947 -0.00154 -0.0039 0 0.00806
17/1/2019 0.00594 0.00364 0.00607 0.00515 -0.00062 0.00299 -0.00044 0.0041
'''
df = pd.read_csv(StringIO(data), sep='\s+', engine='python')
df['Date'] = pd.to_datetime(df['Date'], format='%d/%m/%Y')
df = df.set_index('Date')
然后,我应用了这个ewm().mean()
方法。您可以在 ewm() 方法中指定不同的参数,因为 span 可能不是您想要的
df.ewm(span=2).mean().iloc[-1]
AAPL 0.007770
TSLA 0.004901
NESN 0.002509
FB 0.003415
ROCH -0.000471
TOT 0.000485
VISA -0.000351
JPM 0.005281
Name: 2019-01-17 00:00:00, dtype: float64
最后,我相信它ewma()
在 pandas 中已被弃用(我的示例已使用 pandas 1.0.5 进行了测试)。
推荐阅读
- javascript - 将对象数组附加到 HTML 文件中
- java - List all subpackages of a package (when their classes are loaded dynamically)
- amazon-web-services - Terraform 用户 TF_VAR 不工作的嵌套模块
- django - Django how to link tableCheckBoxColumn to DB entry
- azure - Read a csv in azure notebooks
- sql-server - SSRS - 如何将日期/时间参数的格式设置为 yyyy-mm-dd hh:mm:ss?
- c# - 注册表项 EditionID 在 WOW6432Node 下的值错误 - 有意还是错误?如何绕过?
- php - 如何在从 fpdm(Fpdf) 库类生成的 PDF 中设置密码?
- angular - 使用搜索栏过滤 Firebase 列表时出错
- powerapps - PowerApps:如何使用 1:N 关系修补多个 CDS 实体?