Python综合实战对股票数据分析&处理

一、 题目要求

开发程序对stock_data.txt进行以下操作:

  1. 程序启动后,给⽤用户提供查询接⼝口,允许⽤用户重复查股票⾏行行情信息(⽤用到循环)
  2. 允许用户通过模糊查询股票名,⽐如输入“啤酒”, 就把所有股票名称中包含“啤酒”的信息打印出来
  3. 允许按股票价格、涨跌幅、换手率这⼏列来筛选信息,⽐如输入“价格>50”则把价格大于50的股票都打印,输⼊入“市盈率<50“,则把市盈率小于50的股票都打印,不用判断等于。

思路提示:加载⽂件内容到内存,转成dict or list结构,然后对dict or list 进行查询等操作。这样以后就不用每查一次就要打开一次文件了,效率会高。

程序启动后执行效果参考:

股票查询接⼝口>>:换⼿手率>25
['序号', '代码', '名称', '最新价', '涨跌幅', '涨跌额', '成交量量(⼿手)', '成交额', '振幅',
'最⾼高', '最低', '今开', '昨收', '量量⽐比', '换⼿手率', '市盈率', '市净率']
['18', '603697', '有友⻝⾷食品', '22.73', '10.02%', '2.07', '34.93万', '7.68亿',
'8.23%', '22.73', '21.03', '21.17', '20.66', '1.4', '43.94%', '38.1', '4.66']
['23', '603956', '威派格', '22.52', '10.01%', '2.05', '18.33万', '4.01亿',
'10.60%', '22.52', '20.35', '20.35', '20.47', '2.16', '43.02%', '-', '9.82']
['36', '300748', '⾦金金⼒力力永磁', '59.7', '10.01%', '5.43', '11.02万', '6.38亿',
'6.98%', '59.7', '55.91', '56.88', '54.27', '0.9', '26.49%', '234.09',
'23.54']
['37', '300767', '震安科技', '41.13', '10.00%', '3.74', '6.22万', '2.49亿',
'10.32%', '41.13', '37.27', '37.48', '37.39', '3.86', '31.11%', '43.32',
'3.68']
['38', '603045', '福达合⾦金金', '32', '10.00%', '2.91', '17.06万', '5.31亿',
'9.87%', '32', '29.13', '29.13', '29.09', '1.39', '25.17%', '52.74', '4.02']
['39', '2952', '亚世光电', '58.98', '10.00%', '5.36', '4.18万', '2.41亿',
'7.42%', '58.98', '55', '55.91', '53.62', '3.04', '27.44%', '53.09', '5.51']
找到6条
股票查询接⼝口>>:最新价<5
数据源已经帮你准备好了了
stock_data.txt
['序号', '代码', '名称', '最新价', '涨跌幅', '涨跌额', '成交量量(⼿手)', '成交额', '振幅',
'最⾼高', '最低', '今开', '昨收', '量量⽐比', '换⼿手率', '市盈率', '市净率']
['2', '2676', '顺威股份', '3.69', '10.15%', '0.34', '15.23万', '5516万',
'9.55%', '3.69', '3.37', '3.37', '3.35', '1.16', '2.11%', '-', '2.58']
['3', '601619', '嘉泽新能', '4.91', '10.09%', '0.45', '16.55万', '8006万',
'8.52%', '4.91', '4.53', '4.54', '4.46', '1.82', '3.28%', '52.26', '3.64']
找到2条
股票查询接⼝口>>:⻝⾷食品
['18', '603697', '有友⻝⾷食品', '22.73', '10.02%', '2.07', '34.93万', '7.68亿',
'8.23%', '22.73', '21.03', '21.17', '20.66', '1.4', '43.94%', '38.1', '4.66']
找到1条
股票查询接⼝口>>:能源
['9', '2828', '⻉贝肯能源', '14.25', '10.04%', '1.3', '17.83万', '2.52亿',
'4.71%', '14.25', '13.64', '13.8', '12.95', '3.45', '18.03%', '-', '3.08']
找到1条
股票查询接⼝口>>:科技
['12', '2866', '传艺科技', '13.81', '10.04%', '1.26', '13.59万', '1.83亿',
'9.72%', '13.81', '12.59', '12.61', '12.55', '2.63', '16.86%', '33.37',
'3.43']
['19', '300777', '中简科技', '24.92', '10.02%', '2.27', '5952', '1483万',
'0.00%', '24.92', '24.92', '24.92', '22.65', '3.45', '1.49%', '102.24',
'11.49']
['21', '300245', '天玑科技', '11.53', '10.02%', '1.05', '26.86万', '3.05亿',
'9.64%', '11.53', '10.52', '10.52', '10.48', '1.06', '10.35%', '127.47',
'2.57']
['26', '300391', '康跃科技', '7.8', '10.01%', '0.71', '3.9万', '3027万',
'10.01%', '7.8', '7.09', '7.09', '7.09', '0.75', '1.94%', '27.35', '1.89']
['37', '300767', '震安科技', '41.13', '10.00%', '3.74', '6.22万', '2.49亿',
'10.32%', '41.13', '37.27', '37.48', '37.39', '3.86', '31.11%', '43.32',
'3.68']
['40', '603327', '福蓉科技', '21.56', '10.00%', '1.96', '3586', '773.1万',
'0.00%', '21.56', '21.56', '21.56', '19.6', '2.81', '0.70%', '31.97', '8.05']
找到6

