真是后悔太晚读这本书了,本书作者也是pandas的作者,当时我在JD搜索Pandas是没有这本书的,没想到叫这个名字。

本书可以当作工具书,把一些主要的功能都做了解释和示例展示。我感兴趣的主要分为三部分:Numpy, Pandas, 时间序列

Numpy

ndarray只能是同一类型,这时候会有个疑问,Pandas的底层是Numpy,为什么可以每列是不同的类型。我看完了之后才知道

比如:

print df

    A    B
1  2.2  ShangHai
2  2.3  BeiJing
3  1.7  ShenZhen

在Numpy里面就是:

[
 [2.2, 'ShangHai']
 [2.3, 'BeiJing']
 [1.7, 'ShenZhen']
]
dtype: object

没想到pandas利用了万能的object,然后在pandas这一层存储每列的类型像上面的A列就是float64,B列是String_

  1. ndarray的slice是view而非copy
  2. bool型索引,这是在pandas里面进行过滤应用的一个重要概念,而且可以有逻辑,注意这里的逻辑是 & | 不是and or,bool型的ndarray有any和all方法,来做一些简单的判断
  3. 花式索引可以选择任意行或列,但是选取出来的是copy
  4. np有很多元素级函数,比如对所有元素做平方,Log,exp等等操作,也可以对pandas的Series或Dataframe直接使
  5. np.where是x if c else y的数组版,有着大用处
  6. ndarray自带很多统计函数 sum, mean, std等等
  7. 当然np最nb的功能就是数组间的混合运算,这也是在pandas里面用得最多的功能
  8. np.random.permutation 可以将已有数组随机打乱,很实用

这是一段傅立叶变换的示例代码

其中 np.fft.fft 和 np.fft.ifft 是变换和逆变换,为关键函数

data_FT = ...

close_fft = np.fft.fft(np.asarray(data_FT['GS'].tolist()))
fft_df = pd.DataFrame({'fft': close_fft})
fft_df['absolute'] = fft_df['fft'].apply(lambda x: np.abs(x))
fft_df['angle'] = fft_df['fft'].apply(lambda x: np.angle(x))

plt.figure(figsize=(14, 7), dpi=100)
fft_list = np.asarray(fft_df['fft'].tolist())
for num_ in [3, 6, 9, 100]:
    fft_list_m10 = np.copy(fft_list)
    fft_list_m10[num_:-num_] = 0
    plt.plot(np.fft.ifft(fft_list_m10), label='Fourier transform with {} components'.format(num_))
plt.plot(data_FT['GS'],  label='Real')
plt.xlabel('Days')
plt.ylabel('USD')
plt.title('Figure 3: Goldman Sachs (close) stock prices & Fourier transforms')
plt.legend()
plt.show()

Pandas

主要数据类型为Series和DataFrame,pandas的容错型很强,功能要复杂很多,我这里只讲有点意思的吧,常见的我就不记录了

  1. np.abs(frame),np的元素级函数可以直接应用于DataFrame
  2. frame.apply(lambda: x:x.max()-x.min()) DataFrame可以自定义处理函数按行或列循环,applymap所有元素,这点很重要
  3. dataframe和series都有sort_index和sort_value函数进行排序,还有一个rank函数排名功能不知道什么可以用得到
  4. 对于缺失数据:dropna() fillna() isnull() notnull()
  5. value_counts() 统计出现频率
  6. 层次化索引有点像多维数据处理,还有点像分组,还是很有用,特别是金融时间序列

时间序列

这part是我最感兴趣的啦,在本书里面写了两章,时间序列和金融数据处理

  1. datetime 和 timedelta ,还有strftime 这个是python内置的,还有个dateutil.parser第三方库,很方便,但是有容错性太好导致异常数据的坑
  2. 判断某时间序列是否有重复日期的数据:df.index.is_unique True不重复,False有重复,用groupby(level=0).count(),再排序可以找出重复的数据
  3. pd.data_range()是生成日期时间序列索引的重要函数,而且功能强大,可以生成各成频率的数据
  4. 重采样resample()比如把tick或者min合并成5min的数据,竟然专门有一个方法resample('5min', how='ohlc'),做Open high low close的合并运算,如果需要自定义函数resample(...).apply(custom_resampler)
  5. rolling().apply()也可以自定义函数,窗口移动是时间序列里面非常重要的函数,还有shift()平移也是,但是shift()会丢失某些值,还有一个df.pct_change()可以直接算出简单收益率
  6. 在做板块分析时,可以用groupby,具体参考p356
  7. 选取某个时间点的数据at_time(), 还有asof()可以找到离某时间点最近的时间数据
  8. cumprod()计算累计收益率
  9. dataframe 可以直接用 apply 做数据处理

更多功能

风险因子暴露

四分位数

信号前沿分析,期货合约转仓,相关系数和线性回归

count    NA 值的数量
describe    针对 Series  DF 的列计算汇总统计
min , max   最小值和最大值
argmin , argmax 最小值和最大值的索引位置(整数)
idxmin , idxmax 最小值和最大值的索引值
quantile    样本分位数(0  1
sum 求和
mean    均值
median  中位数
mad 根据均值计算平均绝对离差
var 方差
std 标准差
skew    样本值的偏度(三阶矩)
kurt    样本值的峰度(四阶矩)
cumsum  样本值的累计和
cummin , cummax 样本值的累计最大值和累计最小值
cumprod 样本值的累计积
diff    计算一阶差分(对时间序列很有用)
pct_change  计算百分数变化

Comments

comments powered by Disqus