2021-08-08

一、numpy


numpy数组的索引和切片

import numpy as np

us_file_path="./youtube_video_data/US_video_data_numbers.csv"
uk_file_path="./youtube_video_data/GB_video_data_numbers.csv"

#unpack=True 表示转置   delimiter 将数据按","分割(本来的数据就是用","分开的
t1=np.loadtxt(us_file_path,delimiter=",",dtype="int",unpack=True)
t2=np.loadtxt(us_file_path,delimiter=",",dtype="int")#dtype 将数据变成整数

#取行
print(t2[2])#[5845909  576597   39774  170708]

#取连续的多行
print(t2[2:])

#取不连续的多行
print(t2[[2,8,10]])#取2 8 10行

#取列 逗号前是行后是列
print(t2[1,:])# :表示列全要
print(t2[2:,:])#2: 表示取第二行及以后的连续多行
print(t2[[2,20,8],:])#和print(t2[[2,20,8]])的结果一样
print(t2[:,0])#取第一列 [4394029 7860119 5845909 ...  142463 2162240  515000]

#取连续的多列
print(t2[:,2:])

#取不连续的多列
print(t2[:,[0,2]])

#取第三行,第四列的值
a=t2[2,3]
print(a)#170708
print(type(a))#<class 'numpy.int32'>

#取第三行到第五行,第二列到第四列的结果
#取的是行和列交叉点的位置
b=t2[2:5,1:4]#2:5,1:4 索引为4,5的取不到
print(b)
# [[576597  39774 170708]
#  [ 24975   4542  12829]
#  [ 96666    568   6666]]


#取多个不相邻的点
c=t2[[0,2,2],[0,1,3]]
print(c)#[4394029  576597]

numpy修改数组对应位置的值

import numpy as np

us_file_path="./youtube_video_data/US_video_data_numbers.csv"
uk_file_path="./youtube_video_data/GB_video_data_numbers.csv"

#unpack=True 表示转置   delimiter 将数据按","分割(本来的数据就是用","分开的
t1=np.loadtxt(us_file_path,delimiter=",",dtype="int",unpack=True)
t2=np.loadtxt(us_file_path,delimiter=",",dtype="int")#dtype 将数据变成整数


#numpy中数值的修改
t2[:,2:4]=0#直接将t2对应位置的值修改了
print(t2)


#把数组中小于10的数字都修改
t2[t2<10]=3
print(t2)

#把t2中小于10的数字替换成0,把大于10的替换为10
print(np.where(t2<=10,0,10))

#把t2小于10的替换为10,大于18的替换成18
print(t2.clip(10,18))

#把t2中的某一个数字赋值为nan
print(type(t2[3,3]))#t2中的每个数字都是int32型的
#nan是float型的,而t2中的每个数字都是int型的,所以不能直接赋值
#t2[3,3]=np.nan#ValueError: cannot convert float NaN to integer
t2=t2.astype(float)#改变t2的类型 astype()
t2[3,3]=np.nan#现在就可以赋值了
print(t2)

numpy创建全为0,1或对角线为的矩阵

import numpy as np

t1=np.zeros((3,4))
print(t1)#三行四列的全0数组
t2=np.ones((3,4))
print(t2)#三行四列的全1数组
t3=np.eye(3)
print(t3)#创建一个对角线为1的方阵(3行3列)

#获取最大值,最小值的位置
print(np.argmax(t3,axis=0))#t3的每一行的最大数的索引
t3[1,0]=5
print("33333333333")
print(t3)
print(np.argmax(t3,axis=1))#t3的每一列的最大数的索引
print(np.argmax(t3,axis=0))
print(np.argmin(t3,axis=0))#t3的每一行的最小数的索引

在这里插入图片描述

numpy矩阵的转置

代码如下(示例):

import numpy as np

t2=np.arange(24).reshape((4,6))
print(t2)
#转置的几种方法
print(t2.transpose())#transpose() 转置
print(t2.T)
print(t2.swapaxes(1,0))

在这里插入图片描述

numpy生成随机数

代码如下(示例):

import numpy as np

#创建一个四行五列的范围在10到20之间的随机的整数数组
t1=np.random.randint(10,20,(4,5))

#让每次的随机数都一样 np.random.seed(x) x不变(即种子不变)的话那么生成的随机数也不变
np.random.seed(10)
t2=np.random.randint(0,20,(3,4))
print(t2)#每次生成的t2都一样(与第一次生成的随机数一样)

