numpy与pandas应用

numpy

numpy创建数组

代码实现:

"""
Date: 2019--24 09:21
User: yz
Email: 1147570523@qq.com
Desc:
"""
import numpy as np
data=np.random.random((3,4))
print(data)

print("转置:",data.T)
print("转置:",data.transpose())
print("转置:",data.swapaxes(1,0))

在这里插入图片描述

矩阵的转置

代码实现:

"""
Date: 2019--24 09:21
User: yz
Email: 1147570523@qq.com
Desc:

"""

import numpy as np
data=np.random.random((3,4))
print(data)

print("转置:",data.T)
print("转置:",data.transpose())
print("转置:",data.swapaxes(1,0))

在这里插入图片描述

索引切片

"""
Date: 2019--24 09:40
User: yz
Email: 1147570523@qq.com
Desc:
"""
import  numpy as np
a=np.arange(12).reshape((3,4))


print(a[1])#第二行

print(a[:,2])#第三列

print(a[1,2])#第2行3列的数据

print(a[1:3])#取第二行和第三列

print(a[:,2:4])

在这里插入图片描述

numpy中数值的修改

代码实现:

"""
Date: 2019--24 09:48
User: yz
Email: 1147570523@qq.com
Desc:

"""
import numpy as np
t=np.arange(24).reshape((4,6))

print(t)
t[:,2:4]=0
print(t)

print(t<10)

t[t<10]=100
print(t)

t1=np.where(t<100,0,10)
print(t)
print(t1)

在这里插入图片描述

获取四角元素

"""
Date: 2019--24 09:48
User: yz
Email: 1147570523@qq.com
Desc:
"""
import numpy as np

def get_edge(data):
    row, column = data.shape
    rows = np.array([[0, 0], [row - 1, row - 1]])
    cols = np.array([[0, column - 1], [0, column - 1]])
    return data[rows, cols]

if __name__ == '__main__':
    x = np.arange(30).reshape((5, 6))
    print(x)
    print("result:", get_edge(x))

在这里插入图片描述

数组拼接

"""
Date: 2019--24 10:29
User: yz
Email: 1147570523@qq.com
Desc:

"""
import numpy as np

print("******************** concatenate ****************")
a = np.array([[1, 2], [3, 4]])
print('第一个数组')
print(a)
print('\n')

b = np.array([[5, 6], [7, 8]])
print('第二个数组')
print(b)
print('\n')


print('沿轴 0 连接两个数组:')
print(np.concatenate((a, b)))
print('\n')

print('沿轴 1 连接两个数组')
print(np.concatenate((a, b), axis=1))

在这里插入图片描述

"""
Date: 2019--24 11:09
User: yz
Email: 1147570523@qq.com
Desc:

"""
import numpy as np

print('*********************append********************')

a=np.array([[1,2,3],[4,5,6]])

print('第一个数组:')
print(a)
print(np.append(a,[7,8,9]))
print('\n')

print('沿轴 0 添加元素')
print(np.append(a, [[7, 8, 9]], axis=0))
print('\n')

print('沿轴 1 添加元素')
print(np.append(a, [[5, 5, 5], [7, 8, 9]], axis=1))
print('******************************insert****************************************')
a = np.array([[1, 2], [3, 4], [5, 6]])

print('第一个数组')
print(a)
print('\n')

print('未传递 Axis 参数,再插入之前数组会被展开。')

print(np.insert(a, 3, [11, 12]))
print('\n')

print('传递例 Axis 会广播数值来配输入数组')
print('沿轴 0 广播:')
print(np.insert(a, 1, [11], axis=0))
print('\n')

print('沿轴 1 广播')
print(np.insert(a, 1, 11, axis=1))
print('***********************delete******************************************')
a = np.arange(12).reshape(3, 4)

print('第一个数组')
print(a)
print('\n')

print('未传递 Axis 参数,再插入之前数组会被展开。')
print(np.delete(a, 5))
print('\n')

print('删除第二列')
print(np.delete(a, 1, axis=1))
print('\n')

print('删除第二行')
print(np.delete(a, 1, axis=0))
print('\n')

print('包含从数组中删除的替代值的切片:')
a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

print(np.delete(a, np.s_[::2],axis=0))

在这里插入图片描述

