python使用大数据-基于python的大数据分析基本知识

1. 数据科学领域中常用的python库

Numpy库:数据运算的基础库,运行效率高(底层C语言,高效index)

Scipy库:实现了常用的科学计算方法(线性代数,傅里叶变换,信号和图像处理)

Pandas库:分析数据的利器,高级数据结构(Series,DataFrame)

Matplotlib库:绘图功能(散点,曲线,柱形)

2. Anaconda的使用说明

介绍:著名的python数据科学平台,开源,跨平台。包含有流行的python和R的包。

下载地址:https://www.anaconda.com/download/

Jupyter notebook基本使用:

ContractedBlock.gif

ExpandedBlockStart.gif

新建一个文件:new

执行代码:Shift+Enter

模式切换:code 和 markdown

查看函数帮助信息: shift+tab

以%开头的为魔法函数:%matplotlib inline

Jupyter notebook基本使用

3. Numpy库介绍

3.1 预备知识

数组与矩阵:数组可以是N维的,而矩阵是二维的数组。

向量:1 * N 或 N * 1 的矩阵

标量:1 * 1 的矩阵

3.2 定义数组

ContractedBlock.gif

ExpandedBlockStart.gif

importnumpy as np

list_1= [1,2,3,4,5]

array_1=np.array(list_1)print(array_1)

定义一维数组

ContractedBlock.gif

ExpandedBlockStart.gif

importnumpy as np

list_1= [1, 2, 3, 4]

list_2= [5, 6, 7, 8]

array_2=np.array([list_1, list_2])print(array_2)

定义二维数组

ContractedBlock.gif

ExpandedBlockStart.gif

#arange函数类似于python的range函数

importnumpy as np

array_3= np.arange(1, 10, 2)print(array_3)

通过arange函数定义数组

ContractedBlock.gif

ExpandedBlockStart.gif

importnumpy as np

array_4_1= np.zeros(5) #定义一维全零数组

print(array_4_1)

array_4_2= np.zeros([2,3]) #定义二维全零数组,两行三列

print(array_4_2)

定义全零数组

ContractedBlock.gif

ExpandedBlockStart.gif

importnumpy as np

array_5= np.eye(5) #定义单位数组: 5*5

print(array_5)

定义单位数组

ContractedBlock.gif

ExpandedBlockStart.gif

importnumpy as np

array_6= np.random.randn(10)print(array_6)

通过randn定义数组

ContractedBlock.gif

ExpandedBlockStart.gif

importnumpy as np

array_7_1= np.random.randint(10, size=10) #一维数组: 每个元素都是0-9中的一个数,size表示1行10列

print(array_7_1)

array_7_2= np.random.randint(10, size=(2,3)) #二维数组: 每个元素都是0-9中的一个数,size表示2行3列

print(array_7_2)

array_7_3= np.random.randint(10, size=20).reshape(4,5) #二维数组,每个元素都是0-9中的一个数,size表示1行20列,通过reshape函数进行再次切分

print(array_7_3)

通过randint定义数组

3.3 操作数组

ContractedBlock.gif

ExpandedBlockStart.gif

importnumpy as np

array_1= np.random.randint(10, size=20).reshape(4,5)#数组的属性

print(array_1.shape) #数组行列信息:(4, 5)

print(array_1.size) #数组总数量:20

print(array_1.dtype) #元素数据类型, 如果存在多种类型,则取精度最高的那个

#数组的访问--操作与切片类似

print(array_1)print(array_1[0][1]) #行选0,列选1

print(array_1[0,1]) #行选0,列选1

print(array_1[:2,1:3]) #行选0和1,列选1和2

#数组的常用函数

print(np.unique(array_1))print(np.sum(array_1)) #返回所有数组元素的和

print(np.sum(array_1[0])) #返回某一行的和

print(np.sum(array_1[:,0])) #返回某一列的和

print(array_1.max()) #返回元素中的最大值

print(array_1[0].max()) #返回某一行中的最大值

print(array_1[:,0].min()) #返回某一列中的最小值

数组操作

3.4 矩阵相关

ContractedBlock.gif

ExpandedBlockStart.gif

importnumpy as np

m= np.mat([[1,2,3, 4],[5,6,7,8]])print(m)

通过列表定义矩阵

ContractedBlock.gif

ExpandedBlockStart.gif

importnumpy as np

a= np.random.randint(10, size=20).reshape(4,5) #定义一个二维数组

m =np.mat(a)print(m)

通过二维数组定义矩阵

ContractedBlock.gif

ExpandedBlockStart.gif

importnumpy as np

A= np.mat(np.random.randint(10, size=20).reshape(4,5))

