当前位置:  开发笔记 > 编程语言 > 正文

如何在Pandas中更好地管理我对内存的使用?

如何解决《如何在Pandas中更好地管理我对内存的使用?》经验,为你挑选了1个好方法。

我用熊猫来存储,负载和操纵财务数据.典型的数据文件是6000x4000 DataFrame(6000股x 4000个交易日),如果说一半股票在给定日期具有价值N/A,则将以CSV格式大小为200MB.我已经使用具有的存储器,这已经足够用于装载这种尺寸的整个的CSV到存储器中,执行各种计算,然后将结果存储16GB的工作站.在一般情况下,我在高峰使用期间最终使用大约10GB的RAM.我有我可以但更有效地做事情的感觉.我想将这个数字降到2GB左右,这样我就可以使用普通笔记本电脑和4GB内存来运行我的每日更新.这合理吗?我使用了太多内存,无论是我的硬件?

我理解上面的答案取决于我正在做的事情的细节.下面是功能我可能会遇到的类型的例子:

def momentum_strategy():
    # prices.csv is a matrix containing stock prices for 6000 stocks
    # and 4000 trading dates
    prices = pd.read_csv("prices.csv")
    # Daily stock returns
    returns = prices/prices.shift(1) -1 
    # Annualized return volatility
    volatility = pd.rolling_std(returns, 21, 21) * 252**0.5
    # 6-month stock returns
    trail6monthreturns = prices/prices.shift(21*6) - 1
    # Rank of 6 month stock returns
    retrank = trail6monthreturns.rank(axis=1, ascending=False)
    # Portfolio of the top 100 stocks as measured by 6 month return
    positions = retrank.apply(lambda x: np.where(x<= 100, 1, np.nan))
    # Daily returns for top 100 stocks
    uptrendreturns = positions * returns
    # Daily return for 100 stock portfolio
    portfolioreturns = uptrendreturns.mean(1)
    return positions, portfolioreturns

我想过是使用HDF5存储格式,而不是CSV的通过最近的测试中与大熊猫文件的审阅和stackoverlfow我看这是输入/输出和内存少这样的操作过程中密集的要快得多.有什么想法吗?例如,我存储每日开放,高,低,关闭,音量,流通股,PE比率,盈利增长,和另一个30项不同的措施这样在一个单独的CSV为每个(如在上面的例子中,典型地6000股份X每个4000交易日期).如果建议使用马桶盖到HDF5,应该只是我存储在30+不同的H5文件中的这些相同DataFrames?

在上面的函数,如果我想有机会获得一些功能完成后的中间结果,但不使用内存,将是有意义的存储在包含HDF5文件中的"临时"文件夹中的结果吗?例如:

def momentum_strategy_hdf5():
    # prices.csv is a matrix containing stock prices for 6000 stocks
    # and 4000 trading dates
    prices = pd.read_csv("prices.csv")
    s = pd.HDFStore("temp.h5")
    # Daily stock returns
    s['returns'] = prices/prices.shift(1) -1 
    # Annualized return volatility
    s['volatility'] = pd.rolling_std(s['returns'], 21, 21) * 252**0.5
    # 6-month stock returns
    s['trail6monthreturns'] = prices/prices.shift(21*6)
    # Rank of 6 month stock returns
    s['retrank'] = s['trail6monthreturns'].rank(axis=1, ascending=False)
    # Portfolio of the top 100 stocks as measured by 6 month return
    s['positions'] = s['retrank'].apply(lambda x: np.where(x<= 100, 1, np.nan))
    # Daily returns for top 100 stocks
    s['uptrendreturns'] = s['positions'] * s['returns']
    # Daily return for 100 stock portfolio
    s['portfolioreturns'] = s['uptrendreturns'].mean(1)
    return s['positions'], s['portfolioreturns']

编辑:我只是测试上述两种功能,和第一个花了15秒,而第二花42秒.所以第二个书面慢得多,但希望有一个更好的办法?



1> Jeff..:

以下是此类数据的典型工作流程:

1)读入csv数据,转换为DataFrame,强制数据类型,写出使用HDFStore(根据您的需要可以是'固定'或'表'格式).这是一个单独的过程,然后退出该过程.当数据集很大时,我会以逻辑格式(例如说日期范围)读取它,然后输出'table'格式的HDF5文件.然后可以附加到此.

2)查询(再次可以是日期或其他一些标准).执行计算,然后写出新的 HDF5文件.这可以并行完成(多个过程).请确保您在每个过程中编写单独的文件.

3)将先前的数据文件合并为单个HDF5文件.这是一个单一的过程事件.

4)根据需要重复2和3.

关键是要做不连续的步骤,在两者之间写出中间数据,然后退出中间的过程.这样可以保持可管理的内存中数据大小,并使内存中的计算速度更快.此外,这允许对只读HDF5文件上的CPU密集型操作进行多次处理.

在单独的系统进程中执行此操作以允许系统回收内存非常重要.

HTH

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有