【问题标题】:filing missing time series in python在python中归档丢失的时间序列
【发布时间】:2021-08-14 05:15:08
【问题描述】:

在R中,它有fill_gaps可以填充时间序列以及下面的水果等键。我想知道python中是否有类似的东西。

library(tribble)
harvest <- tsibble(
  year = c(2010, 2011, 2013, 2011, 2012, 2014),
  fruit = rep(c("kiwi", "cherry"), each = 3),
  kilo = sample(1:10, size = 6),
  key = fruit, index = year
)

# gaps as default `NA`
fill_gaps(harvest, .full = TRUE)

   year  fruit   kilo
   <dbl> <chr>  <int>
 1  2010 cherry    NA
 2  2011 cherry     5
 3  2012 cherry     7
 4  2013 cherry    NA
 5  2014 cherry     8
 6  2010 kiwi       9
 7  2011 kiwi      10
 8  2012 kiwi      NA
 9  2013 kiwi       4
10  2014 kiwi      NA

python代码如下所示,我有3年的数据和1000种不同的产品。

import pandas as pd
from datetime import datetime
db = pd.DataFrame(
    [[datetime(2019, 2, 7), 'a' , 1,2,3],
     [datetime(2019, 2, 7), 'b', 2, 3, 3],
      [datetime(2019, 2, 8), 'a', 2, 3, 3],
       [datetime(2019, 2, 9), 'a', 12, 13, 3],
        [datetime(2019, 2, 9), 'b', 10, 2, 3]
        ]
)
db.columns = ['date', 'product', 'x','y','z']

db       
 date          product x   y  z
0 2019-02-07       a   1   2  3
1 2019-02-07       b   2   3  3
2 2019-02-08       a   2   3  3
3 2019-02-09       a  12  13  3
4 2019-02-09       b  10   2  3

预期结果是:

    date     product   x   y  z
0 2019-02-07       a   1   2  3
1 2019-02-07       b   2   3  3
2 2019-02-08       a   2   3  3
3 2019-02-08       b   0   0  0
4 2019-02-09       a  12  13  3
5 2019-02-09       b  10   2  3

【问题讨论】:

  • 提供示例 pandas 数据框,以及预期的输出。如果您也提供源代码会很棒

标签: python pandas time-series


【解决方案1】:

几个步骤:

设置索引

df = db.copy()

df = db.set_index(['date', 'product'])

创建一个包含dateproduct 的所有可能组合的索引:

reindexer = pd.MultiIndex.from_product(df.index.levels)
reindexer
MultiIndex([('2019-02-07', 'a'),
            ('2019-02-07', 'b'),
            ('2019-02-08', 'a'),
            ('2019-02-08', 'b'),
            ('2019-02-09', 'a'),
            ('2019-02-09', 'b')],
           names=['date', 'product'])

重新索引df,用0填充空值并重置索引:

df.reindex(reindexer, fill_value = 0).reset_index()

        date product   x   y  z
0 2019-02-07       a   1   2  3
1 2019-02-07       b   2   3  3
2 2019-02-08       a   2   3  3
3 2019-02-08       b   0   0  0
4 2019-02-09       a  12  13  3
5 2019-02-09       b  10   2  3

您可以使用来自pyjanitorcomplete 抽象步骤(并处理重复的索引,如果有的话):

# pip install pyjanitor
import janitor
db.complete(['date', 'product']).fillna(0)
 
        date product     x     y    z
0 2019-02-07       a   1.0   2.0  3.0
1 2019-02-07       b   2.0   3.0  3.0
2 2019-02-08       a   2.0   3.0  3.0
3 2019-02-08       b   0.0   0.0  0.0
4 2019-02-09       a  12.0  13.0  3.0
5 2019-02-09       b  10.0   2.0  3.0

请注意,reindex 在填充空值时会保留数据类型; complete 不做填充,它把这个职责交给了fillna

所以,对于您的用例,我认为 reindex 就足够了(您也可能不太热衷于拥有另一个库依赖项)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 2020-09-30
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    相关资源
    最近更新 更多