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

如何修正苹果股票价格简单移动平均线(SMA)绘制失败问题?

问题分析与修正方案

嘿,我瞅了你的代码,绘图失败的核心问题出在日期索引的处理上,咱们一步步说清楚:

错误原因拆解

  • 日期列未转为datetime类型并设为索引:你把data['Date'] = pd.to_datetime(data['Date'])注释掉了,就算没注释,也没将Date列设置为DataFrame的索引。现在你的DataFrame用的是默认的整数索引,用start_date:end_date这种字符串日期去切片根本匹配不到数据,自然画不出图。
  • 滚动平均计算冗余:直接用data.rolling(...)会对所有列计算滚动平均,但你只需要针对Close列,这样做既浪费资源又容易出问题。

修正后的代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import seaborn as sns

sns.set(style='darkgrid', context='talk', palette='Dark2')
my_year_month_fmt = mdates.DateFormatter('%m/%y')

# 读取数据并处理日期索引
data = pd.read_csv('C:\\AAPL.csv')
data['Date'] = pd.to_datetime(data['Date'])  # 把Date转为datetime类型
data.set_index('Date', inplace=True)  # 将Date设为DataFrame的索引

# 仅对Close列计算滚动平均
short_rolling = data['Close'].rolling(window=20).mean()
long_rolling = data['Close'].rolling(window=100).mean()

start_date = '2010-01-04'
end_date = '2019-12-31'

fig, ax = plt.subplots(figsize=(16,9))
ax.plot(data.loc[start_date:end_date, 'Close'], label='Price')
ax.plot(long_rolling.loc[start_date:end_date], label = '100-days SMA')
ax.plot(short_rolling.loc[start_date:end_date], label = '20-days SMA')

ax.legend(loc='best')
ax.set_ylabel('Price in $')
ax.xaxis.set_major_formatter(my_year_month_fmt)
plt.show()

额外说明

  • 我把日期格式改成了YYYY-MM-DD,这是pandas识别datetime的标准格式,避免因地区格式差异导致的解析错误;
  • 现在用日期索引切片start_date:end_date就能精准定位到你想要的时间范围了;
  • 滚动平均只针对Close列计算,代码更简洁高效。

内容的提问来源于stack exchange,提问作者Mark K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 21:43:11