在这里插入图片描述


numpy中常用的统计函数

import numpy as np

#求和 t.num()
t2=np.arange(12).reshape((3,4)).astype(float)
t2[1,2]=np.nan
print(t2)
print(t2.sum(axis=0))#[12. 15. nan 21.]

#求中值 t.mean() np.medin()
print(t2.mean(axis=0))#按列求中值 [ 4.  5. nan  7.]
print(np.median(t2))

#求最大值  t.max()
print(t2.max(axis=0))#求t2的每一列的最大值  [ 8.  9. nan 11.]

#求最小值  t.min()
print(t2.min(axis=0))#求t2的每一列的最小值 [ 0.  1. nan  3.]

#求极差 np.ptp()
print(np.ptp(t2))

#求标准差 t.std()  反应数据的波动情况
print(t2.std(axis=0))#按列计算t2的标准差

在这里插入图片描述

numpy中nan的注意点

import numpy as np

#nan不是一个数字,而是一个东西,这个东西随机
print(np.nan==np.nan)#False 这是不相等的
t1=np.nan
print(t1==t1)#False

#统计数组中的不为0的数字个数 np.count_nonzero(x)
t2=np.arange(24).reshape((4,6)).astype("float")
t2[:,0]=0
print(t2)
print(np.count_nonzero(t2))#20

#统计数组中的nan的个数
t2[1,2]=np.nan
print(t2!=t2)
print(np.count_nonzero(t2!=t2))#1
print("@@@@@@@@@@@@@@@@")
print(np.isnan(t2))
print(np.count_nonzero(t2!=t2))#1
'''
方法一
print(t2!=t2):
[[False False False False False False]
 [False False  True False False False]
 [False False False False False False]
 [False False False False False False]]
np.count_nonzero(t2!=t2):
1
'''

'''
方法二  np.isnan(x)
np.isnan(t2):
[[False False False False False False]
 [False False  True False False False]
 [False False False False False False]
 [False False False False False False]]
print(np.count_nonzero(t2!=t2)):
1
'''

#nan和任何数字做运算都等于nan
#求和 np.sum()
print(np.sum(t2))#nan
t3=np.arange(12).reshape((3,4))
print(np.sum(t3))#66
#把t3按列相加
print(np.sum(t3,axis=0))#[12 15 18 21]

在这里插入图片描述

二、Pandas

为什么要学习Pandas

numpy能够帮我们处理处理数值型数据,但是这还不够很多时候,我们的数据除了数值之外,还有字符串,还有时间序列等比如:我们通过爬虫获取到了存储在数据库中的数据.
所以,numpy能够帮助我们处理数值,但是pandas除了处理数值之外(基于numpy),还能够帮助我们处理其他类型的数据

Pandas常用的数据类型

Series 一维,带标签数组(标签指的就是索引)
DataFrame 二维,Series容器

Pandas之series数组创建

import pandas as pd

#pd.Series([])创建一维的数组
t=pd.Series([1,2,31,12,3,4])
print(type(t))#<class 'pandas.core.series.Series'>
print(t)
#前面是索引,后面是数据
# 0     1
# 1     2
# 2    31
# 3    12
# 4     3
# 5     4
# dtype: int64

#自己指定索引的值 index=list()
t2=pd.Series([1,23,2,2,1],index=list("abcde"))
print(t2)
# a     1
# b    23
# c     2
# d     2
# e     1
# dtype: int64

#用字典来创建Series数组,键是索引,值是值
temp_dict={"name":"xiaohong","age":"30","tel":10086}
t3=pd.Series(temp_dict)
print(t3)
# name    xiaohong
# age           30
# tel        10086
# dtype: object

#修改数组类型
t2.astype(float)

Pandas之读取外部数据

import pandas as pd
from pymongo import MongoClient
#pandas读取csv中的文件
df=pd.read_csv("./dogNames2.csv")
print(df)

client=MongoClient()
collection=client["douban"]["tvl"]
data=list(collection.find())
print(data)

Pandas之DataFrame

import pandas as pd
import numpy as np


print(pd.DataFrame(np.arange(12).reshape(3,4)))
#    0  1   2   3
# 0  0  1   2   3
# 1  4  5   6   7
# 2  8  9  10  11

