Resample df с 1/10 года вместо ежедневного, ежемесячного и т. Д. - PullRequest
2 голосов
/ 30 января 2020

У меня есть большой CSV-файл с записями более 20 лет для около 100 различных брендов. Пример исходных данных, содержащихся в CSV-файле и сгруппированных по годам, выглядит следующим образом.

name                year    value
brand1             2000     3
brand2             2000     3
brand3             2000     1
brand4             2000     0
brand5             2000     3
brand6             2000     1
brand7             2000     1
brand8             2000     3
brand9             2000     1
brand10            2000     3
brand11            2000     1
brand12            2000     0
brand13            2000     0
brand14            2000     3
brand15            2000     3
brand16            2000     0
brand17            2000     0
brand18            2000     0
brand19            2000     1
brand20            2000     0

brand1             2001     6
brand2             2001     4
brand3             2001     2
brand4             2001     1
brand5             2001     4
brand6             2001     2
brand7             2001     4
brand8             2001     4
brand9             2001     1
brand10            2001     6
brand11            2001     4
brand12            2001     0
brand13            2001     0
brand14            2001     3
brand15            2001     4
brand16            2001     1
brand17            2001     0
brand18            2001     0
brand19            2001     4
brand20            2001     3

Я могу повторно сопоставить его с ежедневными, ежемесячными, ежеквартальными и c. После борьбы за третий день я все еще не могу сгруппировать свои данные по имени и перепланировать их, используя 1/10 года, а затем интерполировать столбец значений.

Ниже приведен пример желаемых окончательных выходных данных.

name           year          value
brand1         1999          0.0
brand1         1999.1        0.3
brand1         1999.2        0.6
brand1         1999.3        0.9
brand1         1999.4        1.2
brand1         1999.5        1.5
brand1         1999.6        1.8
brand1         1999.7        2.1
brand1         1999.8        2.4
brand1         1999.9        2.7
brand1         2000          3.0

brand1         2000          3.0
brand1         2000.1        3.3
brand1         2000.2        3.6
brand1         2000.3        3.9
brand1         2000.4        4.2
brand1         2000.5        4.5
brand1         2000.6        4.8
brand1         2000.7        5.1
brand1         2000.8        5.4
brand1         2000.9        5.7
brand1         2001          6.0

Я бы хотел, чтобы все данные в моем CSV выглядели так.

На многих пробных версиях с использованием TimedeltaIndex не принес никаких плодов.

есть способ, которым я могу интерполировать, используя любой другой метод или используя timedeltaindex в pandas для достижения требуемых результатов.

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

1 Ответ

1 голос
/ 30 января 2020

в R, используя library(data.table) мы можем сделать

dt[dt[, .(year = seq.int(year[1], year[.N], 0.1)), by=name], on=c('year', 'name')][, 
  value := zoo::na.approx(value, na.rm = FALSE)]

, что дает

#         name   year value
# 1:    brand1 2000.0   3.0
# 2:    brand1 2000.1   3.3
# 3:    brand1 2000.2   3.6
# 4:    brand1 2000.3   3.9
# 5:    brand1 2000.4   4.2
# ---                     
# 216: brand20 2000.6   1.8
# 217: brand20 2000.7   2.1
# 218: brand20 2000.8   2.4
# 219: brand20 2000.9   2.7
# 220: brand20 2001.0   3.0

Данные:

dt = fread("
name               year    value
brand1             2000     3
brand2             2000     3
brand3             2000     1
brand4             2000     0
brand5             2000     3
brand6             2000     1
brand7             2000     1
brand8             2000     3
brand9             2000     1
brand10            2000     3
brand11            2000     1
brand12            2000     0
brand13            2000     0
brand14            2000     3
brand15            2000     3
brand16            2000     0
brand17            2000     0
brand18            2000     0
brand19            2000     1
brand20            2000     0
brand1             2001     6
brand2             2001     4
brand3             2001     2
brand4             2001     1
brand5             2001     4
brand6             2001     2
brand7             2001     4
brand8             2001     4
brand9             2001     1
brand10            2001     6
brand11            2001     4
brand12            2001     0
brand13            2001     0
brand14            2001     3
brand15            2001     4
brand16            2001     1
brand17            2001     0
brand18            2001     0
brand19            2001     4
brand20            2001     3"
)
...