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

Python回归计算问题求助:输入逻辑优化与股票对组合生成

问题描述

我正在尝试计算3-15家公司的回归系数,目前遇到两大技术问题:

  1. 需求为用户至少输入3家公司,但当前程序在输入3家后直接终止,无法支持用户输入更多公司。推测是while len(companies) < 3的循环逻辑导致,不知如何修改以兼顾最少3家及可选更多的需求?
  2. 需计算所选公司两两之间的开盘与收盘股价的回归关系,用户可选择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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 12:05:28