我用熊猫来存储,负载和操纵财务数据.典型的数据文件是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)读入csv数据,转换为DataFrame,强制数据类型,写出使用HDFStore
(根据您的需要可以是'固定'或'表'格式).这是一个单独的过程,然后退出该过程.当数据集很大时,我会以逻辑格式(例如说日期范围)读取它,然后输出'table'格式的HDF5文件.然后可以附加到此.
2)查询(再次可以是日期或其他一些标准).执行计算,然后写出新的 HDF5文件.这可以并行完成(多个过程).请确保您在每个过程中编写单独的文件.
3)将先前的数据文件合并为单个HDF5文件.这是一个单一的过程事件.
4)根据需要重复2和3.
关键是要做不连续的步骤,在两者之间写出中间数据,然后退出中间的过程.这样可以保持可管理的内存中数据大小,并使内存中的计算速度更快.此外,这允许对只读HDF5文件上的CPU密集型操作进行多次处理.
在单独的系统进程中执行此操作以允许系统回收内存非常重要.
HTH