无法使用 <class 'numpy.ndarray'> 的这些索引器 [[2.]] 在 <class 'pandas.core.indexes.datetimes.DatetimeIndex'> 上进行切片索引

cannot do slice indexing on <class 'pandas.core.indexes.datetimes.DatetimeIndex'> with these indexers [[2.]] of <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: cannot do slice indexing on <class 'pandas.core.indexes.datetimes.DatetimeIndex'> with these indexers [[2.]] of <class 'numpy.ndarray'>.

难道是因为spicy.optimize无法处理数据帧?如果是这样,我该如何规避这个问题?

此外,这是我第一次使用 scipy,所以如果您在我的代码中发现其他错误或不合格,请告诉我。

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

示例数据: >

。 . .

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'])

像您一样定义 objective(请注意,它与您原来的 objective 到 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)

然后你得到 maximum/minimum

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

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

k 的值,maximum/minimum 达到

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 是列表,因为 maximum/minimum 有可能多次到达。)

编辑:列表理解的说明:

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)