stockmarcket

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力当总裁的郭琛予

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值