我目前正在编写一个函数来模拟投币游戏中的财富。 f是我将本钱(AUM)投入该游戏的百分比。我模拟10000步,每一步都想将AUM编号包括在我的财富列表中,因此,在10000步的末尾,我将得到一个包含10001个数字的列表(包括AUM = 100)。最后,我希望有一个数据框(10001 * 100),每列对应于投资了不同f(列名)的财富系列。但是我的以下代码不断弹出错误:
提高TypeError(msg) TypeError:无法连接类型为“”的对象;仅有pd.Series,pd.DataFrame和pd.Panel(不建议使用)objs有效
或
ValueError:值的长度与索引的长度不匹配
谁能帮助我解决这个问题(将100个系列(每个具有10001个元素)添加到一个数据框中)?非常感谢!
df = pd.DataFrame()
wealth = [100] ### initial AUM
def path(f):
global AUM
global wealth
for j in range(10000): ### one simulation with 10,000 steps
if Ber_Dist_V [j] == 1: ### Bernouli distribution
AUM = AUM * (1-f) + AUM * f * (1 + win)
else:
AUM = AUM * (1-f) + AUM * f * (1 + lose)
wealth.append(AUM)
wealth = pd.Series(wealth)
df[f]=wealth
weight = np.linspace(0, 1, 100,endpoint=False).tolist()
for f in weight:
path_weight(f)
答案 0 :(得分:0)
您得到ValueError
的原因是您的wealth
列表的长度非常不同。没必要将它变成一系列以将其设置为数据框的列之一。您的内部逻辑不是很透明,但是我认为重置列表(因此wealth
始终具有恒定的长度)应该可以解决该问题。我建议类似以下内容:
df = pd.DataFrame()
def path(f):
global AUM
wealth = [100] # Resets `wealth` with each invocation of `path()`.
for j in range(10000): ### one simulation with 10,000 steps
if Ber_Dist_V [j] == 1: ### Bernouli distribution
AUM = AUM * (1-f) + AUM * f * (1 + win)
else:
AUM = AUM * (1-f) + AUM * f * (1 + lose)
wealth.append(AUM)
df[f] = wealth
weight = np.linspace(0, 1, 100,endpoint=False).tolist()
for f in weight:
path_weight(f)
但是,如果您想使代码更快(并且您知道wealth
的长度为l0001个元素,则可以在实例化时预填充它,而只需更新元素即可。这应该比使用更快.append()
。我会这样写:
df = pd.DataFrame()
def path(f):
global AUM
wealth = [100] + [0]*10000 # Resets `wealth` with each invocation of `path()`. Prefills wealth with `0`.
for j in range(1, 10001): ### one simulation with 10,000 steps
if Ber_Dist_V [j] == 1: ### Bernouli distribution
AUM = AUM * (1-f) + AUM * f * (1 + win)
else:
AUM = AUM * (1-f) + AUM * f * (1 + lose)
wealth[i] = AUM # Faster than using `.append()`.
df[f] = wealth
weight = np.linspace(0, 1, 100,endpoint=False).tolist()
for f in weight:
path_weight(f)