案例:身高体重统计

	"""
Date: 2019--24 11:48
User: yz
Email: 1147570523@qq.com
Desc:

"""
import numpy as np
def get_avg_height():
    fname = "doc/eg6-a-student-data.txt"
    # 定义读取列的数据类型
    dtype = np.dtype([('gender', '|S1'), ('height', 'f2')])
    # 读取文件的第2列和第3列, 前9行忽略;
    data = np.loadtxt(fname=fname, dtype=dtype, skiprows=9,
                      usecols=(1, 3))
    # print(data)
    # print(data['gender'])
    # print(data['height'])
    # print(data['height'][data['gender'] == b'M'].mean())
    # print(data['height'][data['gender'] == b'F'].mean())

    # 判断是否性别为那男的表达式
    isMale = data['gender'] == b'M'
    male_avg_height = data['height'][isMale].mean()
    # ~代表取反
    female_avg_height = data['height'][~isMale].mean()
    return male_avg_height, female_avg_height



    # 对于体重数据的处理, 如果不能转换为浮点数据类型, 则返回缺失值;
    try:
        return  float(weight)
    except ValueError as e:
        return  -99

def get_avg_weight():
    fname = "doc/eg6-a-student-data.txt"
    # 定义读取列的数据类型
    dtype = np.dtype([('gender', '|S1'), ('weight', 'f2')])
    # 读取文件的第2列和第4列, 前9行忽略;
    data = np.loadtxt(fname=fname, dtype=dtype, skiprows=9,
                      usecols=(1, 4), converters={4:parser_weight})

    # 判断是否性别为男的平均身高
    isMale = data['gender'] == b'M'

    # 判断是否性别为男的平均体重
    is_weight_vaild = data['weight'] > 0
    male_avg_weight = data['weight'][isMale & is_weight_vaild].mean()
    female_avg_weight = data['weight'][~isMale & is_weight_vaild].mean()
    return  male_avg_weight, female_avg_weight

if __name__ == '__main__':
    print(get_avg_height())
    print(get_avg_weight())

在这里插入图片描述

numpy练习题

3.创建一个中心是边界值为1而内部都是0的数组(1010)/Create a 2d array with 1 on the border and 0 inside (★☆☆)
4.创建一个8×8的棋盘格/Create a 8×8 matrix and fill it with a checkerboard pattern (★☆☆)
5. 归一化一个随机的5
5矩阵/Normalize a 5×5 random matrix (★☆☆)
归一化就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。我们这里选用的方法,是把这些随机值找出最大值和最小值,然后把最大值和最小值分别用1和0表示,其他值则反映在0和1中间。

"""
Date: 2019--24 15:03
User: yz
Email: 1147570523@qq.com
Desc:

"""

#第三题
import numpy as np
a=np.ones((4,4))
a[1:-1,1:-1] = 0
print(a)

#4
x = np.zeros((8,8),dtype=int)
x[::2,::2]=1
x[1::2,1::2]=-1
print(x)

#5
Z = np.random.random((5,5))
Zmax, Zmin = Z.max(), Z.min()
Z = (Z - Zmin)/(Zmax - Zmin)
print(Z)

在这里插入图片描述

pandas

Pandas是一个强大的分析结构化数据的工具集;它的使用基础是Numpy(提供高性能的矩阵运算);用于数据挖掘和数据分析,同时也提供数据清洗功能。
利器之一:Series
类似于一维数组的对象,是由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。仅由一组数据也可产生简单的Series对象。
利器之二:DataFrame
是Pandas中的一个表格型的数据结构,包含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型等),DataFrame即有行索引也有列索引,可以被看做是由Series组成的字典。

常见的数据类型:
- 一维: Series
- 二维: DataFrame
- 三维: Panel …
- 四维: Panel4D …
- N维: PanelND …
SeriesPandas中的一维数据结构,类似于Python中的列表和Numpy中的Ndarray,不同之处在于:Series是一维的,能存储不同类型的数据,有一组索引与元素对应。

pandas创建series数据类型

import pandas as pd
import numpy as np
import  string


# 查看pandas版本信息
print(pd.__version__)

# ********************创建Series对象

#  1). 通过列表创建Series对象
array = ["粉条", "粉丝", "粉带"]
# 如果不指定索引, 默认从0开始;
s1 = pd.Series(data=array)
print(s1)
# 如果不指定索引, 默认从0开始;
ss1 = pd.Series(data=array, index=['A', 'B', 'C'])
print(ss1)