B= np.mat(np.random.randint(10, size=20).reshape(5,4))print(A * B) #注意:A*B 其中[A矩阵的行]和[B矩阵的列]需要一样,否则会报错

矩阵的乘积运算

4. Pandas库介绍

pandas库主要功能是进行数据的分析和处理,它有两个重要的数据结构:Series 和 DataFrame

4.1 关于数据处理过程中的NaN数据

ContractedBlock.gif

ExpandedBlockStart.gif

1. np.nan 其数据类型为float2. 特点:任何数据跟NaN进行运算,都是NaN3. 删除带有NaN的行或列

s.dropna()

df.dropna(axis=1),其中how参数:any(有nan就删)还是all(全是nan才删),thresh参数:可以设置nan的阈值4. 其他与nan有关的函数

s.isnull(),s.notnull(),df.isnull(),df.notnull()

df.fillna(value=1) #nan值全部填充为1

df.fillna(value=(0:0,1:1)) #0列nan填充0,1列nan填充1

关于NaN的一些知识点

4.2 数据结构Series

Series 类似于 Numpy 中的 array

4.2.1 定义Series

ContractedBlock.gif

ExpandedBlockStart.gif

importnumpy as npimportpandas as pd#通过list

s1 = pd.Series([1,2,3,4,5], index=['a','b','c','d','e'])print(s1)#通过array

s2 = pd.Series(np.arange(10))print(s2)#通过dict, 其中dict的key为index

s3 = pd.Series({"a":1,"b":2,"c":3,})print(s3)

创建Series:3种方式

ContractedBlock.gif

ExpandedBlockStart.gif

s.index

s.name

s.index.name

s.values

Series一些常见属性

4.2.2 Series基本操作

ContractedBlock.gif

ExpandedBlockStart.gif

importpandas as pd

s2= pd.Series([1,2,3,4,5], index=['a','b','c','d','e'])print(s2["b"]) #访问元素:根据索引

print(s2[s2<3]) #访问元素:给定值范围

print(s2.to_dict()) #将 Series 转为 dict

index_new= ["A","B","C","D","E","F"]

s3= pd.Series(s2, index=index_new) #改变Series的索引

s2.drop('a') #删除一个元素

#Series的排序

s2.sort_index() #Series依据index排序

s2.sort_values() #Series依据values排序

Series基本操作

4.3 数据结构DataFrame

4.3.1 DataFrame基本知识

DataFrame对象中的某一列,返回的是一个Series对象

ContractedBlock.gif

ExpandedBlockStart.gif

importnumpy as npimportpandas as pdfrom pandas importSeries, DataFrame#方式1:csv --> DataFrame

df1 = pd.read_csv("filePath_csv")#方式2:Series --> DataFrame

df2 = DataFrame([s1, s2], index=["a","b"])#方式3:dict --> DataFrame

df3 = DataFrame({})

创建DataFrame

ContractedBlock.gif

ExpandedBlockStart.gif

df.shape #查看df的行数和列数

df.columns #查看df的列名

df.head() #查看df的某几行数据

df[['列名1','列名2']] #查看df的某些列数据, 也可以用 df.列名 的方法

df.T #对df进行转置

DataFrame的基本操作

ContractedBlock.gif

ExpandedBlockStart.gif

### 过滤功能#对原有的DataFrame过滤掉某些列,得到一个新的DataFrame 相当于删除某些列

df_new = DataFrame(df, columns=['第一列', '第三列']) #如果columns中填写的列在df中不存在,那么该列的value均为NaN#表示行取10-19,列取0-1

df.iloc[10:20,0:2]#表示行取10-11,列取从第一个到列名为[列名1]的列

df.loc[10:11,:'列名1']### 修改value#给column中一整列全部value重新赋值

df_new['第N列'] = list | numpy |pandas#给column中某一个或几个元素赋值

df_new['第十八列'] = pd.Series([100, 200], index=[1, 2])### 删除操作#删除指定一行

df.drop('A',axis=0)#删除指定一列

df.drop('c1',axis=1)### 添加操作#方式1:直接新增一列

df["GDP"] = Series([111,222,333]) #注意此方式有缺点,如果df的index不是默认值,新增时也需要指定#方式2:直接新增一列

df["GDP"] = df["城市"].map(gdp_map_dict) #使用map的优点,不需要关注index的情况

DataFrame的数据处理

4.3.2 DataFrame相关高级操作

4.3.2.1 运用到DataFrame中的高级函数

ContractedBlock.gif

ExpandedBlockStart.gif

#apply可以对一列或一行数据进行处理#apply可以传入一个函数,这个函数对某一行或某一列进行操作#apply也可以实现将一列分成多列

apply函数

ContractedBlock.gif

ExpandedBlockStart.gif

#通过去重进行数据清洗

