Я попытался поэкспериментировать с некоторыми функциями Xlwings. Я хотел бы использовать общую функцию из numpy, которая позволяла быстро интерполировать (numpy.interp).
@xlfunc
def interp(x, xp,yp):
"""Interpolate vector x on vector (xp,yp)"""
y=np.interp(x,xp,yp)
return y
@xlfunc
def random():
"""Returns a random number between 0 and 1"""
x=np.random.randn()
return x
Например, я создаю два вектора (xp, yp) вот так (в Excel) 800 строк
First Column Second Column
0 =random()
1 =random()
2 =random()
3 =random()
4 =random()
5 =random()
[...]
В третьем столбце я создаю еще один вектор (60 строк) со случайным числом от 0 до 800 (в порядке возрастания), что дает мне что-то вроде этого:
Third Column
17.2
52.6
75.8
[...]
Я хотел бы интерполировать третий столбец в первый столбец. Так
Fourth Column
=interp(C1,A1:A800,B1:B800)
=interp(C2,A1:A800,B1:B800)
=interp(C3,A1:A800,B1:B800)
[...]
Это легко сделать. Но если у меня есть 10 или более столбцов для интерполяции, это может занять слишком много времени. Я уверен, что есть лучший способ сделать это. Идея ?
Спасибо за вашу помощь !
изменить :
Я пробовал это, но не работает в "xw.Range[...].value=y"
@xw.xlfunc
def interpbis(x, xp,yp):
"""Interpolate scalar x on vector (xp,yp)"""
thisWB=xw.Workbook.active()
thisSlctn=thisWB.get_selection(asarray=True)
sheet=thisSlctn.xl_sheet.name
r = thisSlctn.row
c = thisSlctn.column
y=np.interp(x,xp,yp)
xw.Range(sheet,(r,c)).value=y
return None