我正在从事一个python项目,利用背包问题和动态规划,根据可以投资多少资金来找到最佳投资.到目前为止,我能够按名称列出最佳投资,但我在格式化和获取其余信息以及实现回溯表方面遇到了困难.以下是我到目前为止得到的信息和输出:

import pandas as pd
from itertools import chain

def investmentFilename(file):
    df = pd.read_csv(file)
    frame = pd.DataFrame(df)
    frame = frame.drop(0) # dropping the United States
    # print(frame)
    return frame

def loadInvestments(frame):
    portfolio = []
    state = frame['RegionName'].tolist()
    avg = frame['Zhvi'].tolist()
    dfAvg = pd.DataFrame(avg)
    # print(dfAvg)
    tenyr = (frame['10Year'].tolist())
    tenyr = pd.DataFrame(tenyr)
    roi = tenyr.multiply(dfAvg, axis='columns', level=None, fill_value=None)
    # print(roi)
    # roi = pd.DataFrame(roi)
    ROI = roi.values.tolist()
    ROI = list(chain.from_iterable(ROI))
    print("InvestmentName InvestmentCost EstimatedReturnOnInvestment")
    for i in range(len(state)):
        portfolio.append([state[i], int(avg[i]), int(ROI[i])])
        print(state[i], '\t', avg[i], '\t', ROI[i])

    # print(portfolio)
    # portfolio = list(chain.from_iterable(portfolio))
    # print(portfolio)

    # printing list data
    # print("Investment Name:",state)
    # print("Investment Cost:", avg)
    # print("Estimated Return on Investment:", ROI)
    return portfolio

def optimizeInvestments(invstmt, money):
    """ knapsack problem """
    n = len(invstmt)
    val = []
    name = []
    roi = []

    for i in invstmt:
        name.append(i[0])
        val.append(i[1])
        roi.append(i[2])

    K = [[0 for x in range(money + 1)] for x in range(n + 1)]
    I = [[0 for x in range(money + 1)] for x in range(n + 1)]

    for i in range(n + 1):
        for w in range(money + 1):
            if i == 0 or w == 0:
                K[i][w] = 0
                I[i][w] = ""

            elif roi[i - 1] <= w:

                if (val[i - 1] + K[i - 1][w - roi[i - 1]] > K[i - 1][w]):
                    K[i][w] = val[i - 1] + K[i - 1][w - roi[i - 1]]
                    I[i][w] = name[i - 1] + I[i - 1][w - roi[i - 1]]
                else:
                    K[i][w] = K[i - 1][w]
                    I[i][w] = I[i - 1][w]

            else:
                K[i][w] = K[i - 1][w]
                I[i][w] = I[i - 1][w]

    return (I[n][money])

dataFrame = investmentFilename('zhvi-short.csv')
items = loadInvestments(dataFrame)
print(items)
money = 15000 # change the amount of money you want to invest here
# items = [["A", 60, 120], ["B", 100, 20],["C", 120, 30]] # test
# print(items)
val = []
roi = []
for i in items:
    val.append(i[1])
    roi.append(i[2])
print(optimizeInvestments(items, money))

这将提供以下输出:

我想用"and"或逗号分隔.然后,我还希望输出每个名称的特定ROI.

我还需要为最佳投资实施回溯表.我知道如何在理论上实现回溯表,但我不确定如何实现背包问题.

推荐答案

这就是我最终解决这个问题的方法.

def optimizeInvestments(invstmt, money):
""" knapsack problem """
n = len(invstmt)
val = []
name = []
roi = []
traceback = [[0 for i in range(n)] for i in range(n)]

for i in invstmt:
    name.append(i[0])
    val.append(i[-1])
    roi.append(i[1])

K = [[0 for x in range(money + 1)] for x in range(n + 1)]
I = [[0 for x in range(money + 1)] for x in range(n + 1)]

for i in range(n + 1):
    for w in range(money + 1):
        if i == 0 or w == 0:
            K[i][w] = 0
            I[i][w] = ""

        elif roi[i - 1] <= w:

            if (val[i - 1] + K[i - 1][w - roi[i - 1]] > K[i - 1][w]):
                K[i][w] = val[i - 1] + K[i - 1][w - roi[i - 1]]
                if len(I[i - 1][w - roi[i - 1]]) > 0:
                    I[i][w] = name[i - 1] + " & " + I[i - 1][w - roi[i - 1]]
                else:
                    I[i][w] = name[i - 1]

            else:
                K[i][w] = K[i - 1][w]
                I[i][w] = I[i - 1][w]

        else:
            K[i][w] = K[i - 1][w]
            I[i][w] = I[i - 1][w]

portfolio = 'With $'+ str(money) + ", invest in " + str(I[n][money]) + " for a ROI of $" + str(K[n][money])
return portfolio

Python相关问答推荐

我必须将Sigmoid函数与r2值的两种类型的数据集(每种6个数据集)进行匹配,然后绘制匹配函数的求导.我会犯错

Polars比较了两个预设-有没有方法在第一次不匹配时立即失败

对Numpy函数进行载体化

为什么tkinter框架没有被隐藏?

Pandas 都是(),但有一个门槛

使可滚动框架在tkinter环境中看起来自然

如何在python xsModel库中定义一个可选[December]字段,以产生受约束的SON模式

如何在Python数据框架中加速序列的符号化

如何在WSL2中更新Python到最新版本(3.12.2)?

在Python argparse包中添加formatter_class MetavarTypeHelpFormatter时, - help不再工作""""

为什么Django管理页面和我的页面的其他CSS文件和图片都找不到?'

让函数调用方程

处理Gekko的非最优解

为什么后跟inplace方法的`.rename(Columns={';b';:';b';},Copy=False)`没有更新原始数据帧?

Python OPCUA,modbus通信代码运行3小时后出现RuntimeError

python3中np. divide(x,y)和x/y有什么区别?'

在任何要保留的字段中添加引号的文件,就像在Pandas 中一样

为什么在生成时间序列时,元组索引会超出范围?

如何在Python中实现高效地支持字典和堆操作的缓存?

如何删除剪裁圆的对角线的外部部分