#改变索引
t1=pd.DataFrame(np.arange(12).reshape(3,4),index=list("abc"),columns=list("WXYZ"))
# print(t1)
#   W  X   Y   Z
# a  0  1   2   3
# b  4  5   6   7
# c  8  9  10  11

#字典
d1={"name":["xiaoming","xiaogang"],"age":[20,32],"tel":[10086,10010]}
print(d1)#{'name': ['xiaoming', 'xiaogang'], 'age': [20, 32], 'tel': [10086, 10010]}
t1=pd.DataFrame(d1)
print(t1)
#        name  age    tel
# 0  xiaoming   20  10086
# 1  xiaogang   32  10010

#列表
d2=[{"name":"xiaohong","age":32,"tel":10010},{"name":"xiaohong","tel":10000},{"name":"xiaowang","age":22}]
t2=pd.DataFrame(d2)
print(t2)
#        name   age      tel
# 0  xiaohong  32.0  10010.0
# 1  xiaohong   NaN  10000.0
# 2  xiaowang  22.0      NaN

统计之电影数据

1.用runtime

import pandas as pd
from matplotlib import pyplot as p

file_path = "./IMDB-Movie-Data.csv"
df = pd.read_csv(file_path)
# print(df.head(1))
# print(df.info())

# runtime分布情况:选择直方图
runtime_data = df["Runtime (Minutes)"].values
t2 = df["Rating"].tolist()

max_runtime = runtime_data.max()
min_runtime = runtime_data.min()

# 计算组数
num_bin = (max_runtime-min_runtime)//5

# 设置图形大小
p.figure(figsize=(15,8),dpi=80)

p.hist(runtime_data,num_bin)

p.xticks(range(min_runtime,max_runtime+5,5))

# 设置网格
p.grid()

p.show()

在这里插入图片描述
2.用rating

import pandas as pd
from matplotlib import pyplot as p

file_path = "./IMDB-Movie-Data.csv"
df = pd.read_csv(file_path)

rating_data = df["Rating"].values

max_rating = rating_data.max()
min_rating = rating_data.min()
# print(max_rating-min_rating)
# 设置组数
# num_bin_list = [1.6]
num_bin_list = [1.6,3.6]
i = num_bin_list[1]
while i<=max_rating+0.5:
    i=i+0.5
    num_bin_list.append(i)
# 设置图形大小
p.figure(figsize=(15,8),dpi=80)

p.hist(rating_data,num_bin_list)

# _x = [min_rating]
# i = min_rating
# j=0
# while i<=max_rating+0.5:
#     i=i+num_bin_list[j]
#     j=j+1
#     _x.append(i)

p.xticks(num_bin_list)

p.grid()
p.show()

在这里插入图片描述

pandas之常用统计方法

import pandas as pd
import numpy as np

file_path="IMDB-Movie-Data.csv"
df=pd.read_csv(file_path)
#print(df.info())

print(df.head(1))

#获取平均评分
print(df["Rating"].mean())#6.723200000000003

#导演人数
print(len(set(df["Director"].tolist())))#644
print(len(df["Director"].unique()))#644

#获取演员的人数
temp_actors_list=df["Actors"].str.split(",").tolist()
actors_list=[i for j in temp_actors_list for i in j]
actors_num=len(set(actors_list))
print(actors_num)

字符串离散化案例

import pandas as pd
from matplotlib import pyplot as plt
import numpy as np
file_path = "./IMDB-Movie-Data.csv"

df = pd.read_csv(file_path)
print(df["Genre"].head(3))
#统计分类的列表
temp_list = df["Genre"].str.split(",").tolist()  #[[],[],[]]

genre_list = list(set([i for j in temp_list for i in j]))

#构造全为0的数组
zeros_df = pd.DataFrame(np.zeros((df.shape[0],len(genre_list))),columns=genre_list)
# print(zeros_df)

#给每个电影出现分类的位置赋值1
for i in range(df.shape[0]):
    #zeros_df.loc[0,["Sci-fi","Mucical"]] = 1
    zeros_df.loc[i,temp_list[i]] = 1

# print(zeros_df.head(3))

#统计每个分类的电影的数量和
genre_count = zeros_df.sum(axis=0)
print(genre_count)

#排序
genre_count = genre_count.sort_values()
_x = genre_count.index
_y = genre_count.values
#画图
plt.figure(figsize=(20,8),dpi=80)
plt.bar(range(len(_x)),_y,width=0.4,color="orange")
plt.xticks(range(len(_x)),_x)
plt.show()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值