数据分析三剑客之: Numpy

一丶Numpy的使用

​ numpy 是Python语言的一个扩展程序库,支持大维度的数组和矩阵运算.也支持针对数组运算提供大量的数学函数库

创建ndarray

# 1.使用np.array() 创建一维或多维数据
import numpy as np
arr = np.array([1,2,3,4,5]) # 一维
arr = np.array([[1,2,3],[4,5,6]])# 二维 ### 注意元素类型:
# 1. numpy默认ndarray的所有元素的类型是相同的
# 2. 如果传进来的列表中包含不同的类型,则统一为同一类型,优先级:str>float>int
# 2. 使用 matplotlib.pyplot() 获取一个numpy数组,数据源是一张图片
import matplotlib.pyplot as plt
img_arr = plt.imread('./cat.jpg') # 得到 一个三维数据源 # 数据源再转换成图片
plt.imshow(img_arr)
# 可以对数据源进行计算
plt.imshow(img_arr - 100)

使用np的routines函数创建

# 1.创建等差数列  np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
# 参数说明: start-stop是创建数据的范围,num指定个数据,
np.linspace(0,100,num=10) # array([ 0. , 11.11111111, # 2. 创建等差数列 np.arange([start, ]stop, [step, ]dtype=None)
np.arange(0,100,2) # array([ 0, 2, 4, 6, # 3. 随机数 np.random.randint(low, high=None, size=None, dtype='l')
# 时间种子(随机因子):无时无刻都在变化的值
# 固定随机因子就可以固定随机函数的随机性 np.random.seed(90) #固定随机因子
np.random.randint(0,100,size=(3,5)) # 随机数 # 4. 生成 0-1的随机数,左闭右开 np.random.random(size=None)
np.random.random(size=(3,4))

nadarray的属性

# 四个必须参数: 1.ndim:维度  :   arr.ndim
2.shape:形状(各个维度的长度) : arr.shape
3.size:总长度 : arr.size
4.dypte:元素类型 : arr.dtype

二丶ndarray的基本操作

索引

​ 维与列表完全一致 多维时同理,索引默认从0开始

# 根据索引修改数据
arr[0] # 获取行元素 arr[[0,1]] # 获取多行元素 arr[1,3] # 获取1行3列的那个元素 arr[1,[2,3,4]] # 一行多列的值

切片

​ 一维与列表完全一致 多维时同理

### arr[行,列]

# 获取二维数组前两行
arr[0:2] # 获取二维数组前两列
arr[:,0:2] # 获取二维数组前两行和前两列数据
arr[0:2,0:2] # 将数组的 '行' 倒序
arr[::-1,:] # 列倒序
arr[:,::-1] # 全部倒序
arr[::-1,::-1] # 将图片进行全倒置操作
img_arr.shape # 图片的形状
plt.imshow(img_arr[:,::-1,:]) # 倒序之后的图片 # 对图片进行裁剪
plt.imshow(img_arr[100:360:,150:580,:]) # 行 , 列 进行切片

变形

​ 使用arr.reshape()函数,参数是一个tuple

# 1.将一维数组变形成多维数组
arr_1.reshape((10,4)) # 转换成10行 4列的数组 arr_1.reshape((5,-1)) # -1 , 自动转换 # 2.将多维数组变形车一维数组
arr_1 = arr.reshape((40,))

级联

​ np.concatenate((arr,arr),axis=1)

​ 参数:(数据源1,数据源2) , axis是方向:1是行,0是列

# 1. 一维,二维,多维数组的级联,实际操作中级联多为二维数组
np.concatenate((arr,arr),axis=1) # array([[45, 33, 77, 76 # 2. 合并两张照片
# 横向合并3张照片
arr_3 = np.concatenate((img_arr,img_arr,img_arr),axis=1)
#
arr_9 = np.concatenate((arr_3,arr_3,arr_3),axis=0)
plt.imshow(arr_9) ### 注意:
# 1.级联的参数是列表: 一定要加中括号或小括号
# 2.维度必须相同
# 3.性状相符:在维度保持一致的前提下,
# 如果进行横向(axis=1)级联,必须保证进行级联的数组行数保持一致
# 如果进行纵向(axis=0)级联,必须保证进行级联的数组列数保持一致
# 4. 可通过axis参数改变级联的方向

