版权声明:本文为作者原创文章,可以随意转载,但必须在明确位置标明出处!!!
从今天开始将进入Python数据分析的学习,最终的目标是向机器学习方向靠拢,用到的数据将会是金融股票数据,也顺带学习学习金融知识,我想不管你是那种类型的人,个人觉得都有必要学习和了解金融行业。
这两年人工智能、机器学习十分火爆,国内在这方面的人才缺口也比较大,不管是谷歌的AlphaGo还是,无人驾驶、百度机器人、阿里达摩院的成立,种种迹象都标明人工智能在未来5到10年将会呈现井喷式的发展,他将会用到医疗、工业、农业、交通等等行业,所以我们有必要去学习它、了解它、使用它,才能在未来占有一席之地。冰冻三尺非一日之寒,学习也一样,人工智能和机器学习的起点都比较高,我们只能一点一点的去理解它、靠近它,就像打怪升级一样、需要不听的学习技能、买装备、升级装备、最终才能去打BOSS。
数据分析是我们必须要掌握的技能、Python中的数据分析用到的是pandas库,该库的核心是numpy, numpy是一个用Python实现的科学计算包,它包含一个强大的N维数组对象Array、成熟的函数库、实用的线性代数、傅里叶变换和随机数生成函数。下面就开始正式进入pandas的学习。
pandas的数据结构
pandas有三种数据结构
- Series:一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近,其区别是:List中的元素可以是不同的数据类型,而Array和Series中则只允许存储相同的数据类型,这样可以更有效的使用内存,提高运算效率。
- DataFrame: 二维的表格型数据结构。多个Series结构就组成了DataFrame数据结构,这里需要特别注意的是DataFrame是按照列来存储的。
- Panel: 三维的数组,可以理解为DataFrame的容器。
Series的一些操作
- Series定义
Series(data, index=index),data参数可以是整形、字符串、dict、ndarray、常量值。index是索引值,如果数据类型是ndarray,index的长度需要和data的长度一致,如果index没有指定,那么索引将会从[0,....., len(data) -1]递增。- ndarray数据类型
import pandas as pd
import numpy as np
s = pd.Series(np.random.randn(5), index=['a','b','c','d','e'])
print(s)
s = pd.Series(np.random.randn(5))
print(s)
OUT:
a -0.620323
b -0.189133
c 1.677690
d -1.480348
e -0.539061
dtype: float64
0 1.748631
1 -0.291825
2 1.002143
3 0.558046
4 1.119569
dtype: float64
- 字典(dict)类型数据
因为字典是key-value结构存储的,key相当于字典的索引了,那么在创建Series的时候若是不指定index参数,Series就默认使用字典的key来作为所以,若是指定了则在字典中去关联索引,如下:
import pandas as pd
import numpy as np
data = {'a':10, 'b':20, 'c':30}
s = pd.Series(data)
print(s)
s = pd.Series(data, index=['b', 'c', 'a', 'd'])
print(s)
OUT:
a 10
b 20
c 30
dtype: int64
b 20.0
c 30.0
a 10.0
d NaN
dtype: float64
- 常量作为输入数据
如果是常量作为输入数据,常量值将会被重复index长度个数
import pandas as pd
import numpy as np
s = pd.Series(5, index=['b', 'c', 'a', 'd'])
print(s)
s = pd.Series(5)
print(s)
OUT:
b 5
c 5
a 5
d 5
dtype: int64
0 5
dtype: int64
切片、索引、dict操作
Series既然是一维数组类型的数据结构,那么它支持想数组那样去操作它。通过数组下标索引、切片都可以去操作他,且它的data可以是dict类型的,那么它肯定也就支持字典的索引方式。
import pandas as pd
import numpy as np
s = pd.Series(np.random.randn(5), index=['a','b','c','d','e'])
print(s)
# 下标索引
print('下标索引方式s[0] = : %s' % s[0])
# 字典访问方式
print('字典访问方式s[b] = :%s' % s['b'])
# 切片操作
print('切片操作s[2:]\n:%s' % s[2:])
print('a' in s)
print('k' in s)
OUT:
a -0.799676
b -1.581704
c -1.240885
d 0.623757
e -0.234417
dtype: float64
下标索引方式s[0] = : -0.799676067487
字典访问方式s[b] = :-1.58170351838
切片操作s[2:]:
c -1.240885
d 0.623757
e -0.234417
True
False
Series的算术操作
有了numpy这个科学计算包后,对数组中的算术操作我们不需要去遍历每个元素然后对它进行计数。
- Series加法运算:
import pandas as pd
import numpy as np
s1 = pd.Series(np.random.randn(3), index=['a','b','c'])
s2 = pd.Series(np.random.randn(3), index=['a','b','c'])
s3 = pd.Series(np.random.randn(2), index=['a','b'])
s4 = pd.Series(np.random.randn(2), index=['e','f'])
print(s1)
print(s2)
# 对应索引的值相加
print('索引值相同的登结果:\n%s\n' % (s1 + s2))
print(s1)
print(s3)
# 对应索引的值相加
print('索引值部分不相同的登结果:\n%s\n' % (s1 + s3))
print(s1)
print(s4)
# 对应索引的值相加
print('索引值都不相同的登结果:\n%s\n' % (s1 + s4))
OUT:
a 0.271685
b 0.547691
c -0.143253
dtype: float64
a -1.603913
b -0.464923
c 0.471518
dtype: float64
索引值相同的登结果:
a -1.332227
b 0.082768
c 0.328266
dtype: float64
a 0.271685
b 0.547691
c -0.143253
dtype: float64
a -0.690966
b 1.131122
dtype: float64
索引值部分不相同的登结果:
a -0.419281
b 1.678812
c NaN
dtype: float64
a 0.271685
b 0.547691
c -0.143253
dtype: float64
e -1.898507
f 0.153425
dtype: float64
索引值都不相同的登结果:
a NaN
b NaN
c NaN
e NaN
f NaN
dtype: float64
- Series乘法运算:
import pandas as pd
import numpy as np
s1 = pd.Series(np.random.randn(3), index=['a','b','c'])
s2 = pd.Series(np.random.randn(3), index=['a','b','c'])
print(s1)
print(s2)
print('s1 * s2 = \n%s' % (s1 * s2))
print('s1 * 10 = \n%s' % (s1 * 10))
OUT:
a -0.149056
b 0.637856
c -1.357440
dtype: float64
a -0.443937
b -0.695017
c 2.217806
dtype: float64
s1 * s2 =
a 0.066171
b -0.443321
c -3.010538
dtype: float64
s1 * 10 =
a -1.490556
b 6.378556
c -13.574397
dtype: float64
算术操作都是按照索引去操作的,如果一个两个Series的对所不同,那么他们的结果将是一个union操作,他们的非交集将会用缺省值NaN代替。
okay, Series的介绍就到这里,希望你能跟我一起去学习,去进步