跟我一起学点 数据分析 -- 第一天:上手pandas(1)

527 阅读9分钟

在这里插入图片描述

文章目录

数据分析前景

数据分析师的在企业中的主要作用是支持与指导业务发bai展。基本合格的数据分析师支持业务发展,优秀的数据分析师指导业务发展。

岗位缺口大,就业薪资高,而且这个岗位对学历的要求不是特别高,对经验的要求也不算严格,从而数据分析师,在大数据时代,迎来了黄金就业期。

通过搜索BOSS直聘和领英,发现其上面有上有10万+个数据分析师职位空缺,其中绝大部分是互联网行业的需求。值得注意的是,虽然国内现有很多数据分析师员工,但其数量占比依旧很少,职位空缺却占到了市场的50%之多。大多数热门岗位都会在招聘JD中,给出“具备数据分析能力”这样的招聘条件。

从销售、市场,到运营、产品经理、用户研究等,都试图从各种繁杂数据中看出点门道,获得对市场、产品、消费者等方面的洞见。

作为一名18级的大数据学生,大一的职业规划我写的就是数据分析师。
那时候菜啊,什么都不会。
现在也菜啊,但是奋六世之余烈,我表示可以一试。

秉持着一贯的好习惯,不懂就买课。在摸索了两天无果之后,我果断借了书,买了课。这不,来与大家共享来了嘛。


Why pandas?

pandas创始人Wes McKinney对pandas的讲解

在pandas的官网(Python Data Analysis Library)上,我们可以看到有一段pandas创始人Wes McKinney对pandas的讲解,从创始人的角度我们可以直接理解pandas这个python的数据分析库的主要特性和发展方向。

McKinney一共总结了9个特性,我们来一个个过一下。

1.对表格类型的数据的读取和输出速度非常快。(个人对比excel和pandas,的确pandas不会死机....)在他的演示中,我们可以看到读取489597行,6列的数据只要0.9s。

2.时间序列处理。经常用在金融应用中。

3.数据队列。可以把不同队列的数据进行基本运算。

4.处理缺失数据。

5.分组运算。比如我们在前面泰坦尼克号中的groupby。

6.分级索引。

7.数据的合并和加入。

8.数据透视表。

9.数据归纳和分析。

pandas的热度

再来看看pandas的流行度:
在这里插入图片描述

pandas对于数据分析

pandas全面支持数据分析项目的研发步骤:
在这里插入图片描述

具体我就不展开了吧,将会陆陆续续在之后的博客中展现。

pandas的不足之处

1、网络内容爬取。
话说术业有专攻,对于爬虫,有专门的爬虫库,还有scrapy框架。

2、复杂的SQL存储操作
pandas 的 to_sql方法存储数据不够灵活。

3、内存受限
受限于计算机的内存,无法分析超过内存大小的数据。

解决方案:
归并排序思想。
Dask集群框架。


pandas获取数据

此处的获取数据,并不是说去网络上爬取,而是从文件中获取。

读取csv文件

方法:

pandas.read_csv(filepath_or_buffer,header='infer',names=None,usecols=None,dtype=None)	
#这里提供了常用参数,不代表只有这些参数

参数释义:

filepath_or_buffer : 字符串,文件路径,或者文件句柄,或者字符串IO

header :整数,或整数列表,缺省值 ‘infer’将第一行视作列名,
如果names参数有值,且header=0将使用names参数作为列名。header可以是一个整数的列表,如[0,1,3]。

names : 列名数组,缺省值 None

usecols:指定返回的列

dtype:指定列的数据类型。

看不懂没关系,马上就实操演示一下呗。

开始实操前,先来看几个知识点:

head方法可以查看前五条数据
tail方法用来查看最后五条数据
dtypes属性可以用来查看列数据类型

原始数据:
在这里插入图片描述

测试

import pandas as pd

df = pd.read_csv('test.csv')

print(df.head(7))   # 默认是5行,可以人为指定

结果:

     a  b
0  1.0  2
1  3.0  4
2  NaN  5

import pandas as pd

df = pd.read_csv('test.csv',header=1) # 指定csv文件第一行为列名称

print(df.head(7))   # 默认是5行,可以认为指定

结果:

     1  2
0  3.0  4
1  NaN  5

import pandas as pd

df = pd.read_csv('test.csv',names = [1,2,3,4,5]) # 指定列名称

print(df.head(7))
     1  2   3   4   5
0    a  b NaN NaN NaN
1    1  2 NaN NaN NaN
2    3  4 NaN NaN NaN
3  NaN  5 NaN NaN NaN

指定的列名称是从右往左排的,列名一定要起全,不然会有几页无法调用了。


import pandas as pd

df = pd.read_csv('test.csv',header = 0,names = ['a','b'],usecols=['a']) # 返回指定列

print(df.head())
     a
0  1.0
1  3.0
2  NaN

import pandas as pd

df = pd.read_csv('test.csv')
print(df.dtypes)    #查看列类型
a    float64
b      int64
dtype: object

修改列类型:

import pandas as pd

df = pd.read_csv('test.csv',dtype={'b':object}) #修改列类型
print(df.dtypes)    #查看列类型
a    float64
b     object
dtype: object

我讲明白了吗?


读取JSON文件

pandas.read_json(path_or_buf=None, orient=None, dtype=True, lines=False)

在这里插入图片描述

演示

由于对方连课件都不发,那就莫得办法咯

以records格式读取JSON文件:
在这里插入图片描述

读取JSON Lines文件