三丶ndarray聚合操作

求和 np.sum

# arr.sum(axis=1) #  axis 1 行相加 ,0 列
arr.sum(axis=1)

最大值和最小值

# np.max/np.min

平均值

# np.mean() 平均值

其他操作

Function Name    NaN-safe Version    Description
np.sum np.nansum Compute sum of elements
np.prod np.nanprod Compute product of elements
np.mean np.nanmean Compute mean of elements
np.std np.nanstd Compute standard deviation
np.var np.nanvar Compute variance
np.min np.nanmin Find minimum value
np.max np.nanmax Find maximum value
np.argmin np.nanargmin Find index of minimum value
np.argmax np.nanargmax Find index of maximum value
np.median np.nanmedian Compute median of elements
np.percentile np.nanpercentile Compute rank-based statistics of elements
np.any N/A Evaluate whether any elements are true
np.all N/A Evaluate whether all elements are true
np.power 幂运算

四丶ndarray的排序

快速排序

# np.sort() 和 ndarray.sort() 都可以,但是有区别:
# np.sort() 不改变输入
# ndarray.sort() 本地出里,不占用空间,但改变输入 ###
np.sort(arr,axis=0) # 列排序, 不改变源数据
arr.sort(axis=1) # 行排序 , 改变源数据

五丶Panda的数据结构

Series

# 概述:
### Series是一种类似于一维数组的对象
# values: 一组数据(ndarray类型)
# index: 相关的数据索引标签
# 1. 创建Series
# 方式一: 由列表或numpy数组创建. 默认索引0到 N-1 整数索引
# 使用列表创建Series
Series(data=[1,2,3]) # 使用数组生成一个Series
s2 = pd.Series(np.arange(7)) # 还可以通过设置index参数指定索引
s = Series(data=[1,2,3],index=['a','b','c']) # 使用一个字典生成Series,其中字典的键,就是索引
s3 = pd.Series({'1':1, '2':2, '3':3})
# 2. Series的索引和切片
# 可以使用中括号取 单个 索引(此时返回的是元素类型),或者中括号里 '一个列表'取多个索引(此时返回的是一个Series类型) # 1.显示索引
- 使用index中的元素作为索引值
- 使用 s.loc(推荐),获取元素的值. loc中括号中放置的一定是显示索引
- 此时是闭区间 # 2.隐式索引
- 下标索引 ,使用s.iloc[下标]
# 3. Series的基本概念
# 可以使用s.head() 和 tail() 分别查看前n个 和后n个值 s.head(2) # 查看前2个,默认是5个
s.tail(2) # 查看后2个 # 对Series元素进行去重
s.unique() ### 注意:
当索引没有对应的值时,可能出现数据缺失显示NaN(not a number)的清空 # 使两个Series进行相加
s1 = Series([1,2,3],index=['a','b','c'])
s2 = Series([1,2,3],index=['a','d','c'])
s = s1 + s2 # s 中存在空值NaN # 使用 pd.isnull(),pd.notnull(),或s.isnull(),notnull()函数检测缺失数据
# 和 any() 搭配
s.isnull() # 找到控制 ,得到布尔类型的数据, 可作为列索引进行过滤 # 和 all() 搭配
s.notnull() # 对空值进行过滤 , 可作为列索引进行过滤
# 3. Series之间的运算
- 在运算中自动对齐不同索引的数据
- 如果索引不对应,则补NaN

六丶DateFrame

概述

# DataFrame是一个表格型的数据结构. DataFrame由按照一定顺序排列的多列数据组成.设计初衷是将Series的使用场景从一维拓展到多维.DataFrame既有行索引,也有列索引.
# - 行索引:index
# - 列索引:columns
# - 值: values

