Заполнить недостающие данные путем интерполяции в таблице Google

У меня есть таблица Google со следующими данными

   A           B       D
1  Date        Weight  Computation
2  2015/12/09          =B2*2
3  2015/12/10  65      =B3*2
4  2015/12/11          =B4*2
5  2015/12/12          =B5*2
6  2015/12/14  62      =B6*2
7  2015/12/15          =B7*2
8  2015/12/16  61      =B8*2
9  2015/12/17          =B9*2

Я хочу построить график веса w.r.т. дата, и / или использовать его с другими столбцами, которые вычисляют другие величины от веса. Однако вы заметите, что есть некоторые недостающие элементы. Я хочу другой столбец, в котором есть данные, основанные на столбце Weight с интерполированными и заполненными отсутствующими значениями. Например:

   A           B       C       D
1  Date        Weight  WeightI Computation
2  2015/12/09          65      =C2*2          # use first known value
3  2015/12/10  65      65      =C3*2
4  2015/12/11          64      =C4*2          # =(62-65)/3*(1)+65
5  2015/12/12          63      =C5*2          # =(62-65)/3*(2)+65
6  2015/12/14  62      62      =C6*2
7  2015/12/15          61.5    =C7*2          # =(61-62)/2*(1)+62
8  2015/12/16  61      61      =C8*2
9  2015/12/17          61      =C9*2          # use the last known value

в столбце C значения заполняются с помощью линейной интерполяции, когда у меня есть найти недостающие данные между двумя известными точками.

Я считаю, что это действительно простой и распространенный случай использования, поэтому я уверен, что это тривиальная вещь, но я не могу найти решение, используя встроенные функции. У меня тоже нет опыта работы с электронными таблицами. Я часами экспериментировал с = INDEX, =MATCH, =VLOOKUP, =LINEST, =TREND и т. д., но я не могу придумать что-то из примеров. Единственным решением, которое я мог использовать, было создание пользовательской функции с помощью Скрипт Google Apps. Хотя мое решение работает, оно, кажется, выполняется очень медленно. Моя таблица также огромна.

какие-нибудь советы, решения?

3 ответов


вы можете использовать forecast для которого может быть удобнее сначала отделить даты, которые у вас есть показания от тех, которые у вас нет (и изменить позже). Так что с помощью всего трех чтений скажите:

       A        B
1 10/12/2015    65
2 14/12/2015    62
3 16/12/2015    61

и даты, для которых требуются значения слева ниже:

 6 09/12/2015   65.6
 7 11/12/2015   64.3
 8 12/12/2015   63.6
 9 15/12/2015   61.5
10 17/12/2015   60.2

формула, порождающая 65.6 в B6 (и скопировано оттуда в костюм):

=forecast(A6,$B:$B,$A:$A)  

Это не рассчитывается так, как вы показываете, но может быть считается несколько более точным, в частности путем экстраполяции недостающих конечных значений, а не просто повторения их ближайшего доступного значения.

рассчитав значения, вы, вероятно, захотите собрать данные в порядке дат. Поэтому я предлагаю скопировать B6:B10 и отредактировать, вставить специальный, вставить значения только сверху, а затем сортировка в соответствии.

на диаграмме ниже сравниваются результаты выше (синий) с результатами в вашем OP (зеленый) и помечается данный точки данных:

SO34150309 example


найдено решение, которое удовлетворяет большинству моих требований, используя:

  1. используется =FILTER() сначала удалить пустые строки, где данные недоступны (спасибо за подсказку от "pnuts").

  2. и =MATCH() для просмотра двух последовательных строк из отфильтрованной таблицы. В моем случае я смог использовать эту функцию, потому что столбец A занимает и не имеет повторений.

  3. и после этого используя формулу линии к интерполировать значения.

таким образом, выход становится:

   A            B       C           D       E
 1 Date         Weight  FDdate      FWeight IWeight
 2 2015/05/09           2015/05/10  65.00   #N/A
 3 2015/05/10   65.00   2015/05/13  62.00   65.00
 4 2015/05/11           2015/05/15  61.00   64.00
 5 2015/05/12                               63.00
 6 2015/05/13   62.00                       62.00
 7 2015/05/14                               61.50
 8 2015/05/15   61.00                       61.00
 9 2015/05/16                               61.00
10 2015/05/17                               61.00

где клетки C2 и D2 имеют следующую формулу диапазона (незначительное Примечание: следующие формулы, конечно, могут быть объединены, если столбцы A и B находятся рядом):

C2 =FILTER($A:$A, NOT(ISBLANK($B:$B)))
D2 =FILTER($B:$B, NOT(ISBLANK($B:$B)))

клетки E2 через E10 содержит следующую формулу интерполяции строк: [y = y1 + (y2 - y1) / (x2 - x1) * (x - x1)]:

E2 =(INDEX($D:$D, MATCH($A2, $C:$C, 1),     1))
   +(INDEX($D:$D, MATCH($A2, $C:$C, 1) + 1, 1)
   - INDEX($D:$D, MATCH($A2, $C:$C, 1),     1))
   /(INDEX($C:$C, MATCH($A2, $C:$C, 1) + 1, 1)
   - INDEX($C:$C, MATCH($A2, $C:$C, 1),     1))
   *(INDEX($C:$C, MATCH($A2, $C:$C, 1),     1) - $A2) * -1

для чего это решение не работает, когда первый ячейка B2 не имеет значения, где результат формулы в #N / A. Все это было бы намного эффективнее, если бы у нас было что-то вроде =INTERPOLATE_LINE( A2, $A:$A, $B:$B ) в электронной таблице google, но, к сожалению, этого не существует. Пожалуйста, поправьте меня, если я пропустил это в моем чтении поддерживаемые функции в электронной таблице google.


Я нашел решение, которое полностью удовлетворяет требованиям. Я использовал отдельный лист, чтобы разбить расчет на части.

создать новый лист. Введите следующие формулы в ячейки A2-F2, а затем скопируйте их вниз по странице.

  1. Ячейка A2: скопируйте данные о весе в первый столбец. (В этом примере имя листа-ежедневная запись, а веса записываются в столбец Д.)

    'Daily Record'!D2

  2. Ячейки B2: найти самый последний записанный вес.

    =INDEX(FILTER(A:A2,A:A2 <> ""),COUNT(FILTER(A:A2,A:A2 <> "")),1)

  3. Ячейка C2: подсчитать количество дней с момента последнего взвешивания.

    =IF(A2<>"",0,IF(ROW(C2)<3,0,C1+1))

  4. Ячейка D2: найти следующий записанный вес (с текущей даты или позже.)

    =IFERROR(INDEX(FILTER(A2:A,A2:A <> ""),1,1),"")

  5. Ячейки E2: подсчитать количество дней до следующего взвешивания.

    =IF(A2<>"",0,IF(E3="","",E3+1))

  6. Ячейка F2: вычислить интерполированные вес.

    =IF(A2 <> "", A2, IF(D2 = "", "", B2 + (D2-B2)*C2/(C2+E2)))