Python如何基于日期为股票数据设置离群值以绘制异常波动图
基于日期设置股票收盘价离群值的解决方法
核心问题原因
你之前用y["2019"]=40不生效的根本原因是:单独提取的y = AAPL['Close/Last']是一个以行号为默认索引的Series,并没有绑定日期作为索引,所以无法通过日期字符串定位到对应数据。
解决步骤
第一步:将日期列设为DataFrame的索引
读取数据后先做日期格式转换,再把日期列设为整个数据表的索引,之后就可以直接通过日期定位数据:
AAPL = pd.read_csv('AAPL.csv', header=0) # 转换日期格式并设为索引 AAPL['Date'] = pd.to_datetime(AAPL['Date']) AAPL = AAPL.set_index('Date')
第二步:按日期设置离群值
两种常用场景的写法:
- 单个指定日期设置离群值
# 比如将2019年1月2日的收盘价设为40 AAPL.loc["2019-01-02", "Close/Last"] = 40 # 比如将2020年3月10日的收盘价设为1.4 AAPL.loc["2020-03-10", "Close/Last"] = 1.4
- 按年份批量设置离群值
如果需要给2019年所有交易日、或者2020年之后的所有交易日按规则设置离群值,可以直接按年份筛选:
# 将2019年所有收盘价低于10的记录设为离群值5 AAPL.loc["2019", "Close/Last"][AAPL.loc["2019", "Close/Last"] < 10] = 5 # 将2020年之后所有收盘价高于100的记录设为离群值150 AAPL.loc["2020":, "Close/Last"][AAPL.loc["2020":, "Close/Last"] > 100] = 150
修改后的完整可运行代码
from pandas import read_csv import pandas as pd import matplotlib.pyplot as plt # 导入数据并处理日期索引 AAPL= pd.read_csv('AAPL.csv', header=0) AAPL['Date'] = pd.to_datetime(AAPL['Date']) AAPL = AAPL.set_index('Date') # 绘制原始收盘价走势图 plt.figure(figsize=(15,7)) plt.plot(AAPL.index, AAPL['Close/Last'], label="Close") plt.title("AAPL") plt.xlabel("Time") plt.ylabel("Close") plt.xticks(rotation=0) plt.grid() plt.show() # 按日期设置离群值 AAPL.loc["2019-01-02", "Close/Last"] = 40 AAPL.loc["2020-03-10", "Close/Last"] = 1.4 AAPL.loc["2021-07-20", "Close/Last"] = 55 n_outliers = 3 # 绘制带离群值的走势图 plt.figure(figsize=(15,7)) plt.plot(AAPL.index, AAPL['Close/Last']) plt.scatter(AAPL.index, AAPL['Close/Last']) plt.grid() plt.ylabel('Close Price') plt.xlabel('Date') plt.show()
注意事项
- 不要单独提取
x和y做修改,直接基于设置了日期索引的DataFrame操作,避免出现副本修改不生效的问题 - 如果你的CSV里日期是
日/月/年的非标准格式,转换时需要加format参数指定格式:pd.to_datetime(AAPL['Date'], format="%d/%m/%Y")
内容的提问来源于stack exchange,提问作者Bordento22
相关产品推荐
相关产品推荐

