import pandas as pd
import numpy as np
'''
Pandas的数据结构:
Series
Series是带标签的一维数组,可存储整数、浮点数、字符串、Python 对象等类型的数据。轴标签统称为索引
调用pd.series函数即可创建Series
例如:s = pd.Series(data, index=index)
其中data支持Python字典,多维数组和标量值,index是轴标签列表
当data是多维数组时,index长度必须与data长度一致。没有指定index参数时,默认为数值型索引,即[0, len(data)-1]
'''
# np.random.randn(d0,d1,d2……dn)
# 1)当函数括号内没有参数时,则返回一个浮点数;
# 2)当函数括号内有一个参数时,则返回秩为1的数组,不能表示向量和矩阵;
# 3)当函数括号内有两个及以上参数时,则返回对应维度的数组,能表示向量或矩阵;
# 4)np.random.standard_normal()函数与np.random.randn()类似,但是np.random.standard_normal()的输入参数为元组(tuple).
# 5)np.random.randn()的输入通常为整数,但是如果为浮点数,则会自动直接截断转换为整数。
# numpy.random.rand(d0,d1,…,dn)
# rand函数根据给定维度生成[0,1)之间的数据,包含0,不包含1
# dn表格每个维度
# 返回值为指定维度的array
s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])
# print(s)
# print(s.index)
s = pd.Series(np.random.randn(5))
# print(s)
# Pandas 的索引值可以重复。
'''
当data为字典时,当未设置index参数时,Series按字典的插入顺序排序索引
'''
# Series 可以用字典实例化
dic = {'a': 2, 'b': 1, 'c': 3, 'd': 5, 'e': 9}
s = pd.Series(dic)
# print(s)
# Pandas用NaN表示缺失数据
# print(pd.Series(dic, index=['b', 'a', 'c', 'd']))
'''
当data为标量值时,必须提供索引,Series按索引长度重复该标量值。
'''
# 什么是标量值?--------------------标量值代表一个数据单元或一个简单值
# print(pd.Series(5., ['b', 'a', 'c', 'd']))
'''
Series类似多维数组
Series操作与ndarray类似,支持大多数NumPy函数,还支持索引切片
'''
# print(s[0])
# print(s[:3])
# median()函数代表中位数
# print(s[s > s.median()])
'''
Series.array一般是扩展数组。简单说,扩展数组是把N个numpy.ndarray包在一起的打包器。
Pandas知道怎么把扩展数组存储到Series或DataFrame的列里。
'''
# Series.array用于提取Series数组
# 执行不用索引的操作时,如禁用自动对齐,访问数组非常有用。
# print(s.array)
# Series 只是类似于多维数组,提取真正的多维数组,要用Series.to_numpy()
# print(s.to_numpy())
'''
Series 类似固定大小的字典,可以用索引标签提取值或设置值。
'''
# print(s['a'])
# s['b'] = 12
# print(s)
# print('c' in s)
# print('e' in s)
# 使用get()方法可以提取Series里没有的标签,返回值为None,或可以指定返回值
# print(s.get('e'))
# np.nan为not a number
# print(s.get('e', np.nan))
'''
矢量操作与对齐 Series 标签
Series 和 NumPy 数组一样,都不用循环每个值,而且 Series 支持大多数 NumPy 多维数组的方法。
'''
# print(s + s)
# print(s * 3)
# Series 和多维数组的主要区别在于, Series 之间的操作会自动基于标签对齐数据。因此,不用顾及执行计算操作的 Series 是否有相同的标签。
# print(s[1:] + s[:-1])
# Series还支持name属性
# 一般情况下,Series会自动分配name,特别是提取一维 DataFrame 切片时
s = pd.Series(np.random.randn(5), name='something')
# print(s)
# print(s.name)
# 也可以使用rename方法重命名
s2 = s.rename('lsw')
print(s2.name)