问题描述
所以我有这个方程,我必须最大化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)