case_01 绘制苹果公司股价简单K线图 --- numpy模块 / matplotlib模块...

简述:

  1. 图形简单,图形绘制未排除法定节假日的休市日期,导致图形中K线图不连续 会有空缺
  2. matplotlib模块目前还未详细看
  3. numpy的文件导入和pandas的文件导入对比需要留意,厘清各参数的意义
    读取CSV文件
    loadtext (文件名,分隔符(delimiter),usecols=(列索引表—需要的列), unpack=True, dtype=元素类型, converters={列索引号:转换函数})
    注:unpack=True 表示所有的分隔符都进行处理
    note: numpy和pandas导入文件区别,pandas函数名为pd.read_csv()/ pd.read_table/ pd.ExcelFile, xls_file.parse(‘sheet1’)
import os
import sys
import numpy as np
import matplotlib.pyplot as plt 
import matplotlib.dates as md
import platform                 # pltform模块
import datetime as dt

# 解析日期函数
def dmy2ymd(dmy):
    # return dt.datetime.strptime(dmy, '%d-%m-%Y').date().strftime('%Y-%m-%d')
    # TypeError: strptime() argument 1 must be str, not bytes

    # return dt.datetime.strptime(str(dmy), '%d-%m-%Y').date().strftime('%Y-%m-%d')
    # ValueError: time data "b'28-01-2011'" does not match format '%d-%m-%Y'

    return dt.datetime.strptime(
        str(dmy, encoding = 'utf-8'), '%d-%m-%Y').date().strftime('%Y-%m-%d')
    # str(dmy, encoding = 'utf-8'): 构造str对象的同时可以指定字符编码
    # 将中文window默认dbcs(双字节字符集)字符编码的gb2312字符串转化为unicode字符串(utf-8)


# 定义读取文件的函数
def read_data(filename):
    dates, open_price, high_price, low_price, close_price = np.loadtxt(
        filename, delimiter = ',', usecols = (1,3,4,5,6), unpack = True,
        dtype = np.dtype('M8[D],f8,f8,f8,f8'),
        converters = {1:dmy2ymd})  
    return dates, open_price, high_price, low_price, close_price
    # M8[D] D表示日期精度以天为单位
    '''
    print(dates)
    print(open_price)
    print(high_price)
    print(low_price)
    print(close_price)
    '''


# chart初始化设置函数
def init_chart(first_day, last_day):
    # gcf(): get current figur
        # set_facecolor() 设置背景色; np.ones(3)*(240/250) 灰度值 rgb三个值
    plt.gcf().set_facecolor(np.ones(3)*(240/250))

    # 设置标题
    plt.title('Candlestick Chart', fontsize=20)

    # 设置轴标签
    plt.xlabel('Trading Days From %s to %s' %(
        first_day.astype(md.datetime.datetime).strftime(
            '%d %m %Y'),
        last_day.astype(md.datetime.datetime).strftime(
            '%d %m %Y')),fontsize=14)
    plt.ylabel('Stock Price(USD) of Apple Inc.', fontsize=14)

    # 获取当前轴并设置轴
    ax = plt.gca()
    # 设置轴刻度:
    # 定位器:set_major_locator 主定位器;  set_minor_locator 次定位器
    ax.xaxis.set_major_locator(md.WeekdayLocator(byweekday=md.MO))
    ax.xaxis.set_minor_locator(md.DayLocator())
    # 格式器:set_major_formatter 主格式器
    ax.xaxis.set_major_formatter(md.DateFormatter('%d/%m/%Y'))
    # 设置刻度
    plt.tick_params(which='both', top=True, right=True, labelright=True, labelsize=10)
    # which:[x,y,(x,y)--both], top/right=True 顶部显示刻度(默认left/down显示) 
    # labelright=True 右边显示刻度值(即刻度标签)

    # 设置网格: 线型 ':'表示点线; '--' 虚线; '-' 实线
    plt.grid(linestyle=':')


# 定义画图函数
def draw_chart(dates, open_price, high_price, low_price, close_price):
    # dates类型更改:从numpy中的时间类型转化为md模块中的时间类型
    dates = dates.astype(md.datetime.datetime)

    # 上下影线
    # 浮点数有误差,不直接使用差值(对比价差阈值),转化为bool
    up = close_price - open_price >= 1e-2
    down = open_price - close_price >= 1e-2

    # 图形颜色确定,上涨为红,下跌为绿,持平黑色
    full_color = np.zeros(dates.size,dtype='3f4')   # '3f4'表示3个浮点数f4
    edge_color = np.zeros(dates.size,dtype='3f4')

    # 形状填充色
    full_color[up], full_color[down] = (1,1,1),(0,0.5,0)    # RGB灰度? 1表示最亮(1,1,1)==白色

    # 形状边缘轮廓色
    edge_color[up], edge_color[down] = (1,0,0),(0,0.5,0)    # (1,0,0) 红色

    # 绘制影线, 宽度==0即可
    plt.bar(dates, high_price - low_price, 0, low_price, 
        align='center',color=full_color, edgecolor=edge_color)

    # 绘制实体:参数为坐标(横坐标时间,纵坐标高度即价差,bar宽度,底坐标,对其方式,实体颜色,轮廓颜色)
    plt.bar(dates, close_price - open_price, 0.8, open_price, 
        align='center',color=full_color, edgecolor=edge_color)

    # 自动调整x轴日期倾斜角度 plt.gcf属性
    plt.gcf().autofmt_xdate()


# 定义图像显示函数
def show_chart():
    # 获取当前状态管理器
    mng = plt.get_current_fig_manager()

    # 设置窗口大小(window系统中state参数为zoomed表示窗口最大化)
    # 判断操作系统是否属于window  , platform模块
    if 'windows' in platform.system():
        mng.window.state('zoomed')
    else:
        # 非windows系统通过resize设置窗口宽和高
        mng.resize(*mng.window.maxsize())   # resize需要width,height两个参数,maxsize返回一个元组
        # maxsize()返回的是一个元组,前面加'*'表示将元组展开作为2个值传给resize
        # 可迭代元素(列表, 元组, 生成器等)作为参数, 可以使用*展开参数
    plt.show()


# 定义主函数
def main(argc, argv, envp):
    # 导入文件
    dates, open_price, high_price, low_price, close_price = read_data('aapl.csv')
    # 图形初始化
    init_chart(dates[0], dates[-1])
    # 画图
    draw_chart(dates, open_price, high_price, low_price, close_price)
    # 显示图形
    show_chart()
    return 0

# 调用主函数
if __name__ == '__main__':
    sys.exit(main(len(sys.argv),sys.argv,os.environ))

这里写图片描述

猜你喜欢

转载自blog.csdn.net/weixin_40040404/article/details/80833148