真是后悔太晚读这本书了,本书作者也是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_
- ndarray的slice是view而非copy
- bool型索引,这是在pandas里面进行过滤应用的一个重要概念,而且可以有逻辑,注意这里的逻辑是 & | 不是and or,bool型的ndarray有any和all方法,来做一些简单的判断
- 花式索引可以选择任意行或列,但是选取出来的是copy
- np有很多元素级函数,比如对所有元素做平方,Log,exp等等操作,也可以对pandas的Series或Dataframe直接使
- np.where是x if c else y的数组版,有着大用处
- ndarray自带很多统计函数 sum, mean, std等等
- 当然np最nb的功能就是数组间的混合运算,这也是在pandas里面用得最多的功能
- 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的容错型很强,功能要复杂很多,我这里只讲有点意思的吧,常见的我就不记录了
- np.abs(frame),np的元素级函数可以直接应用于DataFrame
- frame.apply(lambda: x:x.max()-x.min()) DataFrame可以自定义处理函数按行或列循环,applymap所有元素,这点很重要
- dataframe和series都有sort_index和sort_value函数进行排序,还有一个rank函数排名功能不知道什么可以用得到
- 对于缺失数据:dropna() fillna() isnull() notnull()
- value_counts() 统计出现频率
- 层次化索引有点像多维数据处理,还有点像分组,还是很有用,特别是金融时间序列
时间序列
这part是我最感兴趣的啦,在本书里面写了两章,时间序列和金融数据处理
- datetime 和 timedelta ,还有strftime 这个是python内置的,还有个dateutil.parser第三方库,很方便,但是有容错性太好导致异常数据的坑
- 判断某时间序列是否有重复日期的数据:df.index.is_unique True不重复,False有重复,用groupby(level=0).count(),再排序可以找出重复的数据
- pd.data_range()是生成日期时间序列索引的重要函数,而且功能强大,可以生成各成频率的数据
- 重采样resample()比如把tick或者min合并成5min的数据,竟然专门有一个方法resample('5min', how='ohlc'),做Open high low close的合并运算,如果需要自定义函数resample(...).apply(custom_resampler)
- rolling().apply()也可以自定义函数,窗口移动是时间序列里面非常重要的函数,还有shift()平移也是,但是shift()会丢失某些值,还有一个df.pct_change()可以直接算出简单收益率
- 在做板块分析时,可以用groupby,具体参考p356
- 选取某个时间点的数据at_time(), 还有asof()可以找到离某时间点最近的时间数据
- cumprod()计算累计收益率
- 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