文章目录
一、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()