Numpy是Python很多科学计算与工程库的基础库,也是量化数据分析领域中的基础数组,学会使用 Numpy是量化分析中关键的一步。
Numpy可以理解为它的输出是一个非常大且连续的并由同类型数据组成的内存区域,所以你可以构造一个比普通列表大得多的数组,并且灵活高效地对数组中所有的元素进行并行化操作。
import numpy as np
np.array(np_list) # 将列表转化为array数组
np.zeros(100) # 100个0
np.eye(3) # eye得到对角线全为1的单位矩阵
np.linspace(0, 1, 10) # 0到1之间等间隔生成10个元素
np.arange(0,10,1) # 从0到10(不包括)步长为1,生成数组
arr = np.copy() # 真正的复制
np.zeros((3, 2)) # shape:3行2列 全是0
np.ones((3, 2)) # shape: 3行2列 全是1
np.empty((2, 3, 3)) # shape:x=2, y=3, z=3 值随机
np.zeros_like(np_list) # 初始化序列与np_list一样的shape,值全为0
np.ones_like(np_list) # 初始化序列与np_list一样的shape,值全为1
studenttype = np.dtype([('姓名', 'str', 5), ('学号', 'int8'), ('绩点', 'float')])
class1 = np.array([('小红', '20190101', '3.7'), ('小金', '20190102', '3.3'), ('小蓝', '20190201', '4.0')])
class1
NumPy数组和普通列表的操作方式也是不同的,NumPy通过广播机制作用于每一个内部元素,是一种并行化执行的思想,普通list则作用于整体。示例如下:
import numpy as np
normal_list=[[1,2,3],[4,5,6],[7,8,9]] #普通数组,list
print(normal_list)
print(normal_list*2)
np_list=np.array(normal_list) #numpy数组,array
print(np_list)
print(np_list*2)
结果如下:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [1, 2, 3], [4, 5, 6], [7, 8, 9]] #普通的列表list把*2操作认为是整体性操作
[[1 2 3]
[4 5 6]
[7 8 9]]
[[ 2 4 6]
[ 8 10 12]
[14 16 18]] #注意 * 2的操作被运行在每一个元素上
先随机生成200只股票504个交易日服从正态分布的涨跌幅数据:
stock_cnt = 200 # 200支股票
view_days = 504 # 504个交易日
stock_day_change = np.random.standard_normal((stock_cnt, view_days)) # 生成服从正态分布:均值期望=0,标准差=1的序列
stock_day_change[0:2, 0:5] # 0:2第一,第二支股票,0:5头五个交易日的涨跌幅数据
stock_day_change[-2:, -5:] # -2:倒数一,第二支股票,-5:最后五个交易日的涨跌幅数据
stock_day_change[0:2, 0:5].astype(int) #将数据转化成整形
np.around(stock_day_change[0:2, 0:5], 2) #保留两位小数
#如果数据缺失(nan),将缺失数据改为0
tmp_test=np.array([1,2,3,np.nan,4,5,np.nan,6,7,8,np.nan])
tmp_test = np.nan_to_num(tmp_test) #用0来填充na
print(tmp_test)
# 找出上述切片内涨幅超过0.5的股票时段, 通过输出结果你可以看到返回的是boolean的数组
mask = stock_day_change[0:2, 0:5] > 0.5
print(mask)
tmp_test = stock_day_change[0:2, 0:5].copy()
# 使用上述的mask数组筛选出符合条件的数组, 即中筛选mask中对应index值为True的
print(tmp_test[mask])
tmp_test[tmp_test < 0.5] = 0
print(tmp_test) #显示出涨幅超过0.5的股票时段,其余变为0
print(np.where(tmp_test > 0.5, 1, 0))#第一个参数中条件表达式若成立走第二个参数,否则走第三个参数
print(tmp_test[(tmp_test > 1) | (tmp_test < -1)]) #多重选择
# 本例实际判断stock_day_change[0:2, 0:5]中是否全是上涨的
np.all(stock_day_change[0:2, 0:5] > 0)
# 本例实际判断stock_day_change[0:2, 0:5]中是至少有一个是上涨的
np.any(stock_day_change[0:2, 0:5] > 0)
np.save("name.npy", stock_day_change)
stock_day_change = np.load('name.npy')
Pandas 是基于NumPy 的一种工具,是为解决数据分析任务而创建的。
Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
pandas大致可以分为三种数据结构:一维的Series、二维的DataFrame、三维的Panel
import pandas as pd
# 创建
pd.Series({1, 2, 3])
# 利用字典创建,等同于pd.Series([1,2,3], index=['a', 'b', 'c'])
d1={'a':1, 'b':2, 'c':3}
s = pd.Series(d1)
# 索引
s[0]或者1['a']
s['a':'b']
# 转化
s.to_string() # 转化为字符串
s.to_dict() # 转化为字典
s.tolist() # 转化为列表
s.to_frame() # 转化为DataFrame
s.to_csv() # 存储为csv文件
# 字典创建
d2 = {'open':[3,4,5], 'high':[4,5,6], 'low':[2,3,4], 'close':[3,4,5]}
df = pd.DataFrame(d2)
# 列索引
df.open或者df['open']
df.loc['行名1':'行名2','列名1':'列名2']或者df.iloc[1:3,2:5]
df.T
df.values
df.to_dict()
df.to_latex
df['open']>=4
df.sum(axis=0)
df.mean()
df.max()
df.min()
import numpy as np
import pandas as pd
stock_cnt = 200 # 200支股票
view_days = 504 # 504个交易日
stock_day_change = np.random.standard_normal((stock_cnt, view_days))
# 从2017-1-1向上时间递进,单位freq='1d'即1天
days = pd.date_range('2017-1-1',
periods=stock_day_change.shape[1], freq='1d')
# 股票1 -> 股票stock_day_change.shape[0]
stock_symbols = ['股票 ' + str(x+1) for x in
range(stock_day_change.shape[0])]
# 分别设置index和columns
df = pd.DataFrame(stock_day_change, index=stock_symbols, columns=days)
df1=df['2017-1-1']
print(df1)
df_stock0_5 = df2.cumsum().resample('5D').ohlc()
print(df_stock0_5.head())