无法使用 <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 案例数。
示例数据: >
- Date_reported----New_cases
- 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'])
像您一样定义 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)
所以我有这个等式我必须最大化 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 案例数。
示例数据: >
- Date_reported----New_cases
- 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'])
像您一样定义 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)