You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python基础:不使用Pandas计算股票开盘收盘价涨跌幅并处理CSV

解决方案:原生Python实现股票CSV下载与涨跌幅计算

问题修正点

你提供的尝试代码存在几个关键问题:

  • 类Change的实例化错误:直接将文件名传给构造函数,且存在拼写错误(IMB.csv应为IBM.csv),构造函数需要的是Open和Close数值而非文件路径
  • 类方法变量名不匹配:calc_percentage中使用self.c和self.o,但初始化时定义的属性是self.open和self.close
  • 实例化位置错误:将r = Change(...)放在类内部,应该在类定义完成后在外部执行实例化

完整实现方案

1. 目录结构(解决跨文件调用问题)

将功能拆分到不同模块,结构如下:

stock_project/
├── stock_utils.py  # 封装下载、计算、CSV处理函数
├── data/           # 存放原始CSV文件
├── output/         # 存放处理后的CSV文件
└── main.py         # 主程序入口

2. stock_utils.py 模块代码

from urllib import request
import csv
import os

# 批量下载股票CSV文件
def download_stocks(stock_codes, save_dir='data'):
    os.makedirs(save_dir, exist_ok=True)
    # 通用URL模板,替换股票代码即可
    url_template = 'https://query1.finance.yahoo.com/v7/finance/download/{code}?period1=1639213520&period2=1670749520&interval=1d&events=history&includeAdjustedClose=true'
    
    for code in stock_codes:
        url = url_template.format(code=code)
        save_path = os.path.join(save_dir, f'{code}.csv')
        request.urlretrieve(url, save_path)
        print(f'已下载 {code} 数据到 {save_path}')

# 涨跌幅计算类
class ChangeCalculator:
    @staticmethod
    def calc_percentage(open_price, close_price):
        # 避免除以0的异常
        if open_price == 0:
            return 0.0
        # 转成百分比格式,保留两位小数
        return round((close_price - open_price) / open_price * 100, 2)

# 处理单个CSV文件,添加涨跌幅列
def process_csv(input_path, output_dir='output'):
    os.makedirs(output_dir, exist_ok=True)
    file_name = os.path.basename(input_path)
    output_path = os.path.join(output_dir, file_name)
    
    with open(input_path, 'r', newline='', encoding='utf-8') as infile, \
         open(output_path, 'w', newline='', encoding='utf-8') as outfile:
        
        reader = csv.DictReader(infile)
        # 新增涨跌幅列到表头
        fieldnames = reader.fieldnames + ['Change(%)']
        writer = csv.DictWriter(outfile, fieldnames=fieldnames)
        
        writer.writeheader()
        for row in reader:
            # 转换字符串为浮点数
            open_price = float(row['Open'])
            close_price = float(row['Close'])
            # 计算涨跌幅
            change = ChangeCalculator.calc_percentage(open_price, close_price)
            row['Change(%)'] = change
            writer.writerow(row)
    
    print(f'已处理 {input_path},结果保存到 {output_path}')

# 遍历目录下所有CSV文件并批量处理
def process_all_csv(input_dir='data', output_dir='output'):
    for file in os.listdir(input_dir):
        if file.endswith('.csv'):
            input_path = os.path.join(input_dir, file)
            process_csv(input_path, output_dir)

3. main.py 主程序代码

from stock_utils import download_stocks, process_all_csv

if __name__ == '__main__':
    # 待下载的股票代码列表
    stock_list = ['GOOG', 'IBM', 'MSFT']
    # 批量下载股票数据
    download_stocks(stock_list)
    # 处理所有下载的CSV文件
    process_all_csv()

关键说明

  1. 跨文件调用:通过将工具函数封装到stock_utils.py模块,主程序main.py直接导入调用即可,符合模块化开发规范
  2. 原生CSV处理:使用Python标准库csv的DictReader和DictWriter,无需依赖Pandas,直接按行完成读取、计算、写入操作
  3. 面向对象优化:将涨跌幅计算逻辑封装到ChangeCalculator类的静态方法中,既保持面向对象结构,又避免不必要的实例化
  4. 异常防护:添加了除以0的判断,避免计算时出现报错
  5. 目录自动管理:自动创建data和output目录,无需手动创建

内容的提问来源于stack exchange,提问作者Mery p.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 22:35:49