from ctypes.wintypes import FLOAT
import os
import datetime
import time
import numpy as np
import json
import requests
import re
from collections import defaultdict
import ast
import pandas as pd
import matplotlib.pyplot as plt
from scipy import interpolate
import xlwings as xw
import xlsxwriter as xls
import datetime
import matplotlib as mpl
class Parameter(object):
def __init__(self):
self.path_lowPrice_root = "E:\\stock\\data"
self.path_allInfo_root = "E:\\stock\\data_all"
self.goal_out_root = "E:\\stock\\goal"
self.goal_out_root_img = "E:\\stock\\img"
# http://quote.eastmoney.com/center/gridlist.html#hs_a_board
self.page_num = 275
# self.page_num = 20
self.random_sleep = [5, 13]
print("参数信息配置已成功!")
print("-*-"*25)
for name, value in vars(self).items():
print('% 20s: %s' % (name, value))
print("-*-"*25)
def preday_file_name(args):
"""
得到昨日json文件的名称
path_root : 存放数据的根目录
"""
path_files = os.listdir(args.path_lowPrice_root)
if len(path_files) == 0:
in_info_path = "100000_2023-07-07.json"
else:
path_files.sort(reverse=True)
in_info_path = path_files[0]
return in_info_path
def preday_file_name_excel(args):
"""
得到存放excel文件数据的目录
"""
path_files = os.listdir(args.goal_out_root)
if len(path_files) == 0:
in_info_path = "100000_2023-07-07.xlsx"
else:
path_files.sort(reverse=True)
in_info_path = path_files[0]
# 根据前一天文件名得到今天的文件名
out_info_path_name = in_info_path.split(".")[0]
out_info_path_name_buff = int(out_info_path_name.split("_")[0])+1
datetime_now_str = datetime.datetime.now().strftime('%Y-%m-%d')
out_info_path_name = str(out_info_path_name_buff) + "_" +datetime_now_str
path_csv = os.path.join(args.goal_out_root,"%s.xlsx" %(out_info_path_name))
return path_csv
def out_info_json(in_info_path,out_info_dict,out_allInfo_dict,args):
"""
读取昨日数据,并补充今日数据,写入到今日json文件中
path_root : 存放数据的根目录
in_info_path : 前一天的文件名
out_info_dict : 今天要写入json文件的内容
"""
# 根据前一天文件名得到今天的文件名
out_info_path_name = in_info_path.split(".")[0]
out_info_path_name_buff = int(out_info_path_name.split("_")[0])+1
datetime_now_str = datetime.datetime.now().strftime('%Y-%m-%d')
out_info_path_name = str(out_info_path_name_buff) + "_" +datetime_now_str
out_allinfo_path_name = str(out_info_path_name_buff) + "_" +datetime_now_str + "_all"
# 昨日文件绝对路径
path_yesterday = os.path.join(args.path_lowPrice_root,in_info_path)
path_allIfo_yesterday = os.path.join(args.path_allInfo_root,in_info_path+ "_all")
# json文件存放的绝对路径
path_out = os.path.join(args.path_lowPrice_root,"%s.json" %(out_info_path_name))
path_allIfo_out = os.path.join(args.path_allInfo_root,"%s.json" %(out_allinfo_path_name))
# 读取昨日数据,并补充今日数据,写入到今日json文件中
if os.path.exists(path_yesterday):
with open(path_yesterday,"r") as ff:
data_str = ff.read()
data = ast.literal_eval(data_str)
data.update(out_info_dict)
with open(path_out, 'w') as f:
f.write(str(data))
else:
with open(path_out, 'w') as f:
f.write(str(out_info_dict))
if os.path.exists(path_allIfo_yesterday):
with open(path_allIfo_yesterday,"r") as ff:
data_all_str = ff.read()
data_all = ast.literal_eval(data_all_str)
data_all.update(out_allInfo_dict)
with open(path_allIfo_out, 'w') as f:
f.write(str(data_all))
else:
with open(path_allIfo_out, 'w') as f:
f.write(str(out_allInfo_dict))
def get_data(args):
"""
获取数据,包括两种类型
一 最低价信息
二 所有参数信息
"""
info = {} # 存放最低价信息
allInfo = {} # 存放所有参数信息
daima_price_list = []
daima_all_list = []
datetime_now_str = datetime.datetime.now().strftime('%Y%m%d')
# info = [{"日期":[{"代码":["名称","最低价"],"600002":["30yuan","9.88"]}]},{"日期":[{"代码":["名称","最低价"],"600002":["30yuan","9.88"]}]}]
info_son = {}
allinfo_son = {}
daima_name = {}
url = "http://75.push2.eastmoney.com/api/qt/clist/get?"
page_num = args.page_num
for i in range(page_num):
param = {
"cb": "jQuery11240487832564236381_1672999056876",
"pn": str(i+1),
"pz": "20",
"po": "1",
"np": "1",
"ut": "bd1d9ddb04089700cf9c27f6f7426281",
"fltt": "2",
"invt" : "2",
"wbp2u" : "|0|0|0|web",
"fid" : "f3",
"fs" : "m:0 t:6,m:0 t:80,m:1 t:2,m:1 t:23,m:0 t:81 s:2048",
"fields" :"f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152",
"_":"1672999056877"
}
headers = {
"User-Agent" :"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"
}
repos = requests.get(url, headers = headers, params = param)
data_split = re.split("[()]", repos.text)
# 将字符串格式转为json
data_dic= json.loads(data_split[1])
data_gupiao = data_dic["data"]["diff"]
for gegu in data_gupiao:
info_son_son = {}
allInfo_son_son = {}
daima = gegu["f12"]
name = gegu["f14"]
low = gegu["f16"]
shoupanprice = gegu["f2"]
zhangfu = gegu["f3"]
chengjiaoliang = gegu["f5"]
high = gegu["f15"]
liangbi = gegu["f10"]
huanshoulv = gegu["f8"]
chengjiaoe = gegu["f6"]
info_son_son[daima] = [name,low]
allInfo_son_son[daima] = [name,low,high, shoupanprice, zhangfu, chengjiaoliang,liangbi,huanshoulv,chengjiaoe]
daima_name[daima] = name
info_son.update(info_son_son)
allinfo_son.update(allInfo_son_son)
x = np.random.randint(args.random_sleep[0],args.random_sleep[1])
datetime_now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
args.page_num -= 1
print("---"*20)
print(" %s 第【%3s 页】的数据已成功获取!剩余【%3s 页】待获取!" %(datetime_now,str(i+1),str(args.page_num)))
print()
print(" %s 待【%3s 秒】后获取下一页数据!" %(datetime_now,str(x)))
print("---"*20)
time.sleep(x)
daima_price_list.append(info_son)
daima_all_list .append(allinfo_son)
info[datetime_now_str] = daima_price_list
allInfo[datetime_now_str] = daima_all_list
return info, allInfo,daima_name
def data_anaysis(daima_name,args):
# 读取今日的数据
path_files = os.listdir(args.path_lowPrice_root)
path_files.sort(reverse=True)
today_data = path_files[0]
today_data_path_img = today_data.split(".")[0]
today_data_path = os.path.join(args.path_lowPrice_root, today_data)
print(today_data_path)
with open(today_data_path,"r") as ff:
today_data_str = ff.read()
today_data = ast.literal_eval(today_data_str)
# print(today_data)
# 遍历每日数据
gegu_info = {}
gegu_price_info = []
# for y in len(today_data):
# 将每日的个股数据放进一个列表,剔除掉日期
all_data_list = []
for one_day,one_day_data in today_data.items():
all_data_list.append(one_day_data)
# for i in range(len(all_data_list)):
# 字典格式:gegu_info = {'301292': [29.66, 29.0, 29.67], '300780': [17.2, 17.2, 17.2],......
for one_day_gegu in all_data_list:
for one_day_gegu_dict in one_day_gegu:
for daima, price in one_day_gegu_dict.items():
if daima in gegu_info.keys() :
if price[1] != "-":
gegu_info[daima].append(float(price[1]))
else:
if price[1] != "-":
gegu_info[daima] =[price[1]]
goal_out = []
for daima,low_list in gegu_info.items():
goal = []
print(low_list)
"""
def aa(low_list):
return str(low_list).isdigit()
low_list = list(filter(aa,low_list))
"""
if len(low_list) == 0: continue
low = min(low_list)
if str(low).split(".")[-1] in ["00","11","22","33","44","66","55","99","77","88"] or str(low) in ["12.21","13.31","12.34","18.18","15.15"]:
goal.append(daima)
goal.append(low_list)
goal_out.append(goal)
path_low_csv = goal_to_csv(goal_out,args)
data2figure(path_low_csv, today_data_path_img,daima_name,args)
def goal_to_csv(goal,args):
path_low_csv = preday_file_name_excel(args)
print(path_low_csv)
low_price_data = pd.DataFrame(goal, columns = ["name","low_price"])
low_price_data.to_excel(path_low_csv, index = False)
datetime_now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print("-=-"*25)
print()
print(' %s 结果已生成!'%datetime_now)
print()
print("-=-"*25)
return path_low_csv
def data2figure(path_low_csv,today_data_path_img,daima_name,args):
font_name = "YouYuan"
mpl.rcParams['font.family']=font_name
mpl.rcParams['axes.unicode_minus']=False
plt.rcParams['axes.facecolor'] = 'seashell' #设置绘图背景色
plt.rcParams['figure.facecolor'] = 'ghostwhite' #设置背景色
# 获取当前是星期几
today = datetime.datetime.today()
year,month,day = today.year,today.month,today.day
weekday_english = datetime.date(year,month,day ).strftime("%A")
weekday_table = {"Sunday ":"星期日", "Monday":"星期一","Tuesday":"星期二","Wednesday":"星期三","Thursday":"星期四","Friday":"星期五","Saturday":"星期六"}
week = weekday_table[weekday_english]
goal_csv_path = path_low_csv # 数据excel
today_data_path_img = today_data_path_img # 存放图像的根目录
daima_name = daima_name
# 读取表中的第B列数据
# df = pd.read_excel(goal_csv_path, usecols = "AB",converters={"name":str})
df = pd.read_excel(goal_csv_path,converters={"name":str})
# df = pd.read_excel(goal_csv_path, usecols = "B")
df_dict = df.to_dict()
name_dict = df_dict["name"]
price_dict = df_dict["low_price"]
num_remain = len(price_dict)
datetime_now_str = datetime.datetime.now().strftime('%Y-%m-%d')
t = datetime_now_str + "(" + week + ")"
for p,data in price_dict.items():
daima = name_dict[p]
name_1 = daima_name[daima]
# name = daima + " — "+ name_1 + "—" + datetime_now_str
name = daima + " — "+ name_1 + " — " + t
data = data[1:-1]
y_list_str = (data.split(", "))
y_list = []
y_list_label = []
for i in y_list_str:
y_list_label .append("{:.2f}".format(float(i)))
y_list .append(float(i))
x_list = [x for x in range(1,len(y_list)+1)]
fig, ax = plt.subplots(figsize=(25, 13))
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
# plt.figure(figsize=(10, 3))
for x, y,z in zip(x_list, y_list,y_list_label):
if str(z).split(".")[-1] in ["00","11","22","33","44","66","55","99","77","88"] or str(z) in ["12.21","13.31","12.34","18.18","15.15"]:
plt.text(x, y,z, ha='left', va='bottom',fontsize=14,fontweight = "bold",color = "darkred",verticalalignment = "baseline")
else:
plt.text(x, y,z, ha='left', va='bottom',fontsize=12,verticalalignment = "baseline")
# figure = plt.figure()
plt.plot(x_list, y_list, 'ro--', alpha=0.5,linewidth = '1', linestyle = 'solid')
plt.title(name, fontsize=14,color="blue",fontweight = "bold")
path_img_root = args.goal_out_root_img
path_img = os.path.join(path_img_root, today_data_path_img)
print(path_img)
if not os.path.exists(path_img ) :
os.makedirs(path_img)
path_i = os.path.join(path_img, daima + ".png")
num_remain -=1
plt.savefig(path_i)
plt.cla()
datetime_now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print("---"*20)
print(" %s 第【%3s 张】的图像已成功保存!剩余【%3s 张】待处理!" %(datetime_now,str(p+1),str(num_remain)))
print()
if __name__ == '__main__':
# time_now = time.strftime("%H:%M:%S", time.localtime()) # 刷新
# if time_now == "15:30:10": #此处设置每天定时的时间
args = Parameter()
in_info_path = preday_file_name(args)
out_info_dict , out_allInfo_dict,daima_name = get_data(args)
in_info_path = preday_file_name(args)
out_info_json(in_info_path,out_info_dict, out_allInfo_dict, args)
print("-=-"*25)
print()
print('所有数据获取已成功!')
print()
print("-=-"*25)
data_anaysis(daima_name,args)
stockmarcket
于 2023-08-25 09:16:18 首次发布