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()
关键说明
- 跨文件调用:通过将工具函数封装到
stock_utils.py模块,主程序main.py直接导入调用即可,符合模块化开发规范 - 原生CSV处理:使用Python标准库
csv的DictReader和DictWriter,无需依赖Pandas,直接按行完成读取、计算、写入操作 - 面向对象优化:将涨跌幅计算逻辑封装到
ChangeCalculator类的静态方法中,既保持面向对象结构,又避免不必要的实例化 - 异常防护:添加了除以0的判断,避免计算时出现报错
- 目录自动管理:自动创建
data和output目录,无需手动创建
内容的提问来源于stack exchange,提问作者Mery p.
相关产品推荐
相关产品推荐

