【问题标题】:Chunks of different sizes on large timeseries dataset大型时间序列数据集上不同大小的块
【发布时间】:2019-09-27 11:57:34
【问题描述】:

我需要将一个大型数据集导入 pandas 数据框,以便进行一些数据操作。

我发现这样做的好方法是:

  • 使用分块以分块的形式加载和处理数据帧。分解任务,分别处理不同的部分,然后将它们组合起来。

如果我定义我的块大小等于 1000:

pd.read_sql_query(sql=query, con=engine, chunksize=1000)

循环的每次迭代都会将 1000 行读入一个数据帧。

但是,我的数据框有一个 DATE 列,我需要确保每个块都包含每个产品(SKU 列)的整个时间序列(DATE 列)。

  DATE     STORE   COD  SKU  UNITS_SOLD
2018-02-01  HD01    CD  70  539.000
2018-03-01  HD01    CD  70  511.000
2018-04-01  HD01    CD  70  468.000
2018-05-01  HD01    CD  70  447.000
2018-06-01  HD01    CD  70  382.000
2018-07-01  HD01    CD  70  348.000
2018-02-01  HA01    CD  80  539.000
2018-03-01  HA01    CD  80  511.000
2018-04-01  HA01    CD  80  468.000
2018-05-01  HA01    CD  80  447.000
2018-06-01  HA01    CD  80  382.000
2018-07-01  HA01    CD  80  348.000

确保每个块都返回整个产品历史记录的最佳方法是什么? 如果这 1000 行中有一个产品不完整,我想避免分成 2 个块。

【问题讨论】:

  • 您能否澄清您的整个产品历史/整个时间序列/不完整的产品
  • 我认为一个选项可能是,将不完整产品的行保存到下一个块之前
  • 嗨@RomanPerekhrest,为了执行一些操作,我需要按日期对产品进行分组。如果我在 2 个不同的块中有相同的产品,我不能这样做。

标签: python pandas dask


【解决方案1】:

您可能应该在发送的 SQL 中使用 groupby,这意味着您需要遍历 SKU 的所有可能值。如果您首先在服务器端设置一个以这种方式显式排序数据的视图,则可以使用分块。

【讨论】:

    【解决方案2】:

    如果您想使用时间序列,我认为使用块不是正确的方法。您应该使用 groupby 然后应用您喜欢的分析。在 pandas/dask 中基本相同。假设您只想拥有每个 sku 的商店数量

    import dask.dataframe as dd
    import pandas as pd
    
    df = dd.read_csv("file.csv") 
    out = df.groupby('SKU')["STORE"].nunique().compute()
    

    【讨论】:

    • 嗨@rpanai,感谢您的回答。假设这个 csv 文件有 30gb - 如果我使用这种方法,它会在不使用太多内存的情况下执行?
    • 你应该试一试。我可以尝试对我们做一个实验。这是您计划一次性进行的分析,还是需要每天/每周/每月运行一次?在第二种情况下,值得考虑分析的工作方式并相应地对数据进行分区。如果您有任何疑问,请联系我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    相关资源
    最近更新 更多