创建DataFrame

# 1. DataFrame的创建
# - 最常用的方法传递一个字典来创建.DataFrame以字典的键作为每一[列]的名称,以字典的值(一个数组)作为每一列
# - DataFrame会自动加上每一行的索引
# - 使用字典创建的DataFrame后,则columns参数将不可被使用
# - 同Series一行,若传入的列与字典的键不匹配. 则相应的值为NaN
### 使用ndarray 创建DataFrame
# 参数说明: # index 是行索引,columns是列索引
df=DataFrame(data=np.random.randint(0,100,size=(3,4)),index=['a','b','c'],columns=['A','B','C','D'])
### DataFrame属性: values,columns,index,shape
df.values # 获得所有值
df.columns # 获取所有列索引
df.index # 获取所有行索引
df.shape # 获得形状
### 使用ndarray  和 DataFrame: 创建一个表格用于展示张三,李四
dic = {
'zhangsan':[99,99,99,99],
'lisi':[0,0,0,0]
}
df = DataFrame(data=dic,index=['语文','数学','英语','理综'])
df

DataFrame的索引

1 . ### 对列 进行索引
# 通过类似字典的方式 df['q']
# 通过属性的方式 df.q # DataFrame的获取列取为一个Series. 返回的Series拥有的DataFrame相同的索引,
# 且name属性也已经设置好了,就是相应的列明 df['lisi'] # 取出 列索引
df[['zhangsan','lisi']] # 取出多列索引
2. ###  对行进行索引
- 使用 .loc[] 加 index参数的值,来进行, 行索引
- 使用.ilock[] 加 索引整数 来进行, 行索引 # 同样返回一个Series,index为原来的columns df.loc['语文'] # 行索引
df.iloc[[0,1]] # 行索引
df.iloc[0] # 行索引
3. ###  对元素索引的方法
- 使用列索引
- 使用行索引(ilock[3,1] 或者 loc['C','q']) 行索引在前,列索引在后 ### 行索引在前,列索引在后
df.iloc[2,1]
df.loc['英语','zhangsan']
df.iloc[[1,2],[1]]

切片

【注意】 直接用中括号时:

    - 索引表示的是列索引
- 切片表示的是行切片
# 行切片
df[0:2] #行切片 # 在loc和iloc中使用切片(切列)
df.loc['B':'C','丙':'丁']
# 索引和切片总结:
索引
df['col']:列索引,取出指定的列
df[[col1,col2]]:取出多列
df.iloc[1]:取指定的1行 , 下标为1
df.loc['语文']:取指定的行
df.iloc[hang,lie]:取元素 , [行,列]
切片:
df[行切片]:切行
df.iloc[hang,lie]:切列

DataFrame的运算

# 概述
(1) DataFrame之间的运算 , 同Series一样:
- 在运算中自动对齐不同索引的数据
- 如果索引不对应,则补NaN
#### 练习题:
1 .假设ddd是期中考试成绩,ddd2是期末考试成绩,请自由创建ddd2,并将其与ddd相加,求期中期末平均值。
# 运算, 期中期末,
qz=df # 期中
qm=df # 期末
qz+qm # 列值相加
mean_scroe=(qz+qm)/2 # 求平均值 2. 假设张三期中考试数学被发现作弊,要记为0分,如何实现?
# 找到具体的元素位置,更改值
qz.iloc[1,1]=0 3. 李四因为举报张三作弊立功,期中考试所有科目加100分,如何实现?
# 对 李四的所有科目+100分
qz['lisi']+=100 4. 后来老师发现有一道题出错了,为了安抚学生情绪,给每位学生每个科目都加10分,如何实现?
# 对所有人的成绩都加10分
qz+=10

七丶处理丢失数据

###  有两种丢失数据:
None
np.nan(NaN)

None

# None 是 python 自带的,其类型为python object .因此 None不能参与到任何计算中

np.nan(NaN)

