资源经验分享Python股票数据处理的一些代码细节

Python股票数据处理的一些代码细节

2020-01-02 | |  143 |   0

原标题:Python股票数据处理的一些代码细节

原文来自:CSDN      原文链接:https://blog.csdn.net/weixin_44724090/article/details/103776808



Numpy和Pandas相关

Numpy和Pandas比较

Pandas和Numpy各有所长。

在处理股票数据的基础阶段,Pandas能够清晰地展示股票代码、交易日期、价格等信息,且对于信息的分类、归集、整理有很多针对性强的功能函数,非常便捷。

在处理股票数据的高级阶段,尤其在涉及机器学习领域,Numpy用处更多。首先因为Keras等函数库要求的输入类型多为numpy.ndarray,更深层的原因是Numpy在多维数据储存和处理上更具优势,而且由于Numpy的数据类型仅为数字,处理速度比Pandas快很多。

Numpy神奇的取值方法

不同于DataFrame,numpy.ndarray本身是没有索引的,但它的索引方式相当灵活。

比如,以长度相同的,元素为布尔值的numpy.ndarray作为索引。

y = np.array([1, 2, 3, 4, 5])
z = np.array([False,False,False,True,True])
x = y[z]
print(x)
>>> [4 5]

再此基础上,又可以用各种方法生成这种布尔值索引,比如以下:

y = np.array([1, 2, 3, 4, 5])
z = np.array([11, 12, 13, 14, 15])
x = y[z>13]
print(x)
>>> [4 5]

Pandas透视表

在获取股票数据,尤其是从一些金融数据库获取数据时,数据的原始索引方式往往不符合我们的需求,这时我们需要对数据做一些变换处理。

比如下列张原始的DataFrame数据表(仅展示了表尾部分),它包含了股票代码、日期和因子三个维度。

         instrument       turn    volume       date       high        low  
3958753  603016.SHA   2.866226   4246600 2019-12-30  17.138489  15.550813   
3958863  603217.SHA   4.498146   1023778 2019-12-30  48.560001  47.790001   
3958928  603348.SHA  15.438673  10807071 2019-12-30  22.463787  20.058041   
3958999  603578.SHA   1.548533    503583 2019-12-30  20.669724  20.160618   
3959111  603787.SHA   8.877831   6293495 2019-12-30  14.495040  13.518423   

              open       amount      close  
3958753  15.698014   66799268.0  16.833570  
3958863  48.349998   49327120.0  48.560001  
3958928  20.261057  227867088.0  22.463787  
3958999  20.252256   10112697.0  20.608631  
3959111  13.939911   85766672.0  14.330557

由于DataFrame擅长处理二维数据,我需要将它提取转换为多张,每张展示一个因子,以日期为行索引,股票代码为列索引的DataFrame。

最直观的方式是采取For循环的办法,先构建一张空DataFrame,然后把各个元素依次提取填入空DataFrame,但是处理效率非常低。

我起初采取的方法是依靠DataFrame的切片和拼接功能,尽量整块操作,减少循环次数:

df_close = pd.concat([df.loc[df['instrument']==i].set_index('date')['close'] for i in stock_codes], axis=1)

直到发现pd.pivot_table()这个函数可以方便直接地处理这些变换:

df_close = pd.pivot_table(df_all,values='close',index=['date'],columns=['instrument'])
print(df_close.tail())
instrument  002233.SZA  002394.SZA  002454.SZA  002567.SZA  002581.SZA  
date                                                                     
2019-12-24   30.662279   40.128410   13.877932   44.442993   18.995348   
2019-12-25   31.158939   40.042206   13.764643   43.988461   18.879875   
2019-12-26   31.524900   40.257717   13.764643   44.240978   19.053085   
2019-12-27   31.786301   40.300819   13.623031   45.655075   19.053085   
2019-12-30   32.335243   40.559433   13.764643   44.493496   18.995348   

instrument     ...      601015.SHA  601117.SHA  601336.SHA  601872.SHA  
date           ...                                                       
2019-12-24     ...        6.118216    7.116693   50.495480    8.824105   
2019-12-25     ...        6.098415    7.071863   50.623913    8.885554   
2019-12-26     ...        6.118216    7.195144   50.837967    9.561496   
2019-12-27     ...        6.138015    7.139107   50.955696    9.389438   
2019-12-30     ...        6.217216    7.206352   52.518295    9.672104

如何删除numpy.ndarray中指定位置的元素

首先利用numpy.ndarray索引的特性创建一个list或numpy.ndarray,列出想要删除元素的位置(不必按顺序),然后用np.delete()函数删除。注意这里输入的a可以是list或numpy.ndarray类型,输出的c是numpy.ndarray类型。

a = [1,2,3,4,5]
b = [3,1,4]
c = np.delete(a, b, axis=0)
print(c)
>>> [1 3]

如何确定numpy.ndarray中指定值的元素的位置

我没有找过直接删除指定值的方法,而是先用np.where()函数确定指定值所在的位置,再用np.delete()函数删除。这样做的好处是,在中间环节生成了一个索引,可以在机器学习中用于同步处理矩阵x和其对应的label 矩阵y。

a = [1,2,3,1,1]
b = np.where(np.array(a)==1)

np.where()函数要求输入类型为numpy.ndarray,如果是一个list或其他类型,需要进行转换。

print(b)
print(type(b))
>>> (array([0, 3, 4]),)
>>> <class 'tuple'>

比较吊诡的是np.where()函数的输出类型为tuple,当遇到有些函数比如np.random.choice()只接受一维的array类型或int类型,我们还需要对tuple进行转换。

如何对多维numpy.ndarray进行降维

接着上一个例子:

c = list(b)
print(c)
>>> [array([0, 3, 4])]

当我们将b从tuple转换成list后,发现它仍是一个包含array的list。

d = np.array(b)
print(d)
print(type(d))
print(np.shape(d))
>>> [[0 3 4]]
>>> <class 'numpy.ndarray'
>>>> (1, 3)

当我们将b从tuple转换成numpy.ndarray后,发现它是二维,还需继续转换成一维,这里用flatten()函数。

e = d.flatten()
print(e)
>>> [0 3 4]

免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。

合作及投稿邮箱:E-mail:editor@tusaishared.com

上一篇:python自学篇九[ 函数(三):变量作用域+ATM+5个小练习]

下一篇:linux 下python多线程递归复制文件夹

用户评价
全部评价

热门资源

  • Python 爬虫(二)...

    所谓爬虫就是模拟客户端发送网络请求,获取网络响...

  • TensorFlow从1到2...

    原文第四篇中,我们介绍了官方的入门案例MNIST,功...

  • TensorFlow从1到2...

    “回归”这个词,既是Regression算法的名称,也代表...

  • 机器学习中的熵、...

    熵 (entropy) 这一词最初来源于热力学。1948年,克...

  • TensorFlow2.0(10...

    前面的博客中我们说过,在加载数据和预处理数据时...