电影案例
问题1:我们想知道这些电影数据中评分的平均分,导演的人数等信息,我们应该怎么获取?
movie = pd.read_csv("./资料-边学边练超系统掌握人工智能机器学习算法/day03-资料/2.code/data/IMDB-Movie-Data.csv")
print(movie.head())
print(movie["Rating"].mean())
print(movie["Director"].unique().shape[0])
问题2:对于这一组电影数据,如果我们想rating,runtime的分布情况,应该如何呈现数据?
plt.figure(figsize=(20, 8), dpi=100)
plt.hist(movie["Rating"].values, bins=20)
max_ = movie["Rating"].values.max()
min_ = movie["Rating"].values.min()
plt.xticks(np.linspace(max_, min_, num=21))
plt.grid()
plt.show()
plt.figure(figsize=(20, 8), dpi=100)
plt.hist(movie["Runtime (Minutes)"].values, bins=20)
max_ = movie["Runtime (Minutes)"].values.max()
min_ = movie["Runtime (Minutes)"].values.min()
plt.xticks(np.linspace(max_, min_, num=21))
plt.grid()
plt.show()
问题3:对于这一组电影数据,如果我们希望统计电影分类(genre)的情况,应该如何处理数据?
temp_df = np.zeros([movie["Rating"].shape[0], movie["Director"].unique().shape[0]])
temp_list = [i.split(",") for i in movie["Genre"]]
col = np.unique([j for i in temp_list for j in i])
df = pd.DataFrame(np.zeros([temp_df.shape[0], col.shape[0]]), columns=col)
for i in range(df.shape[0]):
df.loc[i, temp_list[i]] = 1
df.sum().sort_values(ascending=False).plot(kind="bar", fontsize=10)
plt.show()
numpy,matplotlib,pandas总结
numpy创建的是ndarray对象
Ndarray.size:数组中所有元素的数量
x1 = np.random.rand(5,2,3) 返回5个2行3列的[0,1)内的数组
x2 = np.random.randn(5,2,3) 返回5个2行3列的标准正态分布内的数组
x3 = np.random.standard_normal(size=[5,2]) 返回5个2行3列的标准正态分布内的数组
numpy直接索引先行后列
Pandas直接索引是先列后行,不好记,所以pandas用.loc或.iloc就是先行后列了
Numpy中得np.unique(ndarrary对象)
Pandas中对dataframe/series对象,Dataframe.unique(),注意区分
np.all():如果都是Ture,则返回Ture;如果存在一个是False,则返回False
np.any():如果存在一个是True,则返回True;如果全是False,则返回False
三元运算:np.where(条件,x,y) 满足条件,输出x,否则输出y
条件与:np.logical_and(条件1,条件2)
条件或:np.logical_or(条件1,条件2)
按行还是按列取最大值或最小值:axis=0按列;axis=1按行(不一定)
Ndarray对象*3 是对数组中每个元素都乘3
注意是array对象还是列表对象,列表*3只会复制3份一样的
广播机制实现了时两个或两个以上数组的运算,即使这些数组的shape不是完全相同的,只需要满足如下任意一个条件即可。
1.数组的某一维度等长。
2.其中一个数组的某一维度为1 。
广播机制需要扩展维度小的数组,使得它与维度最大的数组的shape值相同,以便使用元素级函数或者运算符进行运算。
Matplotlib.pyplot 画图
Savefig要放在show前面
多条数据线在一个图像:多次使用plt.plot
plt.xticks(x[::5], x_ticks_label[::5])【类似后面元素x_ticks_label替换前面的元素x作为x轴】
多个坐标轴显示:
需要分别对不同的坐标系设置x轴刻度标签
折线:plot 散点:scatter 柱:bar/barh 直方:hist 饼:pie
Pandas
Series是一列 多个series就成dataframe
无法对某个索引进行修改,只能全部改
.ix:不支持,没得用了
注意:
Dataframe.loc/iloc[]:用的是中括号,不是圆括号
用loc时,取前4行索引的名字:dataframe.index[0:4]
用iloc时,知道列索引名字如何取下标:dataframe.columns.get_indexer([“列索引名字”])
按多个键排序时
先判断open,当相同时再判断high
加/减:.add()、直接+
.query(“列中的值所要满足的条件”)
data.query("open<24 & open>23").head()
# 可以指定值进行一个判断,从而进行筛选操作
data[data["open"].isin([23.53, 23.85])]
Describe直接得出许多结果
Max()、min()、std()标准差、var()方差、median()中位数、idxmax()、idxmin()返回最值位置
Cumsum()、cummax()、cummin()、cumprod()计算前。。个数的累计值/最值
画图注意表明kind
读取
存/读hdf5时要指定一个键,不然会报错
处理缺失值
dropna()不改变原来数据,返回新数据
qcut = pd.qcut(data, q):将data分成q组,得到qcut
再用qcut.value_counts()统计分组
pd.cut(data, bins):bins是自定义分组,[-100, -20, 0, 20, 100]
Pd.get_dummies(data, prefix=”名字”)实现onehot编码
数据合并
Axis=0/1,按列/行索引
How= left/right/inner/outer 左右内外连接
重命名行、列索引
Rename
分组聚合 df.groundby 合并同类项,对合并起来的数据可以取最值、平均等
col.groupby(["color", "object"])["price1"].max()
groupby(["color", "object"])相当于行索引 合并相同的color和object
["price1"].max()相当于列索引