python数据分析学习笔记

转自(http://blog.csdn.net/h_jlwg6688/article/details/53932727)
//2016/12/29
1、Python读取txt文件中一行的方式:
open(path).readline()
2、python的列表推导式:
json.loads(line) for line in open(path)
3、u’America/New_York前面的u表示Unicode字符串编码格式。
4、列表推导式中添加判断语句:
time_zones = [rec[‘tz’] for rec in records if ‘tz’ in rec]
5、python里的两种字典:
简单的字典:counts={}
高效的字典:counts=defaultdict(int) #所有值均会被初始化为0
6、python的切片之一:
food=’apple pie’
food[-3:0] 会输出空字符
food[-3:] 则输出‘pie’
7、字典的默认排序顺序:
value_key_pairs是一个字典,则value_key_pairs.sort()是按照从小到大顺序排序的。
8、高级一点的排序(省事儿点的标准库):
使用标准库中的collections.Counter类
//2017/1/3
1、DataFrame是pandas中最重要的数据结构,它用于将数据表示为一个表格。
frame[‘tz’].value_count()函数将tz列按照降序排列。
2、fillna函数可以替换缺失值:
frame[‘tz’].fillna(‘Missing’)函数将NA值替换为Missing。
3、value_counts()函数返回的对象可以调用plot进行显示:
首先:plt.figure(figsize=(10, 4))
然后:tz_counts[:10].plot(‘barh’,rot=0)
最后:plt.show()
4、dropna()函数可以去掉包含有NA值得item
比如:x.split()[0] for x in frame.a.dropna()就是提取frame表格里列表为a的那一列,去除掉NA值得那些行的值,并用split进行分割,并且最后保存分割后的第一个值。
5、notnull()函数可以找到item中非空值得索引
6、初见np的强大:
np.where(cframe[‘a’].str.contains(‘Windows’), ‘Windows’,’Not Windows’)
这条语句首先调用了contains()函数,它用来判断cframe的‘a’列,每一行的值中是否有’Windows’字符串,若有则该行为true,若无则改行对应值为false,而np.where()函数的作用就是将位置为true的地方赋值为’Windows’而值为‘false’的对应位置赋值为‘Not Windows’
//2017-01-19
1、pandas里的argsort函数:
values = np.array([5, 0, 1, 3, 2]),indexer = values.argsort(),则indexer=array([1, 2, 4, 3, 0])
2、DataFrame类型可以使用take函数通过使用指定的索引顺序对自身进行排序:
agg_counts.take(indexer),其中indexer就是(1)中得到的indexer
3、使用plot生成堆积条形图:
count_subset.plot(kind=’barh’,stacked=TRUE)
4、DATAFrame可以使用div除法函数:
count_subset.dive(count_subset.sum(1),axis=0)
5、pandas的read_table函数将数据读到DataFrame里:
pandas.read_table(‘文件路径’,sep=’分隔符’,header=None,names=DataFrame的各个列名称)
6、使用pandas将几个DataFrame合并到一起:
pd.merge(DataFrame1,DataFrame2)
7、使用pivot_table将DataFrame进行聚合操作,也就是将其改造成以指定名称为行,指定名称为列的表格(DataFrame):
data.pivot_table(‘rating’,index=’title’,columns=’gender’,aggfunc=’mean’),这个函数种rating就是对电影的评分,index就是行名称,即电影名称,列名称就是性别,而aggfunc是施加在rating上的函数,即取平均,这个函数的作用就是对每个电影,分别求男性及女性对这部电影的平均评分。
8、如何对DataFrame进行分组:
data.groupby(‘title’)即按照电影名称title给DataFrame类型的data进行分组,而data.groupby(‘title’).size()产生了Series对象,包含了分组后,每组的大小。
9、利用bool值为索引在Series对象里选取索引为True的行:
ratings_by_title.index[ratings_by_title >= 250]
10、利用行的取值,在DataFrame里选取行值为指定值的数据组成新的DataFrame:
mean_ratings.ix[active_titles]
11、对DataFrame按照某一列进行排序(这里用降序举例):
mean_ratings.sort_index(by=’F’,ascending=False),这里就是按照性别F(女性)列进行降序(ascending=false)排序
12、如何给已有的DataFrame添加新的列:
mean_ratings[‘diff’]=mean_ratings[‘M’]-mean_ratings[‘F’],即可为mean_ratings添加新的列:diff
13、如何对以按某列排序的DataFrame求反序:
sorted_by_diff[::-1][15:],其中[::-1]就是求反序
14、对DataFrame分组,并对每组求方差,得到的是Series对象:
data.groupby(‘title’)[‘rating’].std()
15、对Series对象进行排序:
rating_std_by_title.order(ascending=False),这里是降序
16、DataFrame的head和tail操作,分别是获得表头的前几行值和表尾的后几行值
17、np.allclose函数用来检查某个表达式的值是否近似等于某个数值:
np.allclose(names.goupby([‘year’,’sex’].prop.sum(),1)
//2017/120
1、利用plot在一个figure上画多个子图的方法:
subset.plot(subplots=True, figsize=(12,10),grid=False, title=”Nember of births per year”)
2、对一个排序的Series对象,怎样找到某个值应该所处的位置:
in1900.searchsorted(0.5),就是把0.5插入到排序的Series对象in1900该插入的位置
3、如何对已有的DataFrame操作,选取其指定列名的某些列值:
table.reindex(columns=[1910,1960,2010],level=’year’),其中列名为year,列值从1880到2020,利用reindex值取出DataFrame里的列名为year,列值为1910、1960及2010列值对应的数据
4、如何获取DataFrame里列名对应列值里无重复值:
top1000.name.unique()
5、判断某个数组里的值存在于DataFrame的某个列名对应的列值里,并得到其索引:
top1000.name.isin(lesley_like)
6、在plot画figure时候,选择不同的线型:
table.plot(style={‘M’:’k-‘,’F’:’k–’})
7、可以通过使用ndarray的astype方法显示地转换其dtype
8、ndarray的副本及视图:
对于切片arr[5:8],它是ndarray的视图,返回的是相当于C/C++里的做操作数,对视图的任何操作都是对原始ndarray的操作,而arr[5:8].copy()则是ndarray切片的副本,对该副本进行操作不会影响原ndarray。
9、np的randn生成的是符合正态分布的随机数
//2017/1/21
1、ndarray的索引器:
np.ix_函数可以将两个一维整数数组转换为一个用于选取方形区域的索引器
2、花式索引跟切片的区别:
花式索引总是将数据复制到新数组中
3、ndarray的矩阵相乘运算函数:
np.dot(arr.T,arr),其中arr.T是转秩运算。
4、ndarray的transpose函数的轴编号转置操作:
array里的所有元素 也要按照这个规则重新组成新矩阵,用法arr.transpose((1,0,2))
5、swapaxes功能同transpose,只不过用法如下:
arr.swapaxes(1,2)
6、ndarray的meshgrid函数:
np.mashgrid函数接受两个一维数组,并产生两个二维矩阵(对应于两个数组中所有的(x,y)对)
7、ndarray的where函数,将条件逻辑表述为数组运算:
用法:np.where(cond,xarr,yarr),其中cond是布尔值的数组,若cond中的某个值为true则选取xarr中对应位置的值,若cond中某个位置为false则选取yarr中对应位置的值。
8、基本数组统计方法里的两种:
cumsum:所有元素的累计和,具体就是源矩阵中每个元素都变为前与前几项的累计和。
cumprob:所有元素的累计积,具体就是源矩阵中每个元素都变为与前几项的累计积。
9、ndarray的排序函数:sort,可以给sort提供轴编号,在对应轴上排序,其中sort默认的轴编号是-1,0编号对应列,1编号对应行。
10、np加载txt文件的方法,以及选用分隔符:
np.loadtxt(‘array_ex.txt’,delimiter=’,’)
11、np些人txt文件中,并且也可以指定分隔符
//2017/1/22
1、Series是什么样的?
它是一种类似于一维数组的对象,只不过它还保存着每个元素的索引。并且我们还可以手动为每个元素指定索引。
2、使用‘键值’ in obj2的方式查看键是否在Series里
3、可以使用字典对Series赋值
4、若用未知的键去访问Series,因为Series里没有该键,则该键对应的值为NAN,表示缺失值,而pd.isnull()及pd.notnull()判断是否是缺失值
5、Series对象可以相加,因为它们可以自动对齐。
6、可以对Series对象及对象的索引index起个名字,用于标记不同的对象及索引
7、对于一个Pandas对象frame2,使用frame2[‘state’]或frame2.year可以分别获取state列或year的列值,它们都是Series对象,而frame2.ix[‘three’]则是获取three对应的行值,并且也是Series对象。
8、对于嵌套字典,将其传给DataFrame对象,则它将被解释为:外层字典的键作为列,内层键则作为行索引
9、DataFrame的drop删除某一行或者某一列的方法:
data.drop(‘c’)删除c行,data.drop(‘two’,axis=1)删除two列。
10、DataFrame的切片索引是获取某些行的值,同ix操作:
data[:2],得到的是0、1两行的值
11、DataFrame的ix的扩展操作:
data.ix[‘colorado’,[‘two’,’three’]],选取colorado行,two、three列的值
12、什么叫做广播:
arr-arr[0],则arr二维数组的所有行都减去了arr[0]行的值。
13、DataFrame和Series之间可以使用12中提到的广播。
14,、默认的广播是行广播,可以使用算术运算方法进行列的广播:
frame.sub(series3,axis=0)
15、Numpy的ufuncs可以用于操作pandas对象:
np.abs(frame)操作于DataFrame对象frame的每个元素上
frame.apply(f)则是作用于DataFrame的行或者列上
16、元素及的applymap函数也可以用于DataFrame的元素级,因为Series有个应用于元素及函数的map方法:
frame[‘e’].map(format)
17、DataFrame的sort_index函数对索引排序(不是对值排序,而是对索引排序),Series也是按照索引排序
18、Series对象的order()函数是对值进行排序
19、DataFrame按照值进行排序的方法:
frame.sort_index(by=’b’),对DataFrame对象frame按照其列索引b对frame对象进行排序。
20、DataFrame的排名:
average、min、max、first
//2017/2/28
两个列表:a=[1,2,3];b=[4,5,6],a.append(b)等于[1,2,3,[4,5,6]],而a.extend(b)则等于[1,2,3,4,5,6]
//2017/3/1
1、Series对象的索引值可能不唯一,比如Series对象obj,那么obj.index.is_unique属性就是False,而要选取该重复的索引所对应的值得时候就会返回一个Series,同理DataFrame对象的索引有重复,则对DataFrame对象的行进行索引返回的是个DataFrame对象。
2、层次化索引:可以将一个DataFrame对象调用七其stack方法,转换成一个multiindx的Series对象,也可以对含有multiindx的Series对象调用unstack方法,将其转换为一个DataFrame对象。
//2017/3/2
1、frame是个DataFrame对象,并且是个multiindx,调用swaplevel(‘key1’,’key2’)方法则交换两级index的级别。
2、对于multiindx的frame,可以使用sortlevel(0)、sortlevel(1)方法分别根据第一级别,第二级别对数据进行排序。
3、multiindx即层次化索引,假定两级的行索引:
a 1
a 2
b 1
b 2
其中a、b是一级索引,1、2是二级索引,可以分别对各个级别进行统计运算:frame.sum(level=’key2’)
4、可以将DataFrame对象的一个或多个列当做行索引来用:set_index([‘c’,’d’])这里将列索引c、d当做行索引,其中c是一级索引,d是二级索引
5、同set_index方法相反,reset_index方法将层次化索引移到列中去。
6、数据加载、存储与文件格式:
read_csv 从文件、URL、文件型对象中加载带分隔符的数据。默认分隔符为逗号。
read_table 从文件、URL、文件型对象中加载带分隔符的数据。默认分隔符为制表符(“t”)
read_fwf 读取定宽列格式数据(也就说没有分隔符)
read_clipboard 读取剪贴板中的数据,可以看做read_table的剪贴板。在将网页转换为表格时很有用。
7、用read_csv读取一个文件,并添加标题行,将某列作为索引:pd.read_csv(‘ch06/ex2.csv’,names=names,index_col=’message’),这里names=[‘a’,’b’,’c’,’d’,’message’]是手动添加的标题,index_col=’message’就是将标题message列作为行索引。也可以创建层次化索引。
8、可以写正则表达式来作为read_table的分隔符:read_table(‘ch06/ex3.txt’,sep=’\s+’)并且如果列名的个数比行数少1,那么自动将第一列作为行索引。
9、可以使用skiprows跳过文件中的某些行:read_csv(‘ch6/ex4.csv’,skiprows=[0,2,3]):跳过0、2、3行。
10、read_csv将文件中缺失值默认填充为NAN,可以使用isnull函数判断读取的DataFrame中哪些是NaN值。
11、如果只想读取文件中的前几行:pd.read_csv(‘file’,nrows=5):读取文件file的前5行
12、逐块读取文件:pd.read_csv(‘file’,chunksize=1000),每次读取1000行,并且可以根据chunksize对文件进行逐块迭代,从而遍历整个文件。
13、将数据输出为分隔符格式的文本:data.to_csv(‘file’),并且可以使用其它分隔符:data.to_csv(‘file’,sep=’|’),缺失值默认会被表示为空字符串,也可以将其表示为别的值:data.to_csv(‘file’,na_rep=’NULL’):将缺失值写成字符串null保存到文本中。
14、可以只写出一部分的列,并按指定顺序排列:data.to_csv(‘file’,index=False,cols=[‘a’,’b’,’c’]):不写行标签,并且只选取a、b、c三列,并按照abc顺序排列写到文件file中。
15、DataFrame有个date_range方法:pd.date_range(‘1/1/2000’,periods=7)可以生成2000-01-01 00:00:00 2000-01-02 00:00:00 …2000-01-07 00:00:00的时间数据
16、可以使用Series.from_csv的方法将文件读取到Series对象中,并且parse_dates=True用于控制解析值为日期。
17、通过json.loads可以将json字符串转换成Python形式,而json.dumps将Python对象转换成json格式。
18、读取html、xml:parsed=parse(urlopen(‘http://finance.yahoo.com‘)); doc = parsed.getroot(),这里通过doc这个对象就可以获取特定类型的所有html标签,比如html中的链接是a标签,则links=doc.findall(‘.//a’)(这里findall是文档根节点的方法)就是HTML元素的对象(不是rul和链接文本),若要得到URL和链接文本需要使用各对象的get方法和text_content方法。
19、pandas自带的自动类型转换类:TextParser
20、用于解析XML的接口:lxml.objectify:parsed=objectify.parse(open(path));root=parsed.getroot()
//2017/03/03
1、pandas的二进制存储是使用pickle序列化,具体方法是save方法,读取二进制的方法是load方法。
2、Python中HDF5的两个接口:pytables和h5py
3、pandas有一个类似于字典的hdfstore类,通过pytables存储pandas对象:store=pd.HDFStore(‘mydata.h5’);store[‘obj1’]=frame(键obj1的值是个frame);store[‘obj1_col’]=frame[‘a’](键obj1_col的值是个Series)。
4、pandas的ExcelFile类支持读取Excel2003及以上版本的表格型数据。
5、Python有sqlite3驱动器,支持sqlite数据库。
6、NoSQL数据库里的基于文档的形式:MongoDB的使用:x现在电脑上启动一个mongodb的实例,直接import pymongo;连接:con=pymongo.connection(‘localhost’,port=27017);
7、合并数据集使用pandas.merge方法:比如frame1和frame2,frame1有data1和key两列,frame2有data2和key两列,而pd.merge(frame1,frame2),自动使用key列中相同的值进行连接,那些不是共有的key列中的值将被去掉,可以显式的指定使用哪个列进行连接:pd.merge(frame1,frame2,on=’key’),如果要连接两个frame中不同的两列,则:pd.merge(frame1,frame2,left_on=’lkey’,right_on=’rkey’),因为merge默认的是inner连接,取得是两个frame的连接的列的交集,可以通过pd.merge(frame1,frame2,how=’left、right、outer’)来设置left、right、outer连接。
8、若frame1和frame2有多个相同的列,并且要使用这几个相同的列进行合并:pd.merge(frame1,frame2,on=[‘key1’,’key2’],how=’outer’)。对于两个frame中相同的列(但是这个相同的列没有作为键),合并这两个frame:pd.merge(frame1,frame2,on=’key1’,suffixes=(‘_left’,’_right’)),这样就把那个没有当做键的相同的列加上了不同的后缀,以表明这个列属于哪个frame。
9、如果要连接两个frame的索引而不是列,或者连接一个frame的索引一个frame的列,:pd.merge(frame1,frame2,left_on=’key’,right_index=True,how=’outer’)即连接frame1的列key和frame2的索引。
10、DataFrame的join方法,它能更方便的实现按索引合并:frame2.join(frame1,how=’outer’),它还支持参数DataFrame的索引跟调用者DataFrame的某个列之间的连接:frame1.join(frame2,on=’key’)。
11、join和可以实现索引合并:向join传入一组DataFrame就可以:frame1.join([frame2,frame3])
12、pandas的concat函数也可以实现合并:假设有三个没有重叠索引的Series对象s1、s2、s3,则pd.concat([s1,s2,s3])(默认axis=0)将得到一个新的Series对象,而如果设置axis=1则得到一个DataFrame。
13、对于索引全部或者部分重叠的两个数据集,要合并它们可以使用:np.where()及Series的combine_first方法,并且对于DataFrame,combine_first也会在列上做同样的事情,可以将其看做:用参数对象中的数据为调用者对象的缺失数据“打补丁”。
14、重塑层次化索引:stack-将数据的列“旋转”为行,unstack-将数据的行“旋转”为列。默认情况,unstack操作的是最内层,若要对其它层进行unstack操作只要传入层级编号或者名称即可。
//2017/3/6
1、将“长格式”旋转为“宽格式”:pivoted=ldata.pivot(‘data’,’item’,’value’),其中data、item两列分别用作行和列索引,即用data列中的不同的值作为行索引,item列中的不同的值作为列索引,而value列的值用于填充行列索引所对应位置的值。
2、假如有两个需要参与重塑的数据列,即:data item value value2四列,而value、value2是要重塑的列,则 pivoted=ldata.pivot(‘data’,’item’),这里忽略了最后一个参数,得到的pivoted DataFrame对象就会带有层次化的列。
3、DataFrame的duplicated方法返回一个布尔型Series对象,表示各行是否是重复行。而drop_duplicates方法返回一个移除了重复行的DataFrame。可以传入列名作为参数,从而可以根据指定列进行重复行的判断及移除。还可以传入take_last参数来选定重复行的第一行还是重复行的最后一行。
4、Series的map方法可以接受一个函数或者含有映射关系的自典型对象,用法:data[‘animal’] = data[‘food’].map(str.lower).map(meat_to_animal),其中map(str.lower)是将food列的值都映射为小写,meat_to_animal是个字典,这个表达式最终将food列的值跟动物映射起来。
5、Series对象有个replace方法,用于将Series里的某些值替换为其它值。
6、DataFrame对象有个rename方法,可以实现对轴标签的换名改变。
7、pandas的cut函数可以将连续数据离散化或拆分为“面元”,比如将一组年龄划分为不同的年龄组,由cut函数返回的是一个Categorical对象,它有labels、levels属性以及value_counts()方法。其中可以手动设置labels,也可以不指定具体怎么划分,而是指定划分的分组数目。
8、pandas的qcut函数可以根据分位数对数据进行划分。
9、假设data是1000x4服从正态分布的DataFrame,col=data[3],而col[np.abs(col)>3]就可以找出第四列中绝对值大小超过3的值,而data[(np.abs(data)>3).any(1)]则选出全部含有“超过3或-3的值”的行。
10、np.sign(data)可以得到data中各个值得符号。
11、将分类变量转换为哑变量矩阵或指标矩阵,pandas的get_dummies函数可以实现该功能,具体就是:对于‘key’列,有多个不同的值,则可以使用这几个不同的值当做列索引,其对应的值为0或者1。另:连接Series和DataFrame可以用:df[[‘data1’]].join(dummies)。其中df和dummies是两个DataFrame。
12、以自定义的方式连接字符串列表里的字符串:‘::’.join(pieces),这里pieces是个字符串列表,用::将字符串连接起来。
13、查找一个字符串是否在字符串列表里可以使用in,index(),find(),count()。
14、描述一个或多个空白符的regex是 \s+。
15、findall方法可以得到匹配指定regex的所有模式。
16、假设DataFrame对象db有多个列(key),DataFrame(db,columns=info_keys)则可以只选取info_keys那些指定的列组成新的DataFrame。
17、通过value_counts可以查看指定列中各个值出现的次数。
//2017/3/14
1、plt.xlim()函数返回当前的X轴绘图范围。而plt.xlim([0,10])则会将X轴的范围设置为0到10.
2、改变X轴的刻度:ax.set_xticks()告诉matplotlib要将刻度放在数据范围中的哪些位置,默认情况下这些位置也就是刻度标签,但是可以通过ax.set_xticklabels()将任何其它的值用作标签。
3、为ax设置标题:ax.set_titel(),为x轴设置名称:ax.set_xlabel()。
4、图例是另一种用于标识图标元素的重要工具,方法:ax.plot(randn(1000).cumsum(),’k–’,label=’one’),即为plot添加参数label,给label设置不同的值,就是增添多个图例。
5、给图标添加注解:ax.text(x,y,’Hello world!’,family=’monospace’,fontsize=10).
6、要在图表中添加一个图形,需要创建一个块对象shp,然后通过ax.add_patch(shp)将其添加到subplot中。
7、利用plt.savefig(‘figpath.svg’)可以将当前图表保存到文件,并且可以通过传入参数dpi=400,bbox_inches=’tight’控制每英寸点数-分辨率及控制当前图表周围的空白部分的大小。
8、利用python编程方式即rc方法配置matplotlib:比如将全局的图像默认大小设置为10x10:plt.rc(‘figure’,figsize=(10,10)),其中第一个参数可以是figure,axes,xtick,ytick,grid,legend、font等。
9、Series和DataFrame对象都有一个用于生成各类图表的plot方法。
10、DataFrame的plot方法会在一个subplot种为各列绘制一条线,并自动创建图例。
11、如何生成柱状图:在生成线型图的代码中加上kind=’bar’生成垂直柱状图,而kind=’barh’生成水平柱状图。
12、利用Series的hist方法可以生成直方图。调用plot时加上kind=‘kde’即可生成一张密度图。
13、matplotlib的scatter方法是绘制散布图的主要方法。pandas提供了一个能从DataFrame创建散布图矩阵的scatter_matrix函数,它还支持在对角线上放置各变量的直方图或密度图。
//2017/3/15
1、分组聚合操作:分组运算的第一个阶段,是在pandas对象(Series、DataFrame)上的键上进行拆分,对于DataFrame可以在行(axis=0)或列(axis=1)轴上进行,然后将一个函数应用(apply)到各个分组并产生一个新值,最后这些函数的执行结果会被合并到最终的结果对象中。
2、分组聚合的简单例子:grouped=df[‘data1’].groupby(df[‘key1’]),其中key1列有多个a、b值,而data1是任意值,这个操作就是根据key1里的a、b值将data1里的值进行分组:a组和b组,其中grouped是一个GroupBy对象。而grouped.mean()就是计算a组中data1列的平均值和b组中data1列的平均值。并且grouped.mean()得到的是个Series对象,其索引为a和b,而索引的名称还叫key1.
3、对于2,如果df还有个key2列,其中key2列有多个one和two,那么如果一次向groupby中传入多个数组:means=df[‘data1’].groupby([df[‘key1’],df[‘key2’]]).mean(),则将会得到一个层次化索引,a和b作为最外层索引,one和two作为内层索引。
4、对于2,可以自己制定一个分组建:states=np.array([2005,2005,2006,2005,2006])数组,并且数组的长度与df的行数相等,那么df也可以根据states数组进行分组。
5、对于2,更简单的,直接可以向groupby传入df的列名,从而根据列名里的值对df进行分组。
6、对分组进行迭代:GroupBy对象支持迭代,比如:for name,group in df.groupby(‘key1’),则会打印name=a及group=(key1=a的df里的所有数据);name=b及group=(key1=b的df里的所有数据)。
7、对于6,对于多重键的情况,元组的第一个元素将会是由键值组成的元组:for (k1,k2),group in df.groupby([‘key1’,’key2’]),则k1,k2分别是a one, a two,b one b two。
8、df.dtypes可以得到df中每列的数据类型。
9、groupby默认是在axis=0轴上分组的,可以向groupby传入参数axis=1从而对列进行分组。
10、通过字典进行分组:建立字典:mapping={‘a’:’red’,’b’:’red’,’c’:’blue’,’d’:’blue’,’e’:’red’,’f’:’orange’},只需要将字典传递给groupby:by_column=df.groupby(mapping,axis=1)得到列名为blue、red、orange的按照列进行的分组。
11、可以按照Series对象进行分组:同10.
12、通过函数进行分组:people.groupby(len).sum(),这里people是个DataFrame对象,其索引值为一些人的名字,传入groupby的参数为len函数,这个len函数计算的是索引(人名)的长度,从而people根据人名长度进行分组。
13、根据索引级别分组:首先创建层级化索引的简单方法:columns=pd.MultiIndex.from_arrays([[‘US’,’US’,’US’,’JP’,’JP’],[1,3,5,1,3]],names=[‘cty’,’tenor’]),其中最上层列索引为US和JP,内层列索引为1、3、5、1、3,名称分别是cty和tenor。而hier_df.groupby(level=’cty’,axis=1).count()就可以根据列索引,索引水平是cty进行分组。
14、如何使用自己的聚合函数:首先定义自己的函数:def peak_to_peak(arr):,然后grouped.agg(peak_to_peak)即可,如果想传入一组函数或函数名则:grouped_pct.agg([‘mean’,’std’,peak_to_peak])即可,并且列名既是mean、std、peak_to_peak,如果想给列改成别的名字可以:grouped.agg([(‘foo’,’mean’),(‘bar’,np.std)])。
15、对不同的列应用不同的函数:functions=[‘count’,’mean’,’max’],result=grouped[‘tip_pct’,’total_bill’].agg(functions)。其中tip_pct和total_bill是DataFrame里的两列,得到的结果是个层次化列,最外层列名师tip_pct和total_bill,内层列名是函数名。
//2017/3/16
1、分组级运算和转换:people.groupby(key).transform(np.mean),其中np.mean被应用到people中按key分组的每一组上,并且np.mean可以替换为自己定义的函数。
2、同1,也可以使用apply函数:tips.groupby(‘smoker’).apply(top),其中top是自定义函数,还可以向apply传入top函数的参数:tips.groupby([‘smoker’,’day’]).apply(top,n=1,column=’total_bill’),其中n和column是top 的参数。
3、默认情况下分组键与原始对象的索引共同构成结果对象中的层次化索引,可以通过设置grop_keys=False传入groupby禁止该效果即去掉分组键作为索引。
4、分位数和桶分析:factor=pd.cut(frame.data1,4);grouped=frame.data2.groupby(factor); grouped.apply(get_stats);其中get_stats是自定义函数。qcut则会根据样本分位数得到大小相等的桶。cut得到的是长度相等的桶意思是区间大小相等,而qcut得到大小相等的桶指的是数据点数量相等。
5、对于一个Series对象s,s[::2]可以选取s中偶数行,进行操作。
6、lambda表达式:fill_func=lambda g: g.fillna(fill_values[g.name]),其中fill_values是个字典,键值是g.name,作用就是将g中值为NaN的值,改为fill_values中键对应的值。
7、从一个数据集中随机选取k个元素的方法:np.random.permutation(N)[:k],其中N是数据集的大小,K是期望的样本大小。
8、透视表:tips.pivot_table(rows=[‘sex’,’smoker’]),结果是按照sex和smoker分组,并计算每组的均值(pivot_table默认的聚合类型是计算均值)。
9、tips.pivot_table([‘tip_pct’,’size’],rows=[‘sex’,’day’],cols=’smoker’):这个操作只聚合tip_pct和size,并根据sex和day进行分组,并且将smoker放到列上,把day放到行上。还可以向pivot_table添加参数:margins=True(分项小计),这会添加标签为All的行和列,其值对应于单个等级中所有数据的分组统计。
10、若想在pivot_table中使用其它的聚合函数则向pivot_table传入参数aggfunc=参数就可以比如:aggfunc=len。还可以传入参数fill_value填充结果表中的缺失值。
11、交叉表是一种用于计算分组频率的特殊透视表。
//2017/3/17
1、Python标准库包含用于日期和时间数据的数据类型:datetime.datetime。datetime.timedelta返回两个datetime对象之间的时间差。
2、str和strftime可以将datetime转为字符串格式:stamp=datetime(2011,1,3); str(stamp); stamp.strftime(‘%Y-%m-%d’)。
3、dateutil第三方包里的parser.parse方法可以解析几乎所有人类能够理解的日期表示形式。用法举例:parse(‘6/12/2011’),国际通用格式中日通常出现在月的前面,传入dayfirst=True参数即可解决这个问题。
4、pandas通常用于处理成组日期,利用其to_datetime方法可以解析多种不同的日期表示形式。
5、pandas最基本的时间序列类型就是以时间戳为索引的Series。当创建一个带有DatetimeIndex的Series时,pandas就会知道该对象是一个时间序列:TimeSeries。
6、创建一个从指定日期开始,1000天(1000个index)的TI’mSeries:longer_ts = Series(np.random.randn(1000),index=pd.date_range(‘1/1/2000’,periods=1000)),并且还可以方便的对这个TI’mSeries进行切片:longer_ts[2001]得到的是365天的数据,longer_ts[‘2001-05’]返回的是31天的数据。
7、可以向TI’mSeries对象传入两个时间戳从而对其进行切片:ts[‘1/6/2011’:’1/11/2011’],也可以通过这种方式:ts.truncate(after=’1/9/2011’)。
8、还可以使用如下方式产生Series的时间索引:dates=pd.DatetimeIndex([‘1/1/2000’,’1/2/2000’,’1/2/2000’,’1/2/2000’,’1/3/2000’]),注意这里dates的时间戳有重复。
9、可以利用TI’mSeries的resample方法,对不连续的时间序列进行转换(比如转换为一个具有固定频率-每日)的时间序列:ts.resample(‘D’)。
10、可以向date_range传入freq参数:比如freq=BM,这样就可以生成一个由每月最后一个工作日组成的日期索引。
11、如果date_range的起始或结束日期带有时间信息,那么生成的时间序列也会包含相同的时间信息,如果想要规范化这个时间信息,可以向date_range传入normalize=True的参数,这样生成的时间序列的时间都会被设为0。
12、date_range有基础频率比如:M每月,H每小时,可以通过写成2M,3H改变频率。WOM可以获得诸如“每月第3个星期五”之类的日期:freq=’WOM-3FRI’。
13、可以利用ts的shift方法移动时间序列里的数据(时间索引不变):ts.shift(2),即将时间序列中的数据依次向下移动:第一行的数据设置为NaN,第二行的数据设置为NaN,第三行的数据为原来的第一行的数据,第四行的数据为原来的第二行的数据。。。,同理ts.shift(-2)是将序列中的数据依次向上移动。
14、如果频率已知,则可以将频率参数传递给shift以便实现对时间戳进行位移而不是对数据进行简单位移。ts.shift(2,freq=’M’).,使时间戳加2个月。
15、pandas的日期偏移量还可以用在datetime或Timestamp对象上,比如now+3*Day(),其中now是个datetime对象,这个表达式就是将now增加了3天。
16、如果添加的是锚点偏移量比如MonthEnd,则第一次增量会将原日期向前滚动到符合频率规则的下一个日期:now+MonthEnd(),如果now=2011,11,17,那么结果将是2011-11-30,如果now+MonthEnd(2)则结果为2011,12,31.
17、通过锚点偏移量的rollforward和rollback方法可显示地将日期向前或向后“滚动”:offset=MonthEnd(),offset.rollforward(now)=2011,-11-30,offset.rollbackward(now)=2011-10-31.
18、pandas包装了pytz的功能,可以通过pytz.common_timezones[]查看时区名,若要从pytz里获取时区对象,使用pytz.timezone(‘时区名’)即可。
19、在创建date_range时间序列对象时,还可以加入参数tz=’UTC’即加入时区信息。
20、可以使用tz_localize()方法将时区转换为本地时区:ts_utc=ts.tz_localize(‘UTC’),一旦时间序列被本地化到某个特定时区,就可以用tz_convert将其转换到别的时区了。
21、如果两个时间序列的时区不同,在将它们合并到一起时,最后结果就会是UTC。由于时间戳其实是以UTC存储的,所以这是一个很简单的运算,并不需要发生任何转换。
//2017/3/30
1、period(时期)类表示的是时间区间、比如数日、数月、数年等:p=pd.Period(2007,freq=’A-DEC’)表示从2007年1月1日到2007年12月31日之间的整段时间,而p+5是将2007变成2012,p-2则将2007变为2005。
2、对于频率相同的两个Period:pd.Period(‘2014’,freq=’A-DEC’) - p = 7,其中p是1中的Perio。
3、period_range函数可以用于创建规则的时期范围:rng=pd.period_range(‘1/1/2000’,’6/30/2000’,freq=’M’),得到的是periodIndex对象。
4、Period和PeriodIndex对象都可以通过其asfreq方法被转换成别的频率:p=pd.Period(‘2007’,freq=’A-DEC’),p.asfreq(‘M’,how=’start’)得到Period(‘2007-01’,’M’)而p.asfreq(‘M’,how=’end’)得到Period(‘2007-12’,’M’)。
5、按季度计算的时期频率:财年末:p=pd.Period(‘2012Q4’,freq=’Q-JAN’):以1月结束的财年中,2012Q4是从11月到1月:Period(‘2011-11-01’,’D’)到Period(‘2012-01-31’,’D’)。
6、对于5中的p,若要获取该季度倒数第二个工作日下午四点的时间戳:p4pm=(p.asfreq(‘B’,’e’)-1).asfreq(‘T’,’s’)+16*60:Period(‘2012-01-30 16:00’,’T’)。
7、period_range可以用于生成季度型范围:rng=pd.period_range(‘2011Q3’,’2012Q4’,freq=’Q-JAN’):2011Q3,2011Q4,2012Q1,2012Q2,2012Q3,2012Q4。
8、将Timestamp转换为Period(及其反向过程):to_period(),时期指的是非重叠时间区间,对于给定的频率,一个时间戳只能属于一个时期,新PeriodIndex的频率默认是从时间戳推断而来的,也可以指定任何别的频率,结果中允许存在重复时期:rng=pd.date_range(‘1/29/2000’,periods=6,freq=’D’); ts2=Series(randn(6),index=rng); ts2.to_period(‘M’):索引为:2000-01 2000-01 2000-01 2000-02 2000-02 2000-02
9、对于8中,要转换为时间戳,使用to_timestamp即可。
10、pandas对象都带有一个resample方法,它是各种频率转换工作的主力函数:rng=pd.date_range(‘1/1/2000’,periods=100,freq=’D’),ts=Series(randn(len(rng)),index=rng),ts.resample(‘M’,how=’mean’),ts.resample(‘M’,how=’mean’,kind=’period’)
11、一个对时间序列下采样的例子:ts.resample(‘5min’,how=’sum’,closed=’left’,label=’left’)。
12、OHLC重采样:就是计算各面元的四个值:open,close,high及low:ts.resample(‘5min’,how=’ohlc’)
13、可以通过groupby进行重采样:ts.groupby(lamba x: x.month).mean();ts.groupby(lamba x: x.weekday).mean()。
14、上采样:frame = DataFrame(np.random.randn(2,4),index=pd.date_range(‘1/1/2000’,periods=2,freq=’W-WED’),columns=[‘Colorado’,’Texas’,’New York’,’Ohio’]),生成的frame的索引为:2000-01-05和2000-01-12,这两天都是星期三,这是freq=’W-WED’设定的,上采样直接使用:df_daily=frame.resample(‘D’)就得到:2000-01-05 2000-01-06.。。。2000-01-12共8个索引。
//2017/3/21
1、当对DataFrame调用plot时,所有时间序列都会被绘制在一个subplot上,并有一个图例说明哪个是哪个。
2、对于一个DataFrame:close_px,close_px.ix[‘2009’].plot()将画出2009年的12个月份的数据。close_px[‘AAPL’].ix[‘01-2011’:’03-2011’].plot()将画出AAPL列,2011年1月到3月每一天的数据。假如appl_q是close_px的按季度的下采样,则appl_q.ix[2009:].plot()就画出了2009年及以后年度,每年每季度的数据。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值