如何修正苹果股票价格简单移动平均线(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
相关产品推荐
相关产品推荐