# np.nan是浮点类型,能参与到计算中。但计算的结果总是NaN。
#查看np.nan的数据类型
type(np.nan)

pandas中的None与NaN

### 1.  在  pandas中None与np.nan都视作np.nan
# 做 数据 级联 或者 聚合 都会出现none
### 2. pandas处理空值

# 判断函数
# - isnull()
# - notnull() # axis 的值为1,表示横向, 找出为空的行
df.isnull().any(axis=1) # 找出不含空值的行
df.notnull().all(axis=1) # ~:取反, 表示取出 不包含空值的行
df.loc[~df.isnull().any(axis=1)] ## 固定搭配使用
isnull()->any
notnull()->all # df.dropna() 可以选择过滤的是行还是列(默认为行):axis中0表示行,1表示的列
df.dropna(axis=0) # 填充函数 Series/DataFrame, 把数据集中的空值数给填充
# fillna() value 和 method参数
# 参数解释:
# axis=1
# bfill : 向左填充
# ffill : 向右填充 # axis=0
# bfill : 向上填充
# ffill : 向下填充
df_test=df.fillna(method='bfill',axis=1).fillna(method='ffill',axis=1)

案例 : 股票分析

# 使用tushare包获取某股票的历史行情数据
# pip install tushare import tushare as ts
import pandas as pd # 导入数据
maotai = ts.get_k_data(code='600519',start='1900-01-01')
maotai.head() #存储本地
maotai.to_csv('./maotai.csv') #从本地读取数据
#index_col将哪一列作为原数据的行索引
#将date的类型转成时间类型然后将其作为原数据的行索引
df = pd.read_csv('./maotai.csv',index_col='date',parse_dates=['date'])
df.drop(labels='Unnamed: 0',axis=1,inplace=True) # 1. 输出该股票所有收盘比开盘上涨3%以上的日期。
#(收盘-开盘)/开盘 > 0.03
(df['close'] - df['open']) / df['open'] > 0.03
#将True对应的行数据取出
df.loc[(df['close'] - df['open']) / df['open'] > 0.03]
#取行索引
df.loc[(df['close'] - df['open']) / df['open'] > 0.03].index # 2. 假如我从2010年1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到今天为止,我的收益如何?
df_2010 = df['2010':'2019'] # 3. 基于开盘价进行股票的买卖
# 买股票的时机:
# 每月的第一个交易日买入一手(100股)股票
# 一个完整的年会买入12次股票供给1200股
# 卖股票的时机:
# 每年的最后一个交易日卖出所有(1200股)的股票
# 一共可以卖9次股票
# 注意:19年只可以买入不可以卖出,最后剩余的不能卖出的1000股股票是需要计算到总收益中 # 数据的重新取样resample()函数 #买入股票花费的钱数
df_monthly = df_2010.resample('M').first()
cost_money = df_monthly['open'].sum()*100
#卖出股票收到多少钱
df_yearly = df_2010.resample('A').last()[:-1]
#昨天的收盘价
last_price = df_2010['close'][-1] # 收益
recv_monry = df_yearly['open'].sum()*1200 + last_price*1000
recv_monry - cost_money

