一:Pandas了解
(1)什么是Pandas
Pandas是2008年WesMcKinney开发出的库,是一个专门用于数据挖掘的开源Python库,它以Numpy为基础,借力Numpy模块在计算方面性能高的优势,又基于Matplotlib,可以简便的画图,而且还拥有自己独特的数据结构
- Pandas=Panel+data+analysis
(2)Pandas优势
在学习完Numpy和Matplotlib后还要学习Pandas的原因在于:Pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需要的工具,也提供了大量使我们能够快速处理数据的函数和方法。具体来说:
-
Pandas 可以从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据。 -
Pandas 可以对各种数据进行运算操作,比如归并、再成形、选择,还有数据清洗和数据加工特征。 -
Pandas 广泛应用在学术、金融、统计学等各个数据分析领域
(3)Pandas安装
安装好之后,可以通过下面的语句导入Pandas库以及查看其是否能够正常运行
import pandas as pd
mydataset = {
'sites': ["Google", "Runoob", "Wiki"],
'number': [1, 2, 3]
}
myvar = pd.DataFrame(mydataset)
print(myvar)
(4)Pandas核心数据结构
在Pandas中有三类数据结构
Series :是一种类似于一维数组的对象,它由一组数据(各种Numpy数据类型)以及一组与之相关的数据标签(即索引)组成;它可以保存不同种类的数据类型DataFrame :是一个表格型的数据结构(Excel、SQL等),它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)
二:DataFrame类型
Numpy注重运算,所以对于数据意义的表达没有那么清楚,比如下面用Numpy生成了一个符号正态分布的10支股票5天的涨幅情况
- 这样的数据表现形式让人有点难受,因为完全不知道它在表达什么
stock_change = np.random.normal(0, 1, (10, 5))
print(stock_change)
[[ 0.22129238 1.72192263 0.49808165 -0.70501369 -0.57315298]
[-0.05685967 -1.59493883 0.20770355 2.03934052 -0.91647225]
[-0.64659703 -1.7586049 -0.53091496 -0.95453855 0.84446516]
[ 0.02877987 1.53110344 -0.90623823 1.41938924 -1.24248129]
[-0.36990152 -0.17153907 0.24179436 0.82450977 1.1865927 ]
[-0.14524005 -0.57297533 -0.08680693 0.07105316 -0.12050658]
[ 0.50399736 1.56385492 -0.38175291 0.52144963 0.51322901]
[ 0.71534998 -0.61644881 0.15437358 0.00324533 -0.830954 ]
[-0.65036464 -1.71639338 -1.18670887 0.34092581 -0.8870423 ]
[-0.89061683 -0.93671895 -0.19911303 0.49350255 2.02240886]]
因此,我们的DataFrame就是为了让数据更有意义的显示。这里可以直接调用pd.DataFrame() ,然后将numpy数组传入进去
stock_change = np.random.normal(0, 1, (10, 5))
a = pd.DataFrame(stock_change)
print(a)
你会发现,现在显示形式比之前就舒服多了
(1)DataFrame结构
DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)
因此,上面的那个例子中行列索引表达的意思为
(2)DataFrame构造方法
DataFrame 构造格式下:
pandas.DataFrame( data, index, columns, dtype, copy)
-
data :一组数据(ndarray 、series , map , lists , dict 等类型)。 -
index :索引值,或者可以称为行标签。 -
columns :列标签,默认为 RangeIndex (0, 1, 2, …, n) 。 -
dtype :数据类型。 -
copy :拷贝数据,默认为 False
举例
a = pd.DataFrame(np.random.randn(4, 5))
print(a)
从以上输出结果可以知道, DataFrame 数据类型一个表格,包含 rows (行) 和 columns (列)
(3)DataFrame索引
上例中默认显示的索引并不是很合适,没有起到见名知意的作用。我的目的是行索引显示股票支数,列索引显示天数,这里先用列表生成式生成行索引
stock_index = ["股票{}".format(i) for i in range(10)]
然后在刚才的pd.DataFrame() 中传入index=stock_index ,即行索引
stock_change = np.random.normal(0, 1, (10, 5))
stock_index = ["股票{}".format(i) for i in range(10)]
a = pd.DataFrame(stock_change, index=stock_index)
print(a)
对于列索引,我们直接调用Pandas中现成的函数
- 关于date_range()更为详细的用法可以参照这篇文章点击跳转
date_index = pd.date_range(start='20220510', periods=5, freq='B')
然后在刚才的pd.DataFrame() 中传入columns=date_index ,即列索引
stock_change = np.random.normal(0, 1, (10, 5))
stock_index = ["股票{}".format(i) for i in range(10)]
date_index = pd.date_range(start='20220510', periods=5, freq='B')
a = pd.DataFrame(stock_change, index=stock_index, columns=date_index)
print(a)
还可以通过字典传入
a = pd.DataFrame(
[
{'a': 1, 'b': 2},
{'a': 5, 'b': 10, 'c': 20}
]
)
print(a)
(4)DateFrame常用属性和方法
A:属性
DateFrame说穿了其实就是Numpy二维数组加了行列索引,所以Numpy数组具有的属性,DateFrame基本也有,常用属性有
stock_change = np.random.normal(0, 1, (10, 5))
stock_index = ["股票{}".format(i) for i in range(10)]
date_index = pd.date_range(start='20220510', periods=5, freq='B')
a = pd.DataFrame(stock_change, index=stock_index, columns=date_index)
print(a.shape)
print("-"*20)
print(a.index)
print("-"*20)
print(a.columns)
print("-"*20)
print(type(a.values))
print("-"*20)
B:方法
经常使用到的方法是head() 和tail() ,因为很多时候我们要频繁查看表的头部和尾部信息
stock_change = np.random.normal(0, 1, (10, 5))
stock_index = ["股票{}".format(i) for i in range(10)]
date_index = pd.date_range(start='20220510', periods=5, freq='B')
a = pd.DataFrame(stock_change, index=stock_index, columns=date_index)
print(a.head(3))
print("-"*20)
print(a.tail(2))
四:Series类型
Pandas Series 类似表格中的一个列(column ),类似于一维数组,可以保存任何数据类型;Series 由索引(index )和列组成,函数如下
pandas.Series( data, index, dtype, name, copy)
举例
a = pd.Series([1, 3, 'str', np.nan, 7])
print(a)
其中的索引index 是可以自己设定的
a = pd.Series([1, 3, 'str', np.nan, 7], index=['A', 'B', 'C', 'D', 'E'])
print(a)
print("-"*20)
print(a['C'])
还有一种写法我比较喜欢
a = pd.Series([1, 3, 'str', np.nan, 7])
print(a)
print("-"*20)
a.index = list('ABCDE')
print(a)
如果执行pandas.index ,就会显示其索引情况
a = pd.Series([1, 3, 'str', np.nan, 7], index=['A', 'B', 'C', 'D', 'E'])
print(a)
print("-"*20)
print(a.index)
如果执行pandas.values() ,就会显示其值
a = pd.Series([1, 3, 'str', np.nan, 7], index=['A', 'B', 'C', 'D', 'E'])
print(a)
print("-"*20)
print(a.values)
它的索引和切片也是一个道理
a = pd.Series([1, 3, 'str', np.nan, 7], index=['A', 'B', 'C', 'D', 'E'])
print(a)
print("-"*20)
print(a['C'])
print(a['A':'D'])
可以使用pandas.index.name 来为索引列起一个名字
a = pd.Series([1, 3, 'str', np.nan, 7], index=['A', 'B', 'C', 'D', 'E'])
print(a)
print("-"*20)
a.index.name = '索引'
print(a)
|