无法使用<class'numpy.ndarray'>

问题描述

所以我有这个方程,我必须最大化V ** 2 =(((k *(T-k))/ T)* 0.5 (Y2-Y1))** 2。 Y2和Y1是数据的平均值。 T是数据点的总数。确切地说,k标记数据的断点,将其分成两部分,从而领先第一部分Y1和第二部分Y2的平均值。数据在带有日期时间索引的数据框(案例)中给出。 在这里您可以看到到目前为止的代码:

def obj(k):
    Y1=cases[' New_cases'].iloc[:k+1].mean()
    Y2=cases[' New_cases'].iloc[k+1:].mean()    
    return ((k*(180-k))/180)*(Y2-Y1)

x0=0
sol=minimize(obj,x0)

每次运行最小化都会得到:

TypeError:无法使用的这些索引器[[2.]]在上进行切片索引。

是因为Spicy.optimize无法处理数据帧吗?如果是这样,我该如何规避?

这也是我第一次使用scipy,因此,如果您发现我的代码中有其他错误或不合格的地方,请告诉我。

编辑:我精简了代码,使其更简单,可重复。案例数据框具有日期时间索引和一列“ New_cases”,其中包含整数。准确地说,案例文件包含每天新的Covid案例数。

样本数据:>

  • 日期报告----新案例
  • 2020-01-03 --- 0
  • 2020-01-04 --- 1
  • 2020-01-05 --- 0
  • 2020-01-06 --- 3

。 。

  • 2020-07-01 --- 4554

k也应该是整数,因为它标记了断点在数据中的位置

解决方法

您的方法对我来说似乎太复杂了。为什么要使用scipy优化?这是一个高度离散的问题,可管理的大小(内存工作量和速度可以忽略不计)。

如果您设置

T = 180

构造一个长度为T(由0到10之间的随机数组成)的样本帧

cases = pd.DataFrame(np.random.randint(0,10,T),index=pd.date_range('2020-01-03',periods=T,freq='D'),columns=['New_cases'])

像您一样定义目标(请注意,它与您最初的目标在 maximise ((k*(T-k))/T)*0.5(Y2-Y1))**2上稍有不同)

def objective(k):
    y1 = cases['New_cases'].iloc[:k+1].mean()
    y2 = cases['New_cases'].iloc[k+1:].mean()
    return k * (T - k) / T * (y2 - y1)

然后您获得最大值/最小值

objectives = [objective(k) for k in range(len(cases))]

max_objective = max(objectives)
min_objective = min(objectives)

以及达到最大值/最小值的k的值

k_max = [k for k in range(len(cases)) if objectives[k] == max_objective]
k_min = [k for k in range(len(cases)) if objectives[k] == min_objective]

({k_max / k_min是列表,因为有可能多次达到最大值/最小值。)

编辑:列表理解的示例:

objectives = []
for k in range(len(cases)):
    objectives.append(objective(k))

k_max = []
for k in range(len(cases)):
    if objectives[k] == max_objective:
        k_max.append(k)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...