在这里插入图片描述

读取Excel文件

方法:

read_excel(io,sheetname=0, header=0, skiprows=None, skip_footer=0, index_col=None,usecols=None)

参数释义:
io:Excel路径
sheetname:指定工作表名或编号,编号从0开始
skiprows : 省略指定行数的数据
skip_footer :省略从尾部数的int行数据
index_col : 指定列为索引列

废话不多说,直接演示

这是我抓下来的电影票房数据,有需要的话微信搜 “Look Future”,后台回复电影票房数据。
在这里插入图片描述

一运行就报了这个错:

ImportError: Missing optional dependency 'xlrd'. Install xlrd >= 1.0.0 for Excel support Use pip or conda to install xlrd.

什么意思呢?说明我们还需要去安装xlrd的库了。

实验

import pandas as pd

xls_file = '不同种类电影往年票房.xlsx'
df = pd.read_excel(xls_file).head(5)

print(df)

运行一下,一堆的错啊,让人防不胜防。
抽了一下:xlrd.biffh.XLRDError: Excel xlsx file; not supported

说是xlrd版本太高,不支持xlsx文件了,把版本调到1.2吧

然后运行出来:

   上映日期     片名       总票房
0  2019     柬爱     9.63W
1  2019    那座桥     6.05W
2  2019  决战中途岛     2.92Y
3  2019   小巷管家  2433.22W
4  2019   功夫小镇    16.97W

(用的是另一张表,所以时间不一样)

我给你们讲啊,我就特别的讨厌这种受制于人的感觉,人家改动一下,你怎么办?
上次开发一个自动化软件,依赖于一个平台,结果后来人家平台出了个活动,导致我们的小软件就得大改。
就很难受。


读取指定工作表

import pandas as pd

xls_file = '不同种类电影往年票房.xlsx'
df = pd.read_excel(xls_file,sheet_name='动作').head(5)    #指定读取工作表

print(df)
   上映日期        片名      总票房
0  2019      功夫小镇   16.97W
1  2019      越域重生    6.55W
2  2019  终结者:黑暗命运    3.51Y
3  2019       杨靖宇  127.81W
4  2019        二凤   61.22W

指定列名称

import pandas as pd

xls_file = '不同种类电影往年票房.xlsx'
df = pd.read_excel(xls_file,sheet_name='动作',header=1).head(5)    #指定列名称

print(df)
   2019      功夫小镇   	16.97W
0  2019      越域重生     6.55W
1  2019  终结者:黑暗命运  3.51Y
2  2019       杨靖宇   127.81W
3  2019        二凤     61.22W
4  2019      双子杀手    2.32Y

读取指定列

import pandas as pd

xls_file = '不同种类电影往年票房.xlsx'
df = pd.read_excel(xls_file,sheet_name='动作',usecols=['片名','总票房']).head(5)    #指定列名称

print(df)

你要那个列不存在,是会报错的

         片名      总票房
0      功夫小镇   16.97W
1      越域重生    6.55W
2  终结者:黑暗命运    3.51Y
3       杨靖宇  127.81W
4        二凤   61.22W

略过开始/结束行

import pandas as pd

xls_file = '不同种类电影往年票房.xlsx'
df = pd.read_excel(xls_file,sheet_name='英语',usecols=['片名','总票房'],skiprows=10,skipfooter=20).head(5)

print(df)

这样会报什么错呢?

ValueError: Usecols do not match columns, columns expected but not found: [‘片名’, ‘总票房’]

请各位自行思考个中缘由、

包括还有一个参数:指定索引,如果操作不当,也会有这个问题。


读取MySQL的数据库文件

在这里插入图片描述

这里需要一定的MySQL功底,如果不熟悉的话,建议先移步:MySQL见闻录 - 入门之旅

《深入浅出SQL》问答录

read其实就是两个函数的壳:

read_sql_query:通过一个SQL语句读取数据
read_sql_table:读取数据库中的一个表(table)
pandas.read_sql(sql, con, index_col=None,columns=None)

参数释义:

sql:表名、SQL语句
con:建立连接
index_col:索引列

测试

环境配置:
首先你需要有安装MySQL环境,这些在这里都不多说,上面那篇MySQL入门之旅很详细。

整完之后,开个户:
在这里插入图片描述

from sqlalchemy import create_engine
import pandas as pd

# mysql+pymysql://用户名:密码@服务器IP/数据库名
engine = create_engine('mysql+pymysql://pandas:pandas@localhost/pandas')	
# 我这里又换新人了
print(engine.execute('show tables').fetchall())

# 配置引擎,并确定引擎可用

除了代码中的那个包,还要安装两个包。
pymysql和cryctography、

[('presidents',)]

from sqlalchemy import create_engine
import pandas as pd

engine = create_engine('mysql+pymysql://pandas:pandas@localhost/pandas')

print(pd.read_sql('presidents',con=engine))

表里面什么都没有,自然什么都读不出来了。

Empty DataFrame
Columns: [last_name, first_name]
Index: []

from sqlalchemy import create_engine
import pandas as pd

engine = create_engine('mysql+pymysql://pandas:pandas@localhost/pandas')

#print(pd.read_sql('presidents',con=engine,index_col='first_name'))  # 使用索引列

pd.read_sql('select * from presidents',con=engine) # 直接使用SQL语句

由于表中没有数据,所以什么也读不出来。


我觉得,出了那个json没有素材,MySQL有点超纲以外,其他的应该是讲明白了吧。

在这里插入图片描述