import matplotlib as mpl
mpl.use('agg')
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] #中文显示
import matplotlib.pyplot as plt
import numpy as np
import tushare as ts
import talib
import pandas as pd
import io
def get_AVGPRICE(datax,code='',start='',end=''):
msg = {'status': True, 'error': None, 'success': None, 'data': None}
try:
output = {}
#股票高开低收价格和日期
df = ts.get_k_data('%s' % code,start=start,end=end)
#处理股票代码输入错误
if len(df) == 0:
msg["status"] = False
msg["error"] = '未找到该股票代码数据'
return msg
#提取数据,展示最近15天
if len(df) > 15:
df = df.iloc[-15:-1]
close = df.close.values
low = df.low.values
high = df.high.values
open = df.open.values
date = df.date.values
#把日期设置为索引列
df.set_index(df['date'], drop=True, inplace=True)
#股票均价
real = talib.AVGPRICE(open, high, low, close)
#在df中添加avgprice列
df['avgprice'] = real
#获取df的标题
title = list(df.columns)
#把DataFrame格式转为列表格式
data = df.values.tolist()
# 绘制K线图
# 研究颜色的设置
rise = close >= open
# 填充色:
color = np.array([('red' if x else 'green') \
for x in rise])
# 边缘色:
ecolor = np.array([('red' if x else 'green') \
for x in rise])
#基本图表配置
plt.figure(figsize=(15, 7))
ax = plt.gca()
plt.title('%s 平均价格'%code, fontsize=18)
# 绘制影线
plt.vlines(date, low, high,
color=ecolor, linewidth=0.8)
# 绘制实体
plt.bar(date, close-open,
0.8, open, color=color,
edgecolor=ecolor, zorder=3)
plt.plot(date, real, 'bo-',label = u'AVGPRICE', linewidth=2, markersize=1)
plt.legend(loc='best')
#横坐标设置
ll = range(0, len(df), 1)
my_xticks = df.index[ll]
plt.xticks(ll,my_xticks)
plt.xticks(rotation=15)
#横纵坐标标签及其大小
plt.xlabel('Date', fontsize=15)
plt.ylabel('Price', fontsize=15)
plt.tick_params(labelsize=12)
plt.grid(linestyle=':')
plt.show()
#前端展示图形
fig = ax.get_figure()
canvas = fig.canvas
buffer = io.BytesIO()
canvas.print_png(buffer)
data_img = buffer.getvalue()
buffer.close()
#输出图片和数据
output['img_AVGPRICE'] = data_img
output['data_AVGPRICE'] = [title]+data
return output
except Exception as e:
msg["status"] = False
msg["error"] = '执行失败:%s' % e
return msg
if __name__ == '__main__':
datax = nosupervision_read_data()
print(get_AVGPRICE(datax,code='600519'))