首先看到 pandas 的这个词,大家会想到熊猫,其实 pandas 是一个专业处理数据的 python 包,具有非常强大的功能。在我们日常生活中,最经常接触到场景就是处理表格,有时候表格可能会很大,用 excel 打开会很卡,很多处理函数用起来也不是那么方便。这时候我们可以试试 python 语言中的 pandas,对于 excel 中可以实现的功能,pandas 都可以涵盖。
下面说说我们在使用 pandas 过程中,最经常用到的 6 个函数,你掌握了这些函数,日常的数据分析就不用怕了。
下面以最新的基金净值数据为例,来介绍 pandas 是如何来处理数据的。数据来源于使用 akshare 在线爬取最新的数据,日常处理本地的数据会使用 pandas 的 read_xlsx 函数读取本地数据进行处理,数据会以 DataFrame 的类型存储。这里的爬取到的基金数据,在 python 中也是直接以 DataFrame 的类型存储,故后续讨论的函数方法都适用。
>>> import akshare as ak
>>> import pandas as pd
#公募基金基础信息
>>> fund_name_em_df = ak.fund_name_em()
#公募基金的净值信息
>>> fund_open_fund_daily_em_df = ak.fund_open_fund_daily_em()
#查看公募基金基础信息表的基本信息
>>> fund_name_em_df.info()
#输出如下:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 16259 entries, 0 to 16258
Data columns (total 5 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 基金代码 16259 non-null object
1 拼音缩写 16259 non-null object
2 基金简称 16259 non-null object
3 基金类型 16259 non-null object
4 拼音全称 16259 non-null object
dtypes: object(5)
memory usage: 635.2+ KB
#数据的基本信息输出如下,数据共16259行
#查看数据的前6行
>>> fund_name_em_df.head()
#输出如下
基金代码 拼音缩写 基金简称 基金类型 拼音全称
0 000001 HXCZHH 华夏成长混合 混合型-偏股 HUAXIACHENGZHANGHUNHE
1 000002 HXCZHH 华夏成长混合(后端) 混合型-偏股 HUAXIACHENGZHANGHUNHE
2 000003 ZHKZZZQA 中海可转债债券A 债券型-可转债 ZHONGHAIKEZHUANZHAIZHAIQUANA
3 000004 ZHKZZZQC 中海可转债债券C 债券型-可转债 ZHONGHAIKEZHUANZHAIZHAIQUANC
4 000005 JSZQXYDQZQ 嘉实增强信用定期债券 债券型-长债 JIASHIZENGQIANGXINYONGDINGQIZHAIQUAN
#查看公募基金净值信息表的基本信息
>>> fund_open_fund_daily_em_df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 14298 entries, 0 to 14297
Data columns (total 11 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 基金代码 14298 non-null object
1 基金简称 14298 non-null object
2 2022-05-27-单位净值 14298 non-null object
3 2022-05-27-累计净值 14298 non-null object
4 2022-05-26-单位净值 14298 non-null object
5 2022-05-26-累计净值 14298 non-null object
6 日增长值 14298 non-null object
7 日增长率 14298 non-null object
8 申购状态 14298 non-null object
9 赎回状态 14298 non-null object
10 手续费 14298 non-null object
dtypes: object(11)
memory usage: 1.2+ MB
>>> fund_open_fund_daily_em_df.head()
基金代码 基金简称 2022-05-27-单位净值 ... 申购状态 赎回状态 手续费
0 013171 华夏恒生互联网科技业ETF联接(QDII)A 0.7271 ... 限大额 开放赎回 0.12%
1 013172 华夏恒生互联网科技业ETF联接(QDII)C 0.7255 ... 限大额 开放赎回 0.00%
2 012804 广发恒生科技指数(QDII)A 0.7162 ... 开放申购 开放赎回 0.12%
3 012805 广发恒生科技指数(QDII)C 0.7152 ... 开放申购 开放赎回 0.00%
4 012348 天弘恒生科技指数(QDII)A 0.5925 ... 开放申购 开放赎回 0.10%
##在进行处理之前,需要将上述数据zhong
复制代码
首先介绍一下 apply
看看这个词的字面意思是应用,在 pandas 中 apply 的使用场景在,我们需要对一列,或者多列进行操作。使用 apply 与遍历每一行去处理的好处是可以提高运行速度。
#我们需要提取基金类型中-前面的类型
>>> fund_name_em_df['fundtype'] = fund_name_em_df['基金类型'].apply(lambda x: x.split('-')[0])
0 混合型
1 混合型
2 债券型
3 债券型
4 债券型
...
16254 债券型
16255 债券型
16256 债券型
16257 债券型
16258 债券型
Name: 基金类型, Length: 16259, dtype: object
#apply不止可以操纵一列,也可以操纵多列,这里一定要注意,在操纵多列的时候,后面一定要加上 axis=1
>>> fund_name_em_df.apply(lambda x: x['基金类型'].split('-')[0] + x['基金简称'],axis = 1)
0 混合型华夏成长混合
1 混合型华夏成长混合(后端)
2 债券型中海可转债债券A
3 债券型中海可转债债券C
4 债券型嘉实增强信用定期债券
...
16253 债券型招商资管增益添彩一个月持有期中短债债券C
16254 债券型兴证资管金麒麟悦享添利30天滚动持有债券A
16255 债券型兴证资管金麒麟悦享添利30天滚动持有债券B
16256 债券型兴证资管金麒麟悦享添利30天滚动持有债券C
16257 债券型太平洋六个月滚动持有债
Length: 16258, dtype: object
复制代码
下面介绍一下 merge
看看这个词的字面意识是融合,主要应用在讲两张表合并成一张表,这与我们在 excel 中经常使用的 vlookup 函数作用很像.
##将两张表进行按照一列进行合并
>>> df = fund_name_em_df.merge(fund_open_fund_daily_em_df,on="基金代码")
基金代码 拼音缩写 基金简称_x 基金类型 ... 日增长率 申购状态 赎回状态 手续费
0 000001 HXCZHH 华夏成长混合 混合型-偏股 ... 开放申购 开放赎回 0.15%
1 000003 ZHKZZZQA 中海可转债债券A 债券型-可转债 ... 开放申购 开放赎回 0.08%
... ... ... ... ... ... ... ... ... ...
14296 970166 ZSZGZYTCYGYCYQZDZZQC 招商资管增益添彩一个月持有期中短债债券C 债券型-混合债 ... 开放申购 开放赎回 0.00%
14297 980003 TPYLGYGDCYZ 太平洋六个月滚动持有债 债券型-长债 ... 开放申购 开放赎回 0.05%
[14298 rows x 15 columns]
##第二种写法
#pd.merge(fund_name_em_df,fund_open_fund_daily_em_df,on="基金代码")
复制代码
value_counts
这个函数的使用在日常的使用频率还是很高,可以用来快速统计当前列数据的分布情况。
>>> df.fundtype.value_counts()
混合型 6743
债券型 4543
指数型 1402
股票型 798
FOF 385
QDII 356
混合 41
商品(不含QDII) 30
Name: fundtype, dtype: int64
复制代码
groupby 分组
agg 聚合
上面介绍两个函数,这两个函数一般会经常一起使用,后一个函数的全称是 aggregation,是聚合的意思。这里我们可以分组计算不同类型的基金的手续费的平均值。
#去除手续费为空的数据,将手续费转化为可计算的float类型
df = df.loc[df['手续费'] != ""]
df['cost'] = df['手续费'].apply(lambda x : float(x.split('%')[0])/100)
>>> df.groupby("fundtype")['cost'].agg('mean')
fundtype
FOF 0.001684
QDII 0.003687
债券型 0.001478
商品(不含QDII) 0.000431
指数型 0.000633
混合 0.001227
混合型 0.001324
股票型 0.001207
Name: cost, dtype: float64
##从中我们可以看到QDII基金的手续费是最高的
复制代码
read_sql
看字面意思是读取 sql 语句,作用为 pandas 可以远程执行 sql 语句,并将 sql 运行到的结果返回为 DataFrame 类型。
很多时候,我们的数据处理存放在 excel 中,也会存放在数据库中。平时我们需要处理这些数据时,最常见的办法就是使用数据库连接软件中,编写 sql 语句,进行操作。如果你有了 python,你就再也不用这个数据库连接软件,直接可以在 python 中编写你的 sql 代码。目前 pandas 支持所有主流的数据库,比如 mysql,sqlserver, sqlite 等数据库。
#以pandas查询mysql数据库为例
import pymysql
conn = pymysql.connect(host='localhost',user='user',password='password',
databse='test',port=3306,chartset='utf8')
df = pd.read_sql('SELECT * FROM test_table', conn)
复制代码
评论