用word制作目录的详细过程,谢谢

用word制作目录的详细过程,谢谢,第1张

数据库索引是为了增加查询速度而对表字段附加的一种标识。见过很多人机械的理解索引的概念,认为增加索引只有好处没有坏处。这里想把之前的索引学习笔记总结一下:
首先明白为什么索引会增加速度,DB在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询的速度。那么在任何时候都应该加索引么?这里有几个反例:1、如果每次都需要取到所有表记录,无论如何都必须进行全表扫描了,那么是否加索引也没有意义了。2、对非唯一的字段,例如“性别”这种大量重复值的字段,增加索引也没有什么意义。3、对于记录比较少的表,增加索引不会带来速度的优化反而浪费了存储空间,因为索引是需要存储空间的,而且有个致命缺点是对于update/insert/delete的每次执行,字段的索引都必须重新计算更新。
那么在什么时候适合加上索引呢?我们看一个Mysql手册中举的例子,这里有一条sql语句:
SELECT
ccompanyID,
ccompanyName
FROM
Companies
c,
User
u
WHERE
ccompanyID
=
ufk_companyID
AND
cnumEmployees
>=
0
AND
ccompanyName
LIKE
'%i%'
AND
ugroupID
IN
(SELECT
ggroupID
FROM
Groups
g
WHERE
ggroupLabel
=
'Executive')
这条语句涉及3个表的联接,并且包括了许多搜索条件比如大小比较,Like匹配等。在没有索引的情况下Mysql需要执行的扫描行数是77721876行。而我们通过在companyID和groupLabel两个字段上加上索引之后,扫描的行数只需要134行。在Mysql中可以通过Explain
Select来查看扫描次数。可以看出来在这种联表和复杂搜索条件的情况下,索引带来的性能提升远比它所占据的磁盘空间要重要得多。
那么索引是如何实现的呢?大多数DB厂商实现索引都是基于一种数据结构——B树。因为B树的特点就是适合在磁盘等直接存储设备上组织动态查找表。B树的定义是这样的:一棵m(m>=3)阶的B树是满足下列条件的m叉树:
1、每个结点包括如下作用域(j,
p0,
k1,
p1,
k2,
p2,

ki,
pi)
其中j是关键字个数,p是孩子指针
2、所有叶子结点在同一层上,层数等于树高h
3、每个非根结点包含的关键字个数满足[m/2-1]<=j<=m-1
4、若树非空,则根至少有1个关键字,若根非叶子,则至少有2棵子树,至多有m棵子树
看一个B树的例子,针对26个英文字母的B树可以这样构造:
可以看到在这棵B树搜索英文字母复杂度只为o(m),在数据量比较大的情况下,这样的结构可以大大增加查询速度。然而有另外一种数据结构查询的虚度比B树更快——散列表。Hash表的定义是这样的:设所有可能出现的关键字集合为u,实际发生存储的关键字记为k,而|k|比|u|小很多。散列方法是通过散列函数h将u映射到表T[0,m-1]的下标上,这样u中的关键字为变量,以h为函数运算结果即为相应结点的存储地址。从而达到可以在o(1)的时间内完成查找。
然而散列表有一个缺陷,那就是散列冲突,即两个关键字通过散列函数计算出了相同的结果。设m和n分别表示散列表的长度和填满的结点数,n/m为散列表的填装因子,因子越大,表示散列冲突的机会越大。
因为有这样的缺陷,所以数据库不会使用散列表来做为索引的默认实现,Mysql宣称会根据执行查询格式尝试将基于磁盘的B树索引转变为和合适的散列索引以追求进一步提高搜索速度。我想其它数据库厂商也会有类似的策略,毕竟在数据库战场上,搜索速度和管理安全一样是非常重要的竞争点。

如果是要在绑定的时候设置Label的值,那么就在DataBound事件下面加此代码:
在ItemDataBound中取
protected void DataList1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (eItemItemType == ListItemTypeAlternatingItem || eItemItemType == ListItemTypeItem)
{
string sValue = ((Label)eItemFindControl("lable1"))Text;
}
}
如果是需要对DataList中的数据进行更改,或从中取得值后进行利用,那么就需要在ItemCommand事件中添加了

Label1应该是一个控件数组,label1(0)表示这个组里索引为0的那个label。控件组可以复制一个控件,粘贴时会询问是否创建控件数组。控件数组的好处是可以把一些重复的 *** 作简化。具体的百度去,vb6我也不是很会。

pdSeries 主要设置两个参数,data 和 index,如果不设置 index,则 index 从 0 开始递增。除此之外,还可以设置 dtype。

除了直接设置各个字段,还可以将字典作为参数传入,series 会自动将 key 作为 index,将 value 作为 data。

为了保证数据存取的效率,series 的 index 必须是可哈希的。

series 和字典一样,索引和修改的时间复杂度为 。它有两种索引方式,第一种索引方式与字典相同,但强烈不推荐,会导致各种副作用:

在某些情况下,它会产生歧义:

第二种索引方式是采用 loc 方法,这种写法是推荐的:

注意一个细节:利用 index 做切片时,和 list 或者 array 利用下标切片,不包括末尾元素不同,index 切片是包括 end 元素的。
除了利用 index 切片,Series 也可以用下标切片,此时不包括终点下标对应的元素,表现和 python 惯例一致:

不像字典的 key 是唯一的,Series 支持 index 包含重复元素。但对 Series 做切片时,如果重复的 index 不是相邻的,则会报错:"Cannot get left\right slice bound for non-unique label: 'xxx' "。

因此强烈建议先对 index 排序,这样可以保证切片能够一直能正确运行,并且还能提高索引的效率。

和 numpy 一样,Series 也支持高级索引:

两个 Series 可以相加,只有相同 label 的数据会相加,只存在于其中一个 Series 的数据相加后为 NaN,但也可以指定一方缺失的 label 对应的默认值:

需要注意的是,在 *** 作过程中, series value 的数据类型可能会隐式地被改变,如果不注意,很有可能影响增删的效率,甚至产生错误的结果。

影响效率的例子:

产生错误结果的例子:

DataFrame 还支持广播功能:

可以将 DataFrame 保存为 csv 文件或 json 文件

包括一系列函数:

pdescribe() 默认只显示数字列,但也可以设置参数 include='all' 现实所有列。
ploc['sonia'] 展示 sonia 行
ploc['sonia', 'age'] 只显示 sonia 的年龄

筛选出女性条目:

增加年龄筛选条件:

DataFramemean() 可以按列计算平均值

几种不建议的写法:

pdrop(columns=['mean', ], inplace=True) 用于删除一列或多列, inplace 作用是,设置是否修改原来的 p,如果True,返回 None,原 p 被修改,如果 False,返回被修改后的 DataFrame,同时原 p 保留。

DataFrame 支持所有 numpy 的函数,numpy 函数可以直接施加在 DataFrame 上,例如:

但是,如果需要用到 DataFrame 的 label 对齐特性,例如两个 index 顺序并不相同的 DataFrame 相加,那么 numpy 的函数将直接计算中间的 values,而不会考虑它们 label 对齐的问题。(该问题已经在 pandas 025 中被修正)

运算中设置 fill_value 可以让表中缺失的数据被 fill_value 代替。

当一个 Series 和一个 DataFrame 相加时,pandas 会默认 Series 是一行,并把它广播到其它行。Series 的 index 会被对应到 DataFrame 的列上,并对齐。如果 Series 的 index 与 DataFrame 的列没关系,那么会扩增 DataFrame,扩增区域对应的数据为 NaN。如果想让 Series 的 index 和 DataFrame 的index 对应,则需要指定 axis=0:

在构建 pandas Series 或者 DataFrame 时,有两种方式可以表示 NaN,一种是 npNaN ,另一种是python 的 None 对象。 npNaN 的数据类型是 float ,因此,在 pandas 中,存在 NaN 的对象要么是 float64 的,要么是 object 类型。

pandas 利用如下方法处理缺失数据:

MultiIndex 适用于数组大于二维的情况。所有可以用 Index 的地方,都可以用 MultiIndex 。
MultiIndex Series

MultiIndex DataFrame 利用 from_product 可以方便地创建 MultiIndex。

MultiIndex DataFrame 的索引十分方便

元组配合 slice ,为 MultiIndex DataFrame 做切片:

concat 用于将两个表拼接起来,它适用于两个表有相同的 index 或者有相同的 columns。

concat 也适用于拼接 Series,但是不论是 DataFrame 还是 Series,它不会检查各行的 index 是否重复。

一个解决方案是设置 verify_integrity 参数,它会在遇到两个相同 index 的时候报错。但是这无疑会导致额外的计算,因此除非确实必要,一般不设置它。

设置拼接参数

merge 适用于两个表某 相同,然后所有的融合都基于该列:

merge 默认采取 inner join 的策略,如果以某列为基准,那么最终结果中,只有同时出现在这两列中的数据被保留。
总共有三种merge 的方式:

merge 可以设置 on= 或者 left_on= 、 right_on= 显式指定基准列

当两表中的基准列元素不完全一致时,通过设置 how 有四种 merge 策略:

groupby 按照某个指标聚类,分别计算各类数据

groupby 返回值的属性:

groupby 方法分发。 groupby 返回的对象如果没有实现某个 DataFrame的方法,该对象仍然可以调用,只不过是遍历每个类别,分别调用。

groupby()agg 方法:agg 中以 list/dict 形式传入函数名(或名字的字符串),计算每个组的统计量。

groupby()filter() filter 内传入筛选条件,可以是 lambda 表达式

groupby()transform() transform 内传入变换函数,如 lambda 表达式,变换函数将施加在每个子 group 上,一个经典用例是用它来对每个 group 内部中心化,或者用group 均值代替其中的 NaN。

以 titanic 的例子,我们希望得到这样的表格:有三行,每行代表一个舱位级别;有两列,每列代表一个性别。此时需要用到 pivot_table 。 pivot_table 相当于把 groupby 的结果表示为二维表格。

numpy 和 pandas 可以很好地处理各种格式的时间字符串,将其转化为标准格式。同时提供了一系列方法,对时间序列求区间、采样等等。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13329409.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-16
下一篇 2023-07-16

发表评论

登录后才能评论

评论列表(0条)

保存