df.drop_duplicates(['Seqno'], keep='last')

思路:先看某一列不重复的数据有多少:len(df[''].unique()),再通过duplicated判断元素是否重复

drop_duplicates函数

ContractedBlock.gif

ExpandedBlockStart.gif

#已知一个[按天采样]的Series,求其[按月采样]或[按时采样]

t_range = pd.date_range('2016-01-01', '2016-12-31')

s_day= Series(np.random.randn(len(t_range)), index=t_range)#按月采样

s_month = s_day.resample('M').mean()#按时采样

s_hour = s_day.resample('H').ffill()

resample函数

ContractedBlock.gif

ExpandedBlockStart.gif

#数据分箱技术binning

score_list = np.random.randint(25, 100, size=20)

bins= [0, 59, 70, 80, 100] #定义区间范围点

score_cat = pd.cut(score_list, bins) #对score_list做分箱操作

pd.value_counts(score_cat) #做统计呈现

df=DataFrame()

df['score'] =score_list

df['student'] = [pd.util.testing.rands(3) for i in range(20)]#给df添加区间

df['categories'] = pd.cut(df['score'], bins, labels=['r1','r2','r3','r4'])#注意labels的数量应该等于bins的数量减1

print(df)

cut函数

ContractedBlock.gif

ExpandedBlockStart.gif

#数据聚合技术Aggregation

基本使用:df.agg("func_name")

其中func_name可以是内置的函数,也可以是自定义函数

内置的如:

mean,min,max,describe

自定义的如:def func1(attr): return attr.max() -attr.min()

df.agg("func1")

agg函数

ContractedBlock.gif

ExpandedBlockStart.gif

df = DataFrame([[1,2,3],[1,3,9],[7,3,9]], columns=["A","B","C"])

dfgb_one= df.groupby(df['A'])#按A列分组,求其他列的平均值

dfgb_one.mean()#按A列分组,求B列的平均值

dfgb_one['B'].mean()

groupby

4.3.2.2 DataFrame的排序

ContractedBlock.gif

ExpandedBlockStart.gif

df = DataFrame(np.arange(40).reshape(8,5))#以A列进行排序,降序方式

df.sort_values('A',ascending=False)#以index进行排序

df.sort_index()

DataFrame的排序

4.3.2.3 重命名DataFrame的index

ContractedBlock.gif

ExpandedBlockStart.gif

df.index = df.index.map(str.lower) #map函数可以自己定义,也可以使用python的内置函数

df.rename(index=str.lower, columns=str.lower)

df.rename(index={'A':'a'}, columns={'BJ':'bj'}) #传入字典,字典中内容为修改的内容

重命名DataFrame的index

4.3.2.4 DataFrame的merge操作

ContractedBlock.gif

ExpandedBlockStart.gif

合并两个df:pd.merge

合并规则:找列名相同,value值相同

on参数默认为None,用来指定用哪一列进行merge

how参数默认为inner,用来指定merge策略。可选取值:left, right, inner,outer

DataFrame的merge操作

4.3.2.4 DataFrame的多级index

ContractedBlock.gif

ExpandedBlockStart.gif

1. 创建1个二级index的Series2. 如何访问具有二级index的Series3. 多级index的Series与DataFrame的相互转换4. 创建1个具有多级index和多级columns的DataFrame

DataFrame的多级index

5. Pandas库中Series和DataFrame的关系

1. DataFrame 的每一列为一个 Series

DataFrame的每一行为一个 tuple。df.iterrows() 返回一个generator,遍历generator,每个元素为一个tuple,每个tuple有两个元素:index, Series。

2. Series是一维数据结构。index 创建series时可以指定,values array类型。

DataFrame是二维数据结构。包含有index,columns,values。

3. Series转为字典:{k1:v1,k2:v2}

DataFrame转为字典:{k1:{k11:v11,k12:v12}}

6. 使用pandas过程中的问题记录

1. 当用read_csv读取文件时,若某一列原本有整数和NaN数据,那么读取内容后此列中所有的整数都会变为浮点数。因为NaN数据属于浮点数。

2. 查看某一列中有多少个NaN的方法:.isnull().sum()

3. 统计某列或者某行数据元素的个数.value_counts()

4. 去除df中所有包含NaN的行:df.dropna()

5. 按条件删除某些行:df.drop(df[(df.score < 50) & (df.score > 20)].index)

其中可以使用操作符: | 只需其中一个成立,& 同时成立,~ 表示取反

6. 对列中每个元素做统一操作:df['column_name'].map(len)。其中len也可以是自定义函数

7. 针对某一列取值的唯一性,定义一些必要的映射关系:dict{ zip(df.column_name.unique(), {"a1", "a2", "a3"}) }

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值