python数据分析三剑客之: Numpy的更多相关文章

  1. 数据分析三剑客之numpy

    Numpy 简介 数据分析三剑客:Numpy,Pandas,Matplotlib NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算, ...

  2. python数据分析三剑客基础之matpoltlib初解

    一.什么是matplotlib? python的底层绘图工具,主要做数据可视化图表,源自matplot. 二.为什么要学matplotlib? 1.它能将数据进行可视化,更直观的呈现出来 2.它能让数 ...

  3. python 数据分析工具之 numpy pandas matplotlib

    作为一个网络技术人员,机器学习是一种很有必要学习的技术,在这个数据爆炸的时代更是如此. python做数据分析,最常用以下几个库 numpy pandas matplotlib 一.Numpy库 为了 ...

  4. python数据分析三剑客之: pandas操作

    pandas的操作 pandas的拼接操作 # pandas的拼接操作 级联 pd.concat , pd.append 合并 pd.merge , pd.join 一丶pd.concat()级联 # ...

  5. 数据分析三剑客之一numpy

    NumPy系统是Python的一种开源的数值计算扩展.这种工具可用来存储和处理大型矩阵. 可以用python实现的科学计算包括: 1.一个强大的N维数组对象Array: 2.比较成熟的(广播)函数库: ...

  6. Python数据分析工具库-Numpy 数组支持库(一)

    1 Numpy数组 在Python中有类似数组功能的数据结构,比如list,但在数据量大时,list的运行速度便不尽如意,Numpy(Numerical Python)提供了真正的数组功能,以及对数据 ...

  7. $python数据分析基础——初识numpy库

    numpy库是python的一个著名的科学计算库,本文是一个quickstart. 引入:计算BMI BMI = 体重(kg)/身高(m)^2 假如有如下几组体重和身高数据,让求每组数据的BMI值: ...

  8. python数据分析三剑客之: matplotlib绘图模块

    matplotlib 一.Matplotlib基础知识 Matplotlib中的基本图表包括的元素 - x轴和y轴 axis 水平和垂直的轴线 - x轴和y轴刻度 tick 刻度标示坐标轴的分隔,包括 ...

  9. Python数据分析工具库-Numpy 数组支持库(二)

    1 shape变化及转置 >>> a = np.floor(10*np.random.random((3,4))) >>> a array([[ 2., 8., 0 ...

随机推荐

  1. 等了半年的AMD锐龙3000系列台式机处理器今天终于上市开卖了!

    第三代AMD锐龙台式机处理器参数:

  2. Margin和padding失效

    太久不写原生果然不行,Margin和padding对div有效,对span失效,原因就不解释了(元素性质,块状之类的)

  3. chrome-解决该扩展程序未列在 Chrome 网上应用店中

    1.win10添加策略组 复制以下内容到.bat文件中,右键-以管理员身份运行,即可添加策略组 pushd "%~dp0" dir /b C:\Windows\servicing\ ...

  4. 开发中常用linux命令

    1.创建目录mkdir 创建目录命令,常用的参数-p,递归创建目录 [root@web01 ~]# mkdir /data [root@web01 ~]# mkdir /data/a/b mkdir: ...

  5. 洛谷P5020 货币系统

    题目 题意简化一下就是找题目给定的n个数最多能消掉多少个,我们用个tong[i]来记录i这个数值能不能用小于等于i的货币组合起来,等于1意味着他只能由自己本身的货币组成,等于2说明他可以被其他货币组成 ...

  6. eclipse中自动生成serialVersionUID

     serialVersionUID作用:  序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性.       如果你修改代码重新部署后出现序列化错误,可以考虑给相应的类增加seri ...

  7. [Noip2018]填数游戏

    传送门 Description 耳熟能详,就不多说了 Solution 对于一个不会推式子的蒟蒻,如何在考场优雅地通过此题 手玩样例,发现对于 \(n=1\) , \(ans=2^m\) .对于 \( ...

  8. Thrift源码分析(二)-- 协议和编解码

    协议和编解码是一个网络应用程序的核心问题之一,客户端和服务器通过约定的协议来传输消息(数据),通过特定的格式来编解码字节流,并转化成业务消息,提供给上层框架调用. Thrift的协议比较简单,它把协议 ...

  9. iis可以运行但是界面不能在桌面显示是怎么回事

    iis可以运行但是界面不能在桌面显示是怎么回事 引用:https://zhidao.baidu.com/question/1948053642075906588.html 在开始->运行 执行i ...

  10. 将物理机转换成vmware虚机

    随着虚拟化的快速发展,公司主要是以公有云+私有云结合的混合云部署,据我不成熟的了解,目前很少有公司会将一台单独的物理机作为服务器,在公司内部大家逐渐接受了私有云的部署方案,这样做不但可以节省硬件资源, ...