内容简介:#python会自耦东识别相同的标签相加,没有相同标签的或者值为空值的相加后为null#ix,loc,iloc的区别,iloc只能通过行号来获取数据,不能是字符。ix / loc 可以通过行号和行标签进行索引,但是iloc的效率 是最高的思维引导dataframe你可以认为他是由很多个Series构成的,所以他的很多用法跟Series类似, 其中每一个列他的数据类型就是Series类型 如果你要索引两个值是是df[['A','B']] 那么接下来dataframe的增删改也可以说跟Series类似的了
Series的创建
#字典创建 a={'a':1 ,'b':2 , 'c':3} S=pd.Series(a) #数组创建 S1=pd.Series(np.random.randn(4)) #用标量创建 S2=pd.Series(10,index=range(4)) #标量的个数由idnex的个数决定 复制代码
Series的索引
s = pd.Series(np.random.rand(5)*100, index = ['a','b','c','d','e']) print(s[['a','c','e']])#选取自己想要的值 print(s[1:3])#左闭右开 print(s['a':'c'])#都是闭区间 print(s[-1])#倒过来 print(s[::2])#步长为2 # 布尔索引 bs1=s>50 bs2=s.isnull() bs3=s.notnull() S2=s[s.notnull()]#输出结果是输出S2不是null的值 # 布尔索引的作用可以用于筛选,返回的是布尔类型 复制代码
Series的常用函数
s = pd.Series(np.random.rand(3), index = ['a','b','c']) s.head()#查看前五条数据 s.tail()#查看后五条 s1=s.reindex(['b','a','c','d'],fill_value=0)#reindex新加的索引行为空,fill_value参数是把空值填充为0 复制代码
Series的自动对齐
s1 = pd.Series(np.random.rand(3), index = ['Jack','Marry','Tom']) s2 = pd.Series(np.random.rand(3), index = ['Wang','Jack','Marry']) print(s1+s2) 复制代码
#python会自耦东识别相同的标签相加,没有相同标签的或者值为空值的相加后为null
Series的增删改
s1 = pd.Series(np.random.rand(5)) s2 = pd.Series(np.random.rand(5), index = list('ngjur')) #增 s2['a']=100 s1[5]=30 #删 s1.drop(1) s2.drop('n') #改 s2['a']=1 复制代码
DataFrame的五种创建方式
#方法一 由list组成的字典 data={'a':[1,2,3], 'b':np.random.rand(3) } df=pd.DataFrame(data,index=['one','two','three']) #注意index的个数必须与行数相等,columns的个数可以任意,多出来的系统会默认是空值 #方法二由Series组成的字典生成 data={'one':np.Series(np.random.rand(3)), 'two':np.random.rand(2) } df=pd.DateFrame(data,index=[1,2,3]) #方法三 由二维数组生成 data=np.random.rand(9).reshape(3,3) df=pd.DataFrame(data) #方法四 由字典生成 data = [{'one': 1, 'two': 2}, {'one': 5, 'two': 10, 'three': 20}] df1 = pd.DataFrame(data) #方法五 由字典组成的字典 data={'key1':{'math':45,'eng':56,'art':65}, 'key2': {'math':23,'eng':12,'art':87} } df1 = pd.DataFrame(data) #第一个字典键key1是列,里面的字典的键为行索引 df1.index #dataframe的行索引 df.columns #dataframe的列索引 df.values #dataframe的元素 复制代码
pandas的行列选择,切片和布尔索引
df=pd.DataFrame(np.random.rand(16).reshape(4,4), columns=list('ABCD'),index=['one','two','three','four']) #选择列 df['A']#直接用列名进行索引 df[['A','C']] df['A':'C']#不可以这么用 #一个列返回的是Series 两个返回的是dataframe #选择行 df.loc['one':'three','a':'b'] df.iloc[1:3,'a'] df.ix[1:3,'b'] #布尔索引 print(df>20) print(df[df>20]) print(df[df>20][['a','b']])#a,b列>20的值,也是多重索引。在df>20的dataframe下再次索引 复制代码
#ix,loc,iloc的区别,iloc只能通过行号来获取数据,不能是字符。ix / loc 可以通过行号和行标签进行索引,但是iloc的效率 是最高的
思维引导dataframe你可以认为他是由很多个Series构成的,所以他的很多用法跟Series类似, 其中每一个列他的数据类型就是Series类型 如果你要索引两个值是是df[['A','B']] 那么接下来dataframe的增删改也可以说跟Series类似的了
df = pd.DataFrame(np.random.rand(16).reshape(4,4)*100, columns = ['a','b','c','d']) #增 df['e']=10#增列 df.loc[4]=1#增行 print(df) #改 df[['a','c']]=100#改列 df.iloc[3]=1#改行 #删除 del df['a']#原数组发生改变 print(df.drop(['b','c'],axis=1)) print(df.drop(0)) print(df.drop([1,2])) #注意drop函数执行成功时,原来的df并不会发生改变也是就说他生成的新的dataframe,如果要改变df,则应该加个参数inplace比如 df.drop(['a'],axis=1,inpalce=True) 复制代码
dataframe的常用函数
#unique() df['列名'].unique() 返回没有重复元素的列 #排序sort_values() df1 = pd.DataFrame(np.random.rand(16).reshape(4,4)*100, columns = ['a','b','c','d']) print(df1) # print(df1.sort_values(['a'], ascending = True)) # 升序 print(df1.sort_values(['a','c'],ascending=False))#降序,默认是升序 #索引排序 sort_index df1.sort_index(ascending=True,inplace=True) #看了这么多例子,可以直接就知道,ascending就是 排序 的参数,inplace就是是否在原数据上操作,false的话返回的是新的dataframe #value_counts()统计重复元素的个数 df1.value_counts() 复制代码
时间戳
主要掌握datetime,timestamp,datetimeindex,Periods,时间序列的索引与重采样 对于电商或者金融方面很多数据的索引都是时间,索引掌握哈时间戳很关键
datetime主要掌握datetime.date(),datetime.datetime(),datetime.timetelta()
import datetime print(datetime.date.today())#输出当前时间 print(datetime.date(2019,1,2))#输出自定义时间 #datetime.datetime t1=datetime.datetime(2018,3,5) t2=datetime.datetime(2017,2,14,15,13,45) print(t1,t2) #与datetime.date的区别是datetime 能输出分秒 #datetime.timedelta()时间差 today=datetime.date(2016,2,5) yestaday=today-datetime.timedelta(1) print(today,yestaday) #日期解析,把字符串准成日期格式 from dateutil.parser import parser t='2018/2/23' date=parser(t) print(t) 复制代码
timestamp
# pd.Timestamp可以也精确到分秒 t1=pd.Timestamp('2017-3-2') t2=pd.Timestamp('1919-2-4') print(t1,t2) #pd.to_datetime date=pd.to_datetime('2014-1-2') print(type(date)) date_index=pd.to_datetime(['2012/2/2','2013/2/3']) print(type(date_index) #注意,只有一个时间时为Timestamp类型,两个或者两个以上为DatetimeIndex类型 #当你第一次接触新的数据类型的时候,输出他的数据类型有助于你理解他 date = ['2017-2-1','2017-2-2','2017-2-3','hello world!','2017-2-5','2017-2-6'] t1=pd.to_datetime(date,error='ignore') t2=pd.to_datetime(date,error='coerce') print(type(t1))#类型为ndarry类型 print(type(t2))#类型为DatetimeIndex类型 #参数的意思第一个是忽略错误,所以返回的是原来的数据类型, #第一个是coecer,强制的意思,把它强制转为DatetimeIndex类型 复制代码
DatetimeIndex
用时间作为索引
rng = pd.DatetimeIndex(['12/1/2017','12/2/2017','12/3/2017','12/4/2017','12/5/2017']) data=pd.Series(np.random.rand(5),index=rng) 复制代码
pd.date_range生成日期范围
# 生成日期范围 ''' pd.date_range(start=None, end=None, periods=None, freq='D', tz=None, normalize=False, name=None, closed=None, **kwargs) start:开始时间 end: 结束时间 periods: 偏移量 freq:频率 ts:时间 normalize:时间正则化到午夜时间戳 closed:区间,默认是左右闭 用法 closed=left or right ''' t1=pd.date_range('2017/2/1','2017/3/2') # print(t1)#显示2/1到3/2 的时间,频率默认是天 t2=pd.date_range(start='2017/2/1',periods=10) t3=pd.date_range(end='2017/2/1',periods=10) t4=pd.date_range(start='2017/2',periods=10,freq='m')#输出结果 ''' '2017-02-28', '2017-03-31', '2017-04-30', '2017-05-31', '2017-06-30', '2017-07-31', '2017-08-31', '2017-09-30', '2017-10-31', '2017-11-30'], ''' 复制代码
下面对于金融学的作用较大,讲freq是各种不同参数与用法
pd.date_range('2015/2/5','2015/2/6',frep='D') ''' freq是默认是值以天为频率 参数值先有 'M':month 'Y':year 'T' or 'MIN':分钟 'S':second 秒 'L':毫秒 'U':微秒 ''' # freq 其他参数值 ''' 'W-MON':指定每月的哪个星期开始 'WOM-2MON':指定每个月的第几个星期(这里是第二个星期) ''' # 例子 print(pd.date_range('2018/1/1','2018/2/1',freq='W-MON'))#一 星期为间隔 print(pd.date_range('2018/1/1','2018/5/1',freq='WOM-2MON'))#以月为间隔 ''' M:每个月最后一个日历日 Q-DEC:Q-月,指定月为季度末,每个季度末最后一月的最后一个日历日 1-4-7-10 2-5-8-11 A-DEC:每年指定月份的最后一个日历日 ''' print(pd.date_range(2017','2018', freq = 'M')) print(pd.date_range('2017','2020', freq = 'Q-DEC')) print(pd.date_range('2017','2018', freq = 'A-DEC')) #分别以月季度年为间隔 复制代码
''' print(pd.date_range('2017','2018', freq = 'BMS'))
print(pd.date_range('2017','2020', freq = 'BQS-DEC'))
print(pd.date_range('2017','2020', freq = 'BAS-DEC')) #输出相应频率的工作日 '''
总结
freq 的三个参数,B,(M,Q,A),S.分别代表了工作日,(以月为频率,以季度为频率,以年为频率),(最接近月初的那一天)
#l频率的转换 pd.asfreq() ts=pd.data_range('2018','2019') r=ts.asfreq('4H',method='ffill') # asfreq:频率转换 p = pd.Period('2017','A-DEC') print(p) print(p.asfreq('M', how = 'start')) # 也可写 how = 's' print(p.asfreq('D', how = 'end')) # 也可写 how = 'e' # 通过.asfreq(freq, method=None, how=None)方法转换成别的频率 复制代码
pandas period
p=pd.Period('2017',freq='M') p+1 #向前前进一频率 pd.date_range('2017','2018',freq='M') pd.period_range('2017',periods=10,freq='M') #时间范围和时期范围,时期范围精确度小 复制代码
#pd.to_period()、pd.to_timestamp() p=pd.date_range('2017','2018',freq='M') p1=pd.period_range('2019',periods=6,freq='M') print(p) print(p.to_period()) print(p1.to_timestamp()) #转换成period和timestamp类型,相同精度的类型不能相互转换 复制代码
切片和索引
时间类型的切片和索引的用法和列表的类似
重采样
rng = pd.date_range('20170101', periods = 12) ts = pd.Series(np.arange(12), index = rng) re_ts=ts.resample('5D').sum() print(ts.resample('5D').mean(),'→ 求平均值\n') print(ts.resample('5D').max(),'→ 求最大值\n') print(ts.resample('5D').min(),'→ 求最小值\n') print(ts.resample('5D').median(),'→ 求中值\n') print(ts.resample('5D').first(),'→ 返回第一个值\n') print(ts.resample('5D').last(),'→ 返回最后一个值\n') print(ts.resample('5D').ohlc(),'→ OHLC重采样\n') # OHLC:金融领域的时间序列聚合方式 → open开盘、high最大值、low最小值、close收盘 相当于改变频率然接聚合函数 ,与groupby类似 pd.resmaple(closed,label)的参数 print(ts.resample('5D',closed='left')#区间分布[1,2,3,4,5],[6,7,8,9,10],[11,12] print(ts.resample('5D',closed='right') # right指定间隔右边为结束 → [1],[2,3,4,5,6],[7,8,9,10,11],[12] 复制代码
计算增长比 df=pd.DataFrame(np.arange(0,16).reshape(4,4),index=pd.date_range('2017/1/1','2017/1/04'),columns=list('ABCD')) ts=df.shift(-1)#往上移动一位 print(df/ts) per=df/df.shift(1)-1 print(per.dropna() 复制代码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 用Apache Spark进行大数据处理 - 第六部分: 用Spark GraphX进行图数据分析
- Python进行基本图像数据分析!
- 如何用Python进行数据分析?
- 如何用SPSS进行数据分析?
- 使用SMACK堆栈进行快速数据分析
- 教程:使用Python进行基本图像数据分析!
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
编译原理
Alfred V. Aho、Monica S.Lam、Ravi Sethi、Jeffrey D. Ullman / 赵建华、郑滔、戴新宇 / 机械工业出版社 / 2008年12月 / 89.00元
本书全面、深入地探讨了编译器设计方面的重要主题,包括词法分析、语法分析、语法制导定义和语法制导翻译、运行时刻环境、目标代码生成、代码优化技术、并行性检测以及过程间分析技术,并在相关章节中给出大量的实例。与上一版相比,本书进行了全面的修订,涵盖了编译器开发方面的最新进展。每章中都提供了大量的系统及参考文献。 本书是编译原理课程方面的经典教材,内容丰富,适合作为高等院校计算机及相关专业本科生及研......一起来看看 《编译原理》 这本书的介绍吧!