Python股票数据处理的一些代码细节
原标题:Python股票数据处理的一些代码细节
原文来自:CSDN 原文链接:https://blog.csdn.net/weixin_44724090/article/details/103776808
Pandas和Numpy各有所长。
在处理股票数据的基础阶段,Pandas能够清晰地展示股票代码、交易日期、价格等信息,且对于信息的分类、归集、整理有很多针对性强的功能函数,非常便捷。
在处理股票数据的高级阶段,尤其在涉及机器学习领域,Numpy用处更多。首先因为Keras等函数库要求的输入类型多为numpy.ndarray,更深层的原因是Numpy在多维数据储存和处理上更具优势,而且由于Numpy的数据类型仅为数字,处理速度比Pandas快很多。
不同于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]
在获取股票数据,尤其是从一些金融数据库获取数据时,数据的原始索引方式往往不符合我们的需求,这时我们需要对数据做一些变换处理。
比如下列张原始的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索引的特性创建一个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]
我没有找过直接删除指定值的方法,而是先用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进行转换。
接着上一个例子:
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 爬虫(二)...
所谓爬虫就是模拟客户端发送网络请求,获取网络响...
TensorFlow从1到2...
原文第四篇中,我们介绍了官方的入门案例MNIST,功...
TensorFlow从1到2...
“回归”这个词,既是Regression算法的名称,也代表...
机器学习中的熵、...
熵 (entropy) 这一词最初来源于热力学。1948年,克...
TensorFlow2.0(10...
前面的博客中我们说过,在加载数据和预处理数据时...
智能在线
400-630-6780
聆听.建议反馈
E-mail: support@tusaishared.com