# 2). 通过numpy的对象Ndarray创建Series;
n = np.random.randn(5)   # 随机创建一个ndarray对象;
s2 = pd.Series(data=n)
print(s2)
# 修改元素的数据类型;
ss2 = s2.astype(np.int)
print(ss2)

# 3). 通过字典创建Series对象;
dict = {string.ascii_lowercase[i]:i for i in range(10)}
# print(dict)
s3 = pd.Series(dict)
print(s3)

在这里插入图片描述

Series基本操作

import pandas as pd
import numpy as np
import  string

array = ["粉条", "粉丝", "粉带"]
s1 = pd.Series(data=array)
print(s1)
print(s1.axes)
print(s1.dtype)
print(s1.empty)
print(s1.ndim )
print(s1.size)
print(s1.values)

#
# 1). 修改Series索引
print(s1.index)
s1.index = ['A', 'B', 'C']
print(s1)


# 2). Series纵向拼接;
array = ["粉条", "粉丝", "westos"]
# 如果不指定索引, 默认从0开始;
s2 = pd.Series(data=array)
s3 = s1.append(s2)
print(s3)
#
# 3). 删除指定索引对应的元素;
s3 = s3.drop('C')  # 删除索引为‘C’对应的值;
print(s3)


# 4). 根据指定的索引查找元素
print(s3['B'])
s3['B'] = np.nan  # None, null, pandas数据为空, 或者数据缺失, np.nan
print(s3)


# 5). 切片操作  --- 同列表
print(s3[:2])
print(s3[::-1])
print(s3[-2:])  # 显示最后两个元素

在这里插入图片描述

Series运算

import pandas as pd
import numpy as np
import  string

s1  = pd.Series(np.arange(5), index=list(string.ascii_lowercase[:5]))  # s1.index=[a, b, c, d, e]   s1.value=[0 1 2 3 4]
s2  = pd.Series(np.arange(2, 8), index=list(string.ascii_lowercase[2:8]))  # s2.index = [c,d,e,f]

print(s1)
print(s2)

# *****************按照对应的索引进行计算, 如果索引不同,则填充为Nan;
# 加法, 缺失值+ 真实值===缺失值
print(s1 + s2)
print(s1.add(s2))


# -
print(s1 - s2)
print(s1.sub(s2))


# *
print(s1 * s2)
print(s1.mul(s2))


# /
print(s1 / s2)
print(s1.div(s2))



# 求中位数
print(s1)
print(s1.median())


# 求和
print(s1.sum())


# max
print(s1.max())

# min
print(s1.min())

在这里插入图片描述

创建DataFrame数据类型

"""

Series只有行索引,而DataFrame对象既有行索引,也有列索引
    行索引,表明不同行,横向索引,叫index,
    列索引,表明不同列,纵向索引,叫columns,

"""


import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

# 方法1: 通过列表创建
li = [
    [1, 2, 3, 4],
    [2, 3, 4, 5]
]

# DataFRame对象里面包含两个索引, 行索引(0轴, axis=0), 列索引(1轴, axis=1)
d1 = pd.DataFrame(data=li, index=['A', 'B'], columns=['views', 'loves', 'comments', 'tranfers'])
print(d1)

# 方法2: 通过numpy对象创建
narr = np.arange(8).reshape(2, 4)
# DataFRame对象里面包含两个索引, 行索引(0轴, axis=0), 列索引(1轴, axis=1)
d2 = pd.DataFrame(data=narr, index=['A', 'B'], columns=['views', 'loves', 'comments', 'tranfers'])
print(d2)

# 方法三: 通过字典的方式创建;
dict = {
    'views': [1, 2, ],
    'loves': [2, 3, ],
    'comments': [3, 4, ]

}
d3 = pd.DataFrame(data=dict, index=['粉条', "粉丝"])
print(d3)


# 日期操作的特例:
# pd.date_range()
dates = pd.date_range(start='1/1/2019', end='1/08/2019')
print(dates)


# 行索引
dates = pd.date_range(start='today', periods=6, freq='2D' ) # periods=6从今天开始向后产生6个日期
print(dates)

