聚沙成塔--数据分析(一)(pandas的Series使用)

版权声明:本文为作者原创文章,可以随意转载,但必须在明确位置标明出处!!!

从今天开始将进入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的介绍就到这里,希望你能跟我一起去学习,去进步

欢迎关注我:「爱做饭的老谢」,老谢一直在努力…

    原文作者:爱做饭的老谢
    原文地址: https://www.jianshu.com/p/8d8c9d44d21a
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