Data 8 学习笔记(一)
Data 8 学习笔记(一)
介绍
DATA 8 是加州大学伯克利分校的数据科学基础课程,使用的编程语言为python。
课程资源:
- 课程官网
包含了课程视频,课上ppt,但是作业需要UCB的账号。
视频在Youtube可以找到,目前最新的是2022Spring(最新的人家不可能让你免费看嘛) - Github 课程作业
包含课堂同步Jupiter notebook还有lab, hw, project以及最重量级的textbook。最新的是2025Spring(太良心了)。
具体的配置很简单,主要是使用numpy, panda, matplotlib, 还有UCB自己的datascience这几个python库。
datascience library
安装(在terminal, cmd):
npm install datascience
这个库属于UCB为了初学者专门创建的preliminary tool,它主要操作的数据类型是库里定义的Table。就如同它的名字一样,Table就是个表格,每一列都是一个np array(大概就是访问速度更快储存空间更小的array),datascience库为它提供了包括可视化在内的基础操作。
别忘了import:
1 | import numpy as np |
对Table的基础操作
Tip: 课程有一部分时间教了python的基本语法,函数,传参还有使用函数等等,这里不做介绍了。对于不熟悉的函数可以参考 datascience 官方文档 , 或者使用help(function)
make_array()
datasicence.util.make_array(), 把传入的每个数据合并到一个np array里面,传入的数据类型必须相同。返回一个np array。
对于np array可以使用numpy库的各种函数,比较常用的有:
np.sort()
排序np.diff()
取相邻元素求差值np.sum()
求和np.prod()
求乘积np.round( ,digit)
取digit位数,默认取整数
用np.arrange(start, end, step)
, np.linspace(start, end, num)
和 np.array(list,tuple,etc)
也能创造np array。
需要选取一个np array里的数据可以使用.item(index)
,index遵循python列表的索引规则(正序从0开始,倒序从-1开始)。
Table()
使用Table()
函数会创造一个新的空Table数据,其中不含有任何行或列元素。
该函数通常搭配.with_columns()
函数使用。
Table.with_columns(column_name:str, column_data: np_array)
该函数传入一个字符串作为列名称,以及一个np array作为列数据
eg:
1
2 a = Table().with_columns("name", np.array(("Penny", "Brian")))
a.show()
name Penny Brian
- 使用
Table.drop(column_name:str, ...)
可以从Table里删除列(传入的列名称不存在的话报错) - 使用
Table.num_rows
和Table.num_columns
可以获取Table里的行和列的数量。 - 使用
Table.labels
获取Table里所以的列的名称, 使用Table.relabeled(old_label, new_label)
可以更换列名称。 - 使用
Table.column(column_label)
会返回带有这个列名称的列,返回类型是np array。 - 使用
Table.select()
可以返回多个目标列组成的Table, 该函数可以传入索引也可以传入列名称。
Table.sort()
datascience也支持根据某一列来排序Table。
Table.sort()
传入列名称,datascience库会根据该列的数据进行排序,并返回一个新列表。Tip:
Table.sort(str, descending = False)
默认升序排列,如果想要降序排列可以把descending属性改成True。
Table.take()
之前说的.select()
还有 .column()
函数都是选取列的,datascience也是支持选取特殊行的。
Table.take(index,...)
可以选取表格的index行并返回新的Table, index可以是collection,例如:
1 Table.take(np.arange(0,10,2)这样就会选取Table里从第一行到第10行,每隔一行的目标行,也就是会返回第1,3,5,7,9行组成的新Table。
虽然这样根据行数选取行很有用,但是在有规律地选取行的时候限制很大。
Table.where()
用where
函数我们可以有条件地筛选需要的行。
Table.where(column_name: str, condition)
我们传入需要筛选的列数据地列名称,以及条件。对于条件参数,datascience也创造了新的类,
are
。通过are.below()
,are.between()
等函数,我们可以筛选符合一定数学条件地数据。
但是我个人推荐使用python内置地匿名函数lambda
。例如are.below()
就可以使用lambda y : y < x
来代替。
通过上述的操作,我们可以把数据汇总到我们需要的Table里面。为了获取需要的Table,我们很可能要对数据进行很多步的操作,在此过程中必须格外注意哪些函数是直接修改原表格的,而哪些是会返回新的表格的,否则很有可能导致我们的操作不被保存在具体变量里。
想要熟悉这些操作的话可以试一下DATA 8 课程配套的project。
可视化
面对汇总成Table的大量数据,为了方便我们分析,我们往往需要把数据转变成可视化的图。datascience和matplotlib都有能够将数据可视化的强大能力。
散点图 Scatter plots
datascience库提供了极其简单的创造散点图的方法——Table.scatter()
.
给定一个已经汇总好的Table,我们可以往scatter函数里传入我们想要放入散点图的x,y轴的列名称,例如:
1 Table.scatter(x_column_name: str, y_column_new: str)Tip: 如果我们使用matplotlib来画散点图的话可能会更复杂点:
1
2
3
4
5
6 import matplotlib.pyplot as plt
plt.scatter(table.column(), table.column(), label="Points")
#重要的是传入两个np array作为x,y轴
plt.title("") #图的标题
plt.xlabel("") #x轴的标签
plt.ylabel("") #y轴的标签
折线图 Line plots
折线图和散点图的语法完全一样,但是是使用Table.plot()
函数。
传入x,y轴的列数据列名称即可。
1 Table.plot(x_column_name: str, y_column_new: str)如果使用matplotlib的话也很简单:
1 plt.plot(x, y, label="Line")
条形图 Bar chart
datascience支持画横向纵向的条形图:
使用
Table.bar(category, value)
画纵向的条形图,其中第一个参数是分组,第二个是数值(也就是说每个数据的高是第二个参数, 而每个数据的分组(x轴)是第一个参数)。使用
Table.barh()
画横向的条形图,参数顺序一致,不过每个数据的名称显示在y轴而已。Tip: 使用matplotlib画条形图的语法完全相同,但是函数的对象不再是Table而是plt
plt.bar()
,plt.barh()
直方图 Histogram
在画直方图之前我们必须先了解binning
(分箱)。
bins
箱:指连续的区间 [a,b) 分箱时他们不一定是相等的区间。
直方图展示的是数据的分布而非数据的值:
area
每个箱的高和箱的长度相乘可得这个箱的面积, 每个箱的面积的和为1。height
每个箱的高为: $$高(密度) = 频率/宽度 = (频数/总数)/宽度$$
那怎么画直方图捏:
1 | #当你分箱完毕后记得把bins放到一个nparray里面,然后调用Table.hist() |
bin_counts: 假设column是(10,20,20,30,30,40), bins是np.array((10,20,30,40)), 那么对该列使用.bins()的结果是:
bin | count |
---|---|
10 | 1 |
20 | 2 |
30 | 2 |
40 | 1 |
重叠图 Overlaid graphs
有时候我们需要把坐标和尺度相同的数据集放在同一个图表里,datascience库也能很轻松地完成这个任务。
对于比较常用的散点图scatter()
,条形图bar
,barh
,和折线图plot
,调用方法都一样,结构类似于:Table.method(column_label_of_common_axis, array_of_labels_of_variables_to_plot)
不过最常用的办法是用select
函数从Table里先筛选出需要画图的列,然后在第一个参数里放入坐标列的名称即可,datascience库会自动把剩余列元素一同放在图里。