# 数据
data_arr = np.random.randn(6, 4)
# print(data_arr)
# 列索引
columns = ['A', 'B', 'C', 'D']
d4 = pd.DataFrame(data_arr, index=dates, columns=columns)
print(d4)

# 一维对象: 建立一个以2019年每一天作为索引, 值为随机数;
dates = pd.date_range(start='1/1/2019', end='12/31/2019', freq='D')
datas = np.random.randn(len(dates))
s1 = pd.Series(datas, index=dates)
print(s1[:3])

在这里插入图片描述

分组与聚合操作之group_by

"""
pandas提供了一个灵活高效的groupby功能,
    1). 它使你能以一种自然的方式对数据集进行切片、切块、摘要等操作。
    2). 根据一个或多个键(可以是函数、数组或DataFrame列>名)拆分pandas对象。
    3). 计算分组摘要统计,如计数、平均值、标准差,或用户自定义函数。
"""

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

df = pd.DataFrame(
    {'province': ['陕西', '陕西', '四川', '四川', '陕西'],
     'city': ['咸阳', '宝鸡', '成都', '成都', '宝鸡'],
     'count1': [1, 2, 3, 4, 5],
     'count2': [1, 2, 33, 4, 5]
     }

print(df)
# 根据某一列的key值进行统计分析;
grouped = df['count1'].groupby(df['province'])
print(grouped.describe())
print(grouped.median())

# 根据城市统计分析cpunt1的信息;
grouped = df['count1'].groupby(df['city'])
print(grouped.max())


# 指定多个key值进行分类聚合;
grouped = df['count1'].groupby([df['province'], df['city']])
print(grouped)
print(grouped.max())
print(grouped.sum())
print(grouped.count())

#  通过unstack方法, 实现层次化的索引;
print(grouped.max().unstack())

在这里插入图片描述

案例_商品数据分析案例

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

# 需求1:
#     1). 从文件中读取所有的数据;
#     2). 获取数据中所有的商品名称;
goodsInfo = pd.read_csv('doc/chipo.csv')
print("商品名称显示: \n", goodsInfo['item_name'].head())
print("商品名称显示: \n", goodsInfo.item_name.head())


#
# 需求1:
#
#     3). 跟据商品的价格进行排序, 降序,
#     将价格最高的20件产品信息写入mosthighPrice.xlsx文件中;
# 重新赋值;
goodsInfo.item_price = goodsInfo.item_price.str.strip('$').astype(np.float)
highPriceData = goodsInfo.sort_values('item_price', ascending=False).head(20)
# print(highPriceData.head(5))
filename = '/tmp/mostHighPrice.xlsx'
highPriceData.to_excel(filename)
print("保存成功.......")


#
# 需求2:
#     1). 统计列[item_name]中每种商品出现的频率,绘制柱状图
#             (购买次数最多的商品排名-绘制前5条记录)
goodsInfo = pd.read_csv('doc/chipo.csv')
# new_info会统计每个商品名出现的次数;其中 Unnamed: 0就是我们需要获取的商品出现频率;
newInfo = goodsInfo.groupby('item_name').count()
# print(newInfo)
mostRaiseGoods = newInfo.sort_values('Unnamed: 0', ascending=False)['Unnamed: 0'].head(5)
print(mostRaiseGoods, type(mostRaiseGoods))   # series对象;

# 获取对象中的商品名称;
x = mostRaiseGoods.index
# 获取商品出现的次数;
y = mostRaiseGoods.values

# 需求2:
#     2). 根据列 [odrder_id] 分组,求出每个订单花费的总金额======订单数量(quantity), 订单总价(item_price)。
#     3). 根据每笔订单的总金额和其商品的总数量画出散点图。


# goodsInfo = pd.read_csv('doc/chipo.csv')
# # 获取订单数量
# quantity = goodsInfo.quantity
# # 获取订单总价
# item_price = goodsInfo.item_price \
#     = goodsInfo.item_price.str.strip('$').astype(np.float)

# # 根据列 [odrder_id] 分组
# order_group = goodsInfo.groupby("order_id")
# # 每笔订单的总金额
# x = order_group.item_price.sum()
# # 商品的总数量
# y = order_group.quantity.sum()

# from pyecharts import  EffectScatter
# scatter = EffectScatter("每笔订单的总金额和其商品的总数量关系散点图")
# scatter.add("", x, y)
# scatter.render()

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值