我的Python心路历程 第十期 (10.13 股票实战可视化之单股年度趋势类比)

我的Python心路历程 第十期 (10.13 股票实战可视化之单股年度趋势类比)

通常我们在很多地方所能看到的大都是单只某时间段(可以是多年)的横向(日、周、月)趋势分析,但按照年度为跨度来进行多年度的数据维度类比似乎没有人做过,今天我就尝试一下吧,难点在于数据获取和整理。

假设两只股的Adj Close数据已经汇聚在fileName中,整体代码如下:
#按照年度为维度来进行多年数据类比分析
def yearsAnsfor1Stock(comName=None, fileName=None):
# 获取绝对路径,data为当前文件夹
curpath = os.path.join(os.path.dirname(file), ‘data’)
#topfile_path = ‘’
#定义top文件路径
if fileName == None:
topfile_path = os.path.join(curpath, ‘top.csv’)
else:
topfile_path = os.path.join(curpath, fileName)

# 获取数据from csv文件中,参数nrows代表要读几行,skiprows代表从哪行开始读。
#top_tech_df = pd.read_csv(topfile_path, nrows=10, skiprows=100, header=None, names=['Date', comName[0], comName[1]])
top_tech_df = pd.read_csv(topfile_path, index_col=0)  # 设置index_col为Date列可实现从列x+1开始读取,是为了避免下面的pct_change操作无法针对Date字段列

#获取2015年数据,Date列为索引,直接可以通过日期范围来取值,代码的可读性好很多;loc真的很好用
value2015 = top_tech_df.loc['2015-01-01':'2015-12-31']
value2016 = top_tech_df.loc['2016-01-01':'2016-12-31']
value2017 = top_tech_df.loc['2017-01-01':'2017-12-31']
value2018 = top_tech_df.loc['2018-01-01':'2018-12-31']
value2019 = top_tech_df.loc['2019-01-01':'2019-12-31']

#初始化
i = 0

for names in comName:
    #设置图表内容
    value2015[comName[i]].plot(label='2015')
    value2016[comName[i]].plot(label='2016')
    value2017[comName[i]].plot(label='2017')
    value2018[comName[i]].plot(label='2018')
    value2019[comName[i]].plot(label='2019')

    # print value2015[comName[i]].head()
    # print value2016[comName[i]].head()
    # print value2017[comName[i]].head()
    # print value2018[comName[i]].head()
    # print value2019[comName[i]].head()

    # 设置图表配置
    plt.title(u"%s年度单位Adj Close趋势比较,2015~2019"%comName[i])
    plt.legend(loc='upper right', fontsize=12)  # 标签位置和字体大小
    plt.tight_layout()  #自适应
    plt.show()

    i += 1

return

需要强调的是,代码尝试了很多种方式在实现通过日期范围来取值的方面,幸好的是调试过程中发现了loc真的很好用,刚开始计划用最土的方法自己提取,鉴于Date为索引,故此比较难做数学操作;但好在loc被我发现了有这个用法,直接又高效。

运行效果如下图所示:
我的Python心路历程 第十期 (10.13 股票实战可视化之单股年度趋势类比)
另一只如下:
我的Python心路历程 第十期 (10.13 股票实战可视化之单股年度趋势类比)

最后说明一点,横坐标是最新一年的日期数据,这里解决了主要矛盾看大趋势,就不用纠结于此了,如果真的有必要(产品化)且有人比较较真的话,那么建议可以将年去掉,直接显示具体月日的日期即可变相解决该疑虑。

上一篇:matplotlib-legend 位置属性 loc 使用说明


下一篇:Linux基础——目录处理命令ls