You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:36:03