Python回归计算问题求助:输入逻辑优化与股票对组合生成
问题描述
我正在尝试计算3-15家公司的回归系数,目前遇到两大技术问题:
- 需求为用户至少输入3家公司,但当前程序在输入3家后直接终止,无法支持用户输入更多公司。推测是
while len(companies) < 3的循环逻辑导致,不知如何修改以兼顾最少3家及可选更多的需求? - 需计算所选公司两两之间的开盘与收盘股价的回归关系,用户可选择3-15家公司,对应3-105种唯一组合。已通过
read_company()获取公司列表,但calculate_combinations(companies)模块无法正确生成有效配对,不确定配对逻辑是否正确。
附现有代码:
import math def read_company(): companies = [] while len(companies) < 3: company = input("Enter at least three companies.") if company in companies: print("Company already entered. Enter a new company.") elif not path.exists(company + '.csv'): print(company + " does not exist. Enter a new company.") else: companies.append(company) return companies def calculate_combinations(companies): companies = [] output = [] for x in range(0,len(companies)): for y in range(0,len(companies)): output.append((company[x],company[y])) return combinations_companies def calculate_sommations(range_x, range_y): som_x = 0 som_y = 0 som_xsquared = 0 som_ysquared = 0 som_xy = 0 number = len(range_x) for i in range(number): som_x += range_x[i] som_y += range_y[i] som_xsquared += range_x[i] ** 2 som_ysquared += range_y[i] ** 2 som_xy += range_x[i] * range_y[i] return number, som_x, som_y, som_xsquared, som_ysquared, som_xy def calculate_correlationcoefficient(number, som_x, som_y, som_xsquared, som_ysquared, som_xy): return (number * som_xy - (som_x * som_y)) / \ math.sqrt( (number * som_xsquared - som_x ** 2) * (number * som_ysquared - som_y ** 2) )
解决方案
问题1:修改输入逻辑,支持最少3家、最多15家公司输入
原代码循环仅确保输入3家后就终止,无法继续输入更多。拆分逻辑为两步:先强制输入至少3家有效公司,再提供可选输入直到15家,允许用户主动终止。
修改后的read_company函数:
import os # 补充导入os模块,原代码中path应为os.path def read_company(): companies = [] # 第一步:确保用户输入至少3家有效公司 while len(companies) < 3: company = input("请输入公司名称(至少需要3家):").strip() if not company: print("请输入有效的公司名称") continue if company in companies: print("该公司已输入,请输入新的公司。") elif not os.path.exists(company + '.csv'): print(f"{company} 对应的csv文件不存在,请输入其他公司。") else: companies.append(company) # 第二步:允许用户继续输入,最多到15家,回车即可结束 while len(companies) < 15: company = input("请输入下一家公司名称,或直接回车结束输入:").strip() if not company: break if company in companies: print("该公司已输入,请输入新的公司。") elif not os.path.exists(company + '.csv'): print(f"{company} 对应的csv文件不存在,请输入其他公司。") else: companies.append(company) return companies
问题2:修复组合生成逻辑,生成有效两两配对
原calculate_combinations函数存在多个错误:重置传入的公司列表、使用未定义变量、返回未定义变量、生成包含自身配对和重复有序对的无效组合。根据需求生成不重复的无序两两组合,有两种实现方式:
方法1:使用itertools.combinations(简洁高效)
from itertools import combinations def calculate_combinations(companies): # 生成所有不重复的两两组合,例如[A,B,C]会生成[(A,B), (A,C), (B,C)] return list(combinations(companies, 2))
方法2:手动实现循环
def calculate_combinations(companies): output = [] # 内层循环从当前公司的下一个开始,避免重复配对 for x in range(len(companies)): for y in range(x + 1, len(companies)): output.append((companies[x], companies[y])) return output
如果需要有序对(如A的开盘价对B的收盘价、B的开盘价对A的收盘价视为不同组合),则使用itertools.product:
from itertools import product def calculate_combinations(companies): # 生成所有有序对,排除自身配对(如(A,A)) return [(a, b) for a, b in product(companies, repeat=2) if a != b]
内容的提问来源于stack exchange,提问作者diamondsndrama
相关产品推荐
相关产品推荐

