python - 如何更改时间序列中的索引频率
问题描述
我正在使用 yfinance 库来导入给定股票的数据。请参见下面的代码:
import yfinance as yf
from datetime import datetime as dt
import pandas as pd
# Naming Constants
stock = "AAPL"
start_date = "2014-01-01"
end_date = "2018-01-01"
# Importing all the data into a dataFrame
stock_data = yf.download(stock, start=start_date, end=end_date)
当我打电话时,print(stock_data.index)
我有以下内容:
DatetimeIndex(['2014-01-02', '2014-01-03', '2014-01-06', '2014-01-07', '2014-01-08', '2014-01-09', '2014-01-10', '2014-01-13', '2014-01-14', '2014-01-15',
...
'2017-12-15', '2017-12-18', '2017-12-19', '2017-12-20', '2017-12-21', '2017-12-22', '2017-12-26', '2017-12-27', '2017-12-28', '2017-12-29'],
dtype='datetime64[ns]', name='Date', length=1007, freq=None)
我希望将频率参数从无切换到每天,因为每个日期都指一个交易日。
当我说stock_data.index.freq = 'B'
我收到以下错误时:
ValueError: Inferred frequency None from passed values does not conform to passed frequency B
如果我输入 stock_data = stock_data.asfreq('B'),它会改变频率,但它会添加最初不存在的某些行并用 NA 值填充它们。
换句话说,交易日使用的偏移 ALIAS 是多少?
您可以在此处从 Pandas 文档中找到别名列表:https ://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#offset-aliases
解决方案
错误stock_data.index.freq = 'B'
表明您的时间序列频率不是“工作日”,而是未定义或“无”。
和
stock_data = stock_data.asfreq('B')
您正在将时间序列重新索引为业务每日频率:将添加缺少的时间戳,并将缺少的股票数据值设置为 NaN。现在你需要决定如何替换它们,所以看看这里:pandas.DataFrame.asfreq。因此,您可以将所有 NaN 替换为固定值(例如 -999),但一般而言,您想要对股票数据执行的操作是在给定时间点获取最后一个有效值,这是向前填补空白:
stock_data = stock_data.asfreq('B', method='ffill')
总是值得阅读文档。
推荐阅读
- angular - 来自解析器的 Angular 7 rxjs 订阅有什么问题
- excel - 在使用 VBA 循环遍历范围时查找确切的字符串
- ng-modules - Angular 8:没有为组件找到组件工厂-甚至在 app.module.ts 中添加
- excel - 如何检查此代码中是否存在工作表
- group-by - 如何不让 dplyr 变异计算缺失组
- php - 如何在 Laravel 应用程序中使一个类全局可访问?
- vue.js - Vue 组件中 HTML 元素 id 的作用域
- swift - Swift (macOS):使用文件启动 TextEdit
- java - 如何从 Web 应用程序中预选特定打印机
- angular - shareReplay 更改顺序