二、代码示例

import operator

class stocks():
    def readfile(self, file):
        """读取文件,将股票数据转化成列表格式"""
        stocks_data = []
        with open(file, 'r', encoding='utf-8')as f:
            for line in f.readlines():
                line = line.strip('\n')  # 去掉换行
                line_list = line.strip(',').split(',')  # 按输入字符分割,将其转化为数组
                stocks_data.append(line_list)
            return stocks_data

    def inquirys(self, stocks_data):
        """
        处理查询请求,对请求进行字符串拆分
        command :查询命令
        condition :判断条件
        parameter : 条件参数
        """
        requests = input("===================\n请输入查询指令>>:").strip()
        # print(stocks_data[0])  # .replace(',', "  ")
        if '>' in requests:
            index = requests.index('>')
            command = requests[0:index]
            condition = '>'
            parameter = requests[index+1:]
            self.processData(stocks_data, command, parameter, condition)
        elif "<" in requests:
            index = requests.index('<')
            command = requests[0:index]
            condition = '<'
            parameter = requests[index + 1:]
            self.processData(stocks_data, command, parameter, condition)
        else:
            command = requests
            self.mohuchaxun(stocks_data, command)


    def processData(self,stocks_data, command, parameter, condition):
        """处理数据,解决数据单位不同,或者数据有分号情况"""
        new_stocks_data = []
        for stocks_info in stocks_data:
            stocks_data = []
            for info in stocks_info:
                info = info.replace('%', '')
                if '亿' in info:
                    info = str(round(float(info[0:-1]) * 10000, 3)) + '万'
                stocks_data.append(info)
            new_stocks_data.append(stocks_data)

        # 传递打印
        self.print_data(new_stocks_data, command, parameter, condition)


    def print_data(self, new_stocks_data, command, parameter, condition):
        """
        打印显示数据
        # operator模块中函数,可以将将运算符映射到函数 参考https://docs.python.org/zh-cn/3/library/operator.html
        """
        print(new_stocks_data[0])
        count = 0
        operator_dict = {"<": operator.lt, ">": operator.gt, "=": operator. eq}  # 通过字典方式将传进来的字符串转换为运算符
        operator_func = operator_dict[condition]
        res = new_stocks_data[0].index(command)
        for stock_info in new_stocks_data[1:]:
            if "万" in stock_info[res]:
                stock_info[res] = stock_info[res][:-1]
            if operator_func(float(stock_info[res]), float(parameter)):
                count += 1  # 计数
                print(stock_info)
        print(f"找到{count}条数据!")

    def mohuchaxun(self,stocks_data, command):
        """模糊查询"""
        list_data = []
        print(stocks_data[0])
        for info in stocks_data[1:]:
            for x in info:
                if x.find(command) != -1:
                    list_data.append(info)

        for i in list_data:
            print(i)
        print(f"找到{len(list_data)}条数据!")


    def func(self, file):
        # 运行函数
        try:
            stocks_data = self.readfile(file)
            while True:
                self.inquirys(stocks_data)
        except:
            print("数据读取错误!")

if __name__ == '__main__':
    obj = stocks()
    obj.func(file="../res/stock_data.txt")

三、代码运行结果

在这里插入图片描述

四、总结

python代码有一个特点就是优雅和简洁

  1. 在写查询请求时候,就在想能不能把输入字中的运算符当做条件传递给函数,这就涉及到一个问题,字符串怎么变成 运算符
  2. 百度查了半天资料,发现了一个python内置的operator模块具有运算符的功能
  3. 构建一个字典,以键值对的方式实现模块调用,最终达成将条件传递给函数的作用。
  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值