版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xufive/article/details/79147882
1. 前言
虽然很早就接触过pandas模块,却因为深度依赖numpy的原因,从没有认真对待它。今天无意中发现,pandas最初是作为金融数据分析工具而开发出来,有些概念借鉴了R语言。我距离金融圈非常遥远,难怪以前一直找不到使用它的必要性。现在我知道,pandas为时间序列分析提供了很好的支持,这一点也许可以给我的工作提供方便。
模块学习的第一步,自然是安装。必须要感谢pip,自从py2.7.9内置pip之后,世界变得如此美好!
pip install pandas
导入,测试一下模块是否可用。
import pandas as pd
2. 数据结构
网上检索了一下(还是没有认真去读pandas的document),pandas大致有以下几个核心的数据结构:(1) Series
Series可以理解为一维数组,数组元素可以是不同的类型,甚至是对象——类似python的list对象。不过,Series可以自行定义索引,从这个角度看,又类似python的dict对象。
a = pd.Series()
b = pd.Series([2,5,8])
c = pd.Series([3,'x',b])
d = pd.Series({'name':'xufive','age':50})
Series的方法令人眼花缭乱,简单尝试了一下add,原以为是插入新的元素,结果却是对每一个元素做add,这和numpy.array的广播函数是完全一样的。
>>> b = pd.Series([2,5,8])
>>> b
0 2
1 5
2 8
dtype: int64
>>> b = b.add(8)
>>> b
0 10
1 13
2 16
dtype: int64
>>> b = b.mod(3)
>>> b
0 1
1 1
2 1
dtype: int64阿斯顿
Series有index, values, name, index.name等属性,例如:
>>> b = pd.Series([2,5,8])
>>> b.values
array([2, 5, 8], dtype=int64)
>>> b.index
RangeIndex(start=0, stop=3, step=1)
(2) DataFrame
DataFrame的概念来自于R语言,可视作为Series的容器(container)。DataFrame是表格型数据,既有行索引又有列索引,每列数据可以为不同类型数据(数值、字符串、布尔型值)。
>>> import numpy as np
>>> import pandas as pd
>>> pd.DataFrame({'a':[1,2],'b':[2,3],'c':[3,4],'d':[4,5]})
a b c d
0 1 2 3 4
1 2 3 4 5
>>> pd.DataFrame(np.array([[1,2,3,4],[3,4,5,6]]),index=['one','two'])
0 1 2 3
one 1 2 3 4
two 3 4 5 6
>>> pd.DataFrame([pd.Series([11,12,13,14]),pd.Series([21,22,23,24])])
0 1 2 3
0 11 12 13 14
1 21 22 23 24
DataFrame对象同样有一堆方法来实现分割、查找、替换、转换等功能。在我学习这些细节的时候,深深加剧了我对于R语言的恐惧。为了不给各位看官留下心理阴影,这里就不详细描述了。如有兴趣深入研究,请参考《pandas数据结构》。
3. 时间序列
前言中提到, pandas为时间序列分析提供了很好的支持,那么,我们如何构建一个时间序列的数据结构呢?>>> index = pd.date_range('1/10/2018', periods=5)
>>> pd.DataFrame(np.random.randn(5, 3), index=index, columns=list('ABC'))
A B C
2018-01-10 -1.631258 -0.568379 0.319282
2018-01-11 -0.708094 1.107151 1.364287
2018-01-12 0.649978 -0.494478 1.076287
2018-01-13 0.079650 -1.634735 0.794655
2018-01-14 0.330134 0.890559 0.735603