如何处理即时创建的海量数据帧?

时间:2017-09-19 12:22:33

标签: python pandas bigdata

我希望有人可以提供一些帮助。我还有很多关于熊猫的知识,这是我第一次遇到这样的问题 - 处理大量数据。 RAM就成了一个问题。与我在网上找到的其他问题略有不同的是,其他人经常读取大型csv文件,而我读了相对较小的 csv,并从中创建了大量数据。

This is my code (html version of jupyter notebook).

我正在做的基础知识:

  1. 将csv读入数据帧
  2. 使用TagName列对csv进行分组
  3. 对于每个标记,将数据重新采样为1秒分辨率
  4. 插值间隙
  5. 填补任何空白(这是必需的,但与相关问题无关)
  6. 将数据保存到新的df
  7. 透视新的df,使每个TagNames成为一列。
  8. 从5-ish开始,事情变得忙乱,因为我每个标签创建了31 557 600个数据点(并且大约有23个标签)。

    拜托,你能帮我处理一下吗?

    修改

    我创建了一个最小的例子。 Jupyter notebook file here,下面的代码相同。

    我的问题是:一个人如何处理这么大量的数据,因为随着你增加标签数量或数据分辨率,它会很快失控?因为我的电脑用光了具有16GB内存的RAM(嗯,不是这个确切的例子 - 这个更小,有一个工作示例显示我想要做什么)。 应该如何处理这样的数据,因为它是那么多?我不知道itterrows是否会运行良好,因为我正在插值以填充值。

    import pandas as pd
    import numpy as np
    
    # random timestamp from https://stackoverflow.com/questions/553303/generate-a-random-date-between-two-other-dates
    def random_date(start, end, position=None):
        start, end = pd.Timestamp(start), pd.Timestamp(end)
        delta = (end - start).total_seconds()
        if position is None:
            offset = np.random.uniform(0., delta)
        else:
            offset = position * delta
        offset = pd.offsets.Second(offset)
        t = start + offset
        return t
    
    #build dummy df
    df = pd.DataFrame(np.random.rand(200), columns=['Value'])
    df['TagName'] = ''
    df.loc[df.index <= 100, 'TagName'] = 'Tag A'
    df.loc[df.index > 100, 'TagName'] = 'Tag B'
    df['DateTime'] = [random_date(start="2016-01-01 00:00:00", end="2016-03-31 23:59:59") for i in range(df.shape[0])]
    df.loc[df['TagName'] == 'Tag A', 'DateTime'] = sorted(df[df['TagName'] == 'Tag A']['DateTime'].values)
    df.loc[df['TagName'] == 'Tag B', 'DateTime'] = sorted(df[df['TagName'] == 'Tag B']['DateTime'].values)
    
    #actual processing
    # final lists for appending to one big df
    # because it's better to create from lists
    # than appending in a loop
    tagname_list = []
    value_list = []
    datetime_list = []
    
    groups = df.groupby('TagName')
    for tag, d in groups:   
        # interpolate continous data tags
        resampled = d.set_index('DateTime').asfreq('S')
        filled = resampled.interpolate('pchip')    
    
        #pd.concat([output, filled['Value']])
        tagname_list.extend(len(filled) * [tag])
        value_list.extend(filled['Value'].values)
        datetime_list.extend(filled.index)
    
    del df
    
    
    this_is_what_im_after = pd.DataFrame({'TagName': tagname_list, 'Value': value_list, 'DateTime': datetime_list}).pivot_table(values='Value', index='DateTime', columns='TagName')
    

0 个答案:

没有答案