我现在要将股票的 tick 数据转成频率为 1 分钟的数据。 数据是存在 amazon s3, 一个日期(文件夹)下面有 2400+只股票,以 zip 格式存储, zip 里面是 一个 csv 文件。 一个 csv 文件大约在 4000+行。
可以认为 csv 文件就是有一列是时间,大约间隔 3 秒,从 9:25:xx-15:0x:xx ,一列是价格。
现在采用的是笨办法,把文件下载到本地,已经下载了一个月的,大约 2G 左右。
主要写了 2 个函数,一个是读 zip 文件到 pandas 的 dataframe ,另一个是转换 dataframe 至 1min 的频率(这里是使用 dataframe 的 resample 函数)。
为了使用 resample , dataframe 的 index 需要是 DatetimeIndex 格式。 我尝试了几种方法。
def parse(time_string):
year = int(time_string[0:4])
month = ...
...
dt = datetime.datetime(year,month,...)
return dt
方法 3 比方法 1 、 2 快 3-30 倍左右。但是即使这样,还是很耗时。
def zip_to_dataframe(zipped_file):
...
# index 之前是字符串格式
df.index = df.index.map(parse) # 本行耗时占整个函数的 60%
...
第二个函数
def transform_dataframe(df):
...
col_loc = transformed_df.columns.get_loc('open') #取得开盘价所在的列位置
transformed_df.iloc[0,col_loc] = open_price # 本行耗时占整个函数的 45%
...
对于处理一个 zip 文件,两个函数各自耗时 100+毫秒左右。如果按照两个函数耗时 0.25 秒算, 0.25(秒) * 2400(一天有 2400 左右只股票) * 20(一个月大概 20 个左右的交易日) * 12(个月) / 3600(秒) = 40 小时!
即使我用并行,公司电脑只有双核.也要 20 小时。这只是 1 年的,如果要转换多年的。。。
我现在想到的:
优化程序,减少耗时。对我来说很难想的出来了, datetime.datetime 后面应该是用的 C 函数吧?感觉很难提升了。 我想不明白为什么对一个单元格赋值会占用那么大的时间。
把程序拷到其他电脑,一台电脑跑一年的数据,感觉这办法太土。。。。
用 spark 分布式?没处理过,公司没用 spark ,我都是单机版玩玩,如果这是正途,我愿意试试。
请多多赐教
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.