python - python中每列的高效多重计算

标签 python database vector

背景:

我是 Python 和一般编程的新手。我想知道我的实现方法是否正确,或者是否应该以更好的方式完成。

数据:

我有一个 csv,大约有 400 种股票,即

Date, SH Ltd, Date, QS Ltd, Date, WX Ltd ...
26/02/18, 34, 16/06/13, 5634, 15/06/17, 100
27/02/18, 33, 17/06/13, 5763, 16/06/17, 100
28/02/18 ,35, 18/06/13, 6139, 17/06/17, 100
...

所以每一列都有一些随机的开始日期,但所有日期都将在昨天结束。现在假设我想做 3 件事,

1) 计算过去 252 天的交易量 2) 计算东​​部股票最差的三个2天缺口。

我的方法

我目前正在考虑遍历 CSV 的每一列,创建一个时间序列向量。然后我可以对其运行一个方法来计算从开始日期 + 2 到今天的 3 天间隔。然后创建一个向量,将这个向量从大到小排序并吐出 3 个最小的。然后我用最后 252 天计算出 stdev 并乘以 252 的平方根。

在此之后我有 2 个输出

1) 最差 2 天表现的向量(5 最差) 2) 卷的最后 252 天的数字。

此时,我将这些数据放入 2D perf 的 csv 和波动率 csv 中。然后我继续遍历所有其他列,直到它有数据并添加到上面的 csv 文件中。

我的问题:

这是一个非常低效的方法吗?与仅使用单个向量进行一次计算相比,这种持续使用多个向量是否会大大降低我的程序速度?

最佳答案

让我们从对问题和简短答案的一些清晰解释开始,然后讨论一般优化问题。

我创建了一个包含更多行的文件,并且还删除了列名中的空格(以简化操作)。

Date,SH,Date,QS,Date,WX
26/02/18, 34, 16/06/13, 5634, 15/06/17, 100
27/02/18, 33, 17/06/13, 5763, 16/06/17, 100
1/03/18 ,35, 18/06/13, 6139, 17/06/17, 100
2/03/18 ,35, 18/06/13, 6139, 17/06/17, 100
3/03/18 ,35, 18/06/13, 6139, 17/06/17, 100
4/03/18 ,39, 18/06/13, 6139, 17/06/17, 100
5/03/18 ,35, 18/06/13, 6139, 17/06/17, 100
6/03/18 ,35, 18/06/13, 6139, 17/06/17, 100
7/03/18 ,35, 18/06/13, 6114, 17/06/17, 100
8/03/18 ,35, 18/06/13, 6139, 17/06/17, 100
9/03/18 ,35, 18/06/13, 6139, 17/06/17, 100
19/03/18 ,35, 18/06/13, 6139, 17/06/17, 100

import pandas as pd

fn = "testlogs" WINDOW = 3

df = pd.read_csv(fn)

print(df.SH.rolling(WINDOW).std(ddof=0))

0          NaN
1          NaN
2     0.816497
3     0.942809
4     0.000000
5     1.885618
6     1.885618
7     1.885618
8     0.000000
9     0.000000
10    0.000000
11    0.000000
Name: SH, dtype: float64

有关 VOL 的更多信息,请参阅 here

现在,关于效率,“过早的优化是万恶之源”(Knuth)。在你的例子中,如果你只有 400 只股票,每天只有一条线,那么 100 年的数据不到 14MB,而便宜的智能手机通常有 16GB 的内存。因此,您的所有数据都将位于 ram 中,即使您多次读取每个值,VOL 的计算也应该只需要几分之一秒,而且 CPU 使用率非常低。

更多关于我的具体实现——我用的是pandas,有以下优点: (1) 简短的代码 (2) 向量计算的效率

缺点: 需要学习这个库,这对初学者来说可能会让人不知所措。

关于python - python中每列的高效多重计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54942385/

相关文章:

python - 如何使用 PyCharm 观察变量?

python - matplotlib 的 pyplot() 和 pandasplot() 之间的区别?

python - 如何匹配字符串中的确切单词?

python - 如何过滤掉嵌套列表中的条件逻辑元素

php - 根据订单栏显示产品订单

php - 使用codeigniter查询本月创建的记录

c++ - 将关键点转换为 mat 或将它们保存到文本文件 opencv

C++ 使用 for 循环迭代 2 个 vector

sql - 数据库模式

c++ - Linux 上的 std::vector sort() ?