当前位置:   article > 正文

利用python进行数据分析-学习笔记_python中count().unstack().fillna(0)

python中count().unstack().fillna(0)

  1. -------------------------------------------------CP names_case------------------------------------------------
  2. -------------------------------------------------------names-------------------------------------------------------
  3. #coding=gbk
  4. import pandas as pd
  5. import numpy as np
  6. from pandas import Series ,DataFrame
  7. import matplotlib.pyplot as pl
  8. from datetime import datetime
  9. from pandas .tseries.offsets import Hour,Minute,Day,MonthEnd
  10. from dateutil.parser import parse
  11. names1880=pd.read_csv('E:/work/qbao/PY-W/pydata-book-master/ch02/names/yob1880.txt',names=['name','sex','births'])
  12. names1880
  13. names1880.groupby('sex').births.sum()
  14. #读取,合并多个文件
  15. years=range(1880,2011)
  16. pieces=[]
  17. columns=['name','sex','births']
  18. for year in years:
  19. path='E:/work/qbao/PY-W/pydata-book-master/ch02/names/yob%d.txt' %year
  20. frame=pd.read_csv(path,names=columns)
  21. frame['year']=year
  22. pieces.append(frame)
  23. names=pd.concat(pieces,ignore_index=True)
  24. #男女出身人口数TS序列曲线
  25. total_births=names.pivot_table('births',index='year',columns='sex',aggfunc=sum)
  26. total_births.plot(title='birth of sex')
  27. #插入一个prop列 统计百分比
  28. def add_prop(group):
  29. births=group.births.astype(float)
  30. group['prop']=births/births.sum()
  31. return group
  32. names=names.groupby(['year','sex']).apply(add_prop)
  33. #计算比例总和是否为1
  34. np.allclose(names.groupby(['year','sex']).prop.sum(),1)
  35. #取出排名前1000
  36. def get_top1000(group):return group.sort_index(by='births',ascending=False)[:1000]
  37. grouped=names.groupby(['year','sex'])
  38. top1000=grouped.apply(get_top1000)
  39. ##
  40. pieces=[]
  41. for year,group in names.groupby(['year','sex']):pieces.append(group.sort_index(by='births',ascending=False)[:1000])
  42. top1000=pd.concat(pieces,ignore_index=True)
  43. #分析命名趋势
  44. boys=top1000[top1000.sex=='M']
  45. girls=top1000[top1000.sex=='F']
  46. total_births=top1000.pivot_table('births',index='year',columns='name',aggfunc=sum)
  47. #4个姓名的取名趋势subplot图
  48. subset=total_births[['John','Harry','Mary','Marilyn']]
  49. subset.plot(subplots=True,figsize=(12,10),grid=False,title='number of births per year')
  50. #评估命名多样性增长
  51. table=top1000.pivot_table('prop',index='year',columns='sex',aggfunc=sum)
  52. table.plot(title='sum of table1000.prop by year and sex',yticks=np.linspace(0,1.2,13),xticks=range(1880,2020,10))
  53. df=boys[boys.year==2010]
  54. #计算组成50%的人数
  55. prop_cumsum=df.sort_index(by='prop',ascending=False).prop.cumsum()
  56. prop_cumsum.searchsorted(0.5)
  57. df=boys[boys.year==1900]
  58. in1900=df.sort_index(by='prop',ascending=False).prop.cumsum()
  59. in1900.searchsorted(0.5)+1
  60. def get_quantile_count(group,q=0.5):
  61. group=group.sort_index(by='prop',ascending=False)
  62. return group.prop.cumsum().searchsorted(q)+1
  63. diversity=top1000.groupby(['year','sex']).apply(get_quantile_count)
  64. diversity=diversity.unstack('sex')
  65. diversity.plot(title='Number of popular names in top 50%')#年度统计密度表
  66. #最后一个字母的分析
  67. get_last_letter=lambda x:x[-1]
  68. last_letters=names.name.map(get_last_letter)
  69. last_letters.name='last_letter'
  70. table=names.pivot_table('births',index=last_letters,columns=['sex','year'],aggfunc=sum)
  71. subtable=table.reindex(columns=[1910,1960,2010],level='year')
  72. subtable.head()
  73. subtable.sum()
  74. letter_prop=subtable/subtable.sum().astype(float)
  75. fig,axes=pl.subplots(2,1,figsize=(10,8))
  76. letter_prop['M'].plot(kind='bar',rot=0,ax=axes[0],title='Male')
  77. letter_prop['F'].plot(kind='bar',rot=0,ax=axes[1],title='Female',legend=False)
  78. letter_prop=table/table.sum().astype(float)
  79. dny_ts=letter_prop.ix[['d','n','y'],'M'].T
  80. dny_ts.head()
  81. dny_ts.plot()
  82. all_names=top1000.name.unique()
  83. mask=np.array(['lesl' in x.lower() for x in all_names])
  84. lesley_like=all_names[mask]
  85. lesley_like
  86. filtered=top1000[top1000.name.isin(lesley_like)]
  87. filtered.groupby('name').births.sum()
  88. table=filtered.pivot_table('births',index='year',column='sex',aggfunc='sum')
  89. table=table.div(table.sum(1),axis=0)
  90. table.tail()
  91. table.plot(style={'M':'k-','F':'k--'})
  92. -------------------------------------------------------movielens-------------------------------------------------------
  93. #coding=gbk
  94. import pandas as pd
  95. import numpy as np
  96. from pandas import Series ,DataFrame
  97. import matplotlib.pyplot as pl
  98. from datetime import datetime
  99. from pandas .tseries.offsets import Hour,Minute,Day,MonthEnd
  100. from dateutil.parser import parse
  101. data=pd.read_table('C:/Users/admin/Desktop/PY-W/timeseries/get.csv')
  102. unames=['user_id','gender','age','occupation','zip']
  103. users=pd.read_table('E:/work/qbao/PY-W/pydata-book-master/ch02/movielens/users.dat',sep='::',header=None,names=unames)
  104. rnames=['user_id','movie_id','rating','timestamp']
  105. ratings=pd.read_table('E:/work/qbao/PY-W/pydata-book-master/ch02/movielens/ratings.dat',sep='::',header=None,names=rnames)
  106. mnames=['movie_id','title','genres']
  107. movies=pd.read_table('E:/work/qbao/PY-W/pydata-book-master/ch02/movielens/movies.dat',sep='::',header=None,names=mnames)
  108. da=pd.merge(pd.merge(ratings,users),movies)
  109. #calculate avg(score)---pivot
  110. mean_ratings=data.pviot_table('rating',index='title',columns='gender',aggfunc='mean')
  111. #calculate count(*)---group by title
  112. rating_by_title=da.groupby('title').size()
  113. #filtering >250
  114. active_title=rating_by_title.index[rating_by_title>250]
  115. active_title[:10]
  116. #top female like
  117. top_f_like=mean_ratings.sort_index(by='F',ascending=False)
  118. #rating[diff]
  119. mean_ratings['diff']=mean_ratings['M']-mean_ratings['F']
  120. sorted_by_diff=mean_ratings.sort_index(by=='diff')
  121. #std
  122. rating_std_by_title=da.groupby('title')['rsting'].std()
  123. #
  124. rating_std_by_title=rating_std_by_title.ix[active_title]
  125. rating_std_by_title.order(ascending=False)[:10]
  126. '''df2=pd.read_csv('C:/Users/admin/Desktop/pyda/tes.csv')
  127. mpl.rcParams['font.sans-serif'] = ['SimHei']'''
  128. -------------------------------------------------------USA.gov-------------------------------------------------------
  129. #encodig=gbk
  130. path='E:/work/qbao/PY-W/pydata-book-master/ch02/usagov_bitly_data2012-03-16.txt'
  131. #open(path).readline()
  132. import json
  133. record=[json.loads(line) for line in open(path)]
  134. record[0]['tz'] #第一条记录中的tz字段value
  135. time_zones=[rec['tz'] for rec in record if 'tz' in rec] #count(tz) if tz notnull
  136. --------------------------Method of PANDAS ------------------------------
  137. #use the value_counts() to count
  138. from pandas import DataFrame,Series
  139. import pandas as pd ; import numpy as np
  140. frame =DataFrame(record)
  141. frame['tz'][:10]
  142. tz_count=frame['tz'].value_counts()
  143. tz_count[:10]
  144. #frame['c'][:10].value_counts().plot(kind='bar')
  145. clean_tz=frame['tz'].fillna('Missing')
  146. clean_tz[clean_tz==' ']='Unknown'
  147. tz_counts=clean_tz.value_counts()
  148. tz_counts[:10].plot(kind='barh',rot=0)
  149. #对字段a进行描述count
  150. result=Series([x.split()[0] for x in frame.a.dropna()])
  151. result.value_counts()[:10].plot(kind='barh')
  152. cframe=frame[frame.a.notnull()] # frame(remove value='null' among a)
  153. operating_sys=np.where(cframe['a'].str.contains('Windows'),'windows','not windows')
  154. by_tz_os=cframe.groupby(['tz',operating_sys])
  155. agg_count=by_tz_os.size().unstack().fillna(0)
  156. agg_count[:10]
  157. #升序排列
  158. indexer=agg_count.sum(1).argsort()
  159. indexer[:10]
  160. #截取后十行
  161. count_subset=agg_count.take(indexer)[-10:]
  162. count_subset
  163. count_subset.plot(kind='barh',stacked=True)
  164. #截取后十行的百分比例图
  165. normed_subset=count_subset.div(count_subset.sum(1),axis=0)
  166. normed_subset.plot(kind='barh',stacked=True)
  167. ---------------Method of standard-way---------------------
  168. #create count()-formula
  169. def get_count(sequence):
  170. count={}
  171. for x in sequence:
  172. if x in count:
  173. count[x]+=1
  174. else:
  175. count[x]=1
  176. return count
  177. #w2
  178. from collections import defaultdict
  179. def get_count2(sequence):
  180. count=defaultdict(int)
  181. for x in sequence:
  182. count[x]+=1
  183. return count
  184. #counting
  185. count=get_count2(time_zones)
  186. count['America/New_York']
  187. #前十位城市计数函数
  188. def top_count(count_dict,n=10):
  189. value_key_pairs=[(count,tz) for tz,count in count_dict.items()]
  190. value_key_pairs.sort()
  191. return value_key_pairs[-n:]
  192. top_count(count)
  193. ##method of collections.Counter
  194. from collections import Counter
  195. counts=Counter(time_zones)
  196. counts.most_common(10)
  197. -------------------------------------------------CP4 numpy------------------------------------------------
  198. #coding=gbk
  199. import pandas as pd
  200. import numpy as np
  201. from pandas import Series ,DataFrame
  202. import matplotlib.pyplot as pl
  203. from datetime import datetime
  204. from pandas .tseries.offsets import Hour,Minute,Day,MonthEnd
  205. from dateutil.parser import parse
  206. from numpy.linalg import inv,qr
  207. ---------basic---------
  208. d=[[1,2,3],[4,5,6]]
  209. arr1=np.array(d)
  210. arr1.shape ------> (2,3)
  211. arr1.dtype ------> int32
  212. np.zeros(10)
  213. np.zeros((3,6)) ------>3list(6元素)
  214. np.empty((2,3,2)) ----->2list 3list2元素)
  215. np.arange(15) ------> 0 to 14 的ndarry
  216. '''np函数
  217. ones/ones_like, --->1数组
  218. zeros/zeros_like, --->0数组
  219. empty/empty_like --->new array,只分配内存空间 不填充值
  220. eye/identity --->N*N矩阵 对角线为1 else0
  221. '''
  222. arr2=np.array([1,2,3],dtype=np.float64/int32)
  223. arr2.astype(np.float64) #转换数据类型
  224. #数组标量运算
  225. arr3=np.array([[1,2,3],[4,5,6]])
  226. arr3*arr3,arr3-arr3,1/arr3,arr3**0.5
  227. -------数组ix和slice
  228. arr4=np.arange(10) ------->arr4[:5]/arr4[:5]=1 #单维数组
  229. arr5=np.array([[[1,2,3],[5,6,7]],[[7,8,9],[10,11,12]]]) ------->arr5[1][0][1] = 8 == arr5[1][0][1]
  230. arr5[1,:,:1] --------->第2个 所有子 第一个数字 7&10
  231. arr5[:,:,1:] --------->取出第2,3
  232. #运用bool数组
  233. names=np.array(['zieox','kol','sisi','jack','lucy','mark','olk'])
  234. dat=randn(7,3) --------->随机取73元素
  235. dat[names=='zieox'] --------->利用bool数组取出randn值
  236. dat[dat<0]=1/dat[names!='zieox']=1
  237. -------花式数组
  238. arr=np.empty((8,4))
  239. for i in range(8):
  240. arr[i]=i
  241. arr[[2,3,5]]
  242. arr7=np.arange(32).reshape((8,4))/arr7=np.random.randn(32).reshape((8,4)) #reshape
  243. arr7[[1,5,7,2],[0,3,1,2]] -------->取10 53 71 22
  244. arr7[[1,5,7,2]][:,[0,3,1,2]] -------->取1572list 中的0312
  245. 或者 arr7[np.ix_([1,5,7,2],[0,3,1,2])]
  246. ------数组转置与轴对换
  247. arr8=np.arange(15).reshape((3,5)) ----->arr8.T
  248. ------计算矩阵内积
  249. arr=np.random.randn(6,3)
  250. np.dot(arr.T,arr)
  251. ------高纬数组轴转置
  252. arr9=np.arange(16).reshape((2,2,4))
  253. arr9.swapaxes(1,2)
  254. ------------------通用函数
  255. abs/fabs 绝对值
  256. sqrt 平方根
  257. square 平方
  258. exp 指数e^x
  259. log/log10/log2/log1p log
  260. sign 元素正负号,10 -1
  261. ceil 向上圆整
  262. floor 向下圆整
  263. rint 四舍五入
  264. modf 拆开整数和小数,返回数组
  265. isnan 是否是NAN的bool
  266. isfinite/isinf 返回哪些元素是有穷/无穷的bool数组
  267. cos/cosh/sin/sinh/tan/tanh 普通/双曲型三角函数
  268. arccos/arccosh/arcsin/arcsinh/arctan/arctanh 反三角函数
  269. logical_not 计算元素notX 的真值
  270. -------二元
  271. add 将数组中对应元素相加
  272. subtract 第一个数组元素减去第二个
  273. multiply 数组元素相乘
  274. divide/floor_divide 触发或向下元整除法
  275. power 数组A 根据数组B计算 A^B
  276. maximum/fmax 元素级最大值
  277. minimum/fmin 元素级最小值
  278. mod 元素级求模计算
  279. copysign 将第二个数组中值得符号赋予第一个数组
  280. greater/greater_equal/ 执行元素级比较最终产生bool数组
  281. less/less_equal/equal/not_equal >,>=,<,<=,==,!=
  282. logical_and/logical_or/logical_xor 执行元素级真值逻辑运算(&,|,^)
  283. -----------利用数组进行数据处理
  284. points=np.arange(-5,5,0.01)
  285. xs,ys=np.meshgrid(points,points) #2个一维数组合并成一个2维数组
  286. z=np.sqrt(xs**2+ys**2) #(x方+y方)^0.5
  287. pl.imshow(z,cmap=pl.cm.gray);pl.colorbar()
  288. pl.title('Image plot of $\sqrt{x^2+y^2}$ for a grid of values')
  289. ----------将条件逻辑表达式表述为数组运算
  290. xarr=np.array([1.1,1.2,1.3,1.4,1.5])
  291. yarr=np.array([2.1,2.2,2.3,2.4,2.5])
  292. conda=np.array([True,False,True,True,False])
  293. arr=randn(4,4) #where
  294. np.where(arr>0,1,-1)
  295. np.where(arr>0,2,arr)
  296. #array多条件判断 赋值
  297. result=[]
  298. for i in range(n):
  299. if cond1[i] and cond2[i]:
  300. result.append[0]
  301. elseif cond1[i]:
  302. result.append[1]
  303. elseif cond2[i]:
  304. result.append[2]
  305. else:
  306. result.append[3]
  307. np.where(cond1&cond2,0,np.where(cond1,1,np.where(cond2,2,3)))
  308. result=1*(cond1-cond2)+2*(cond2&-cond1)-(cond1|cond2)
  309. ----------数学和统计方法
  310. arr=np.random.randn(5,4)
  311. for i in range(0,4):
  312. print(arr[i].mean())
  313. #
  314. sum 求和 mean 平均值
  315. cumsum 累积和 cumpord 累计乘
  316. std/var 标准差和方差 argmin/argmax 返回最大小值序号
  317. arr=np.random.randint(5,size=(2,3))
  318. arr.cumsum(1) #根据axis=1 按照->行 累和
  319. arr.cumsum(0) #根据axis=1 按照|列 累和
  320. ----------用于bool型数组方法
  321. (arr>0).sum() #返回的是值得个数
  322. bools=np.array([False,False,True,False])
  323. bools.any() #用于检查是否含有True
  324. bools.all() #用于检查全是True #用于非bools数组时 所有非0元素将被视为True
  325. ----------排序
  326. arr1=np.random.randn(5.3)
  327. arr.sort(1) #1根据行,0根据列 #注意:这里会改变数组,产生非视图
  328. lararr=np.random.randn(1000)
  329. lararr.sort()
  330. lararr[int(0.05*len(lararr))]
  331. ----------唯一化及其他结合逻辑
  332. names=np.array(['zieox','jack','rose','hack','zeox','hack'])
  333. np.unique(names)
  334. np.in1d(names,['jack','jis','zieox'])
  335. #
  336. unique(x) 唯一直
  337. union1d(x,y) x,y的并集,返回有序结果
  338. setdiff1d(x,y) 集合差,在x不在y
  339. intersect(x,y) x,y中的共有元素 并返回序列
  340. in1d(x,y) x是否包含于y
  341. setxor1d(x,y) 集合对称差,存在一个数组 但不在2
  342. ----------存取文本文件
  343. arr=np.loadtxt('~.txt',delimeter=',')
  344. ----------线性代数
  345. x=np.array([[1,2,3],[4,5,6]])
  346. y=np.array([[6,23],[-1,7],[8,9]])
  347. x.dot(y) / np.dot(x,y) #矩阵乘法
  348. X=np.random.randn(5,5)
  349. mat=X.T.dot(X)
  350. inv(mat)
  351. mat.dot(inc(mat))
  352. q,r=qr(mat)
  353. #常用函数
  354. diag 以一维数组的形式返回方阵的对角线(或非对角线)元素,或·将一维数组转换为方阵(非对角线元素为0
  355. dot 矩阵乘法
  356. trace 计算对角线元素和
  357. det ···· 计算矩阵行列式
  358. eig 计算方阵的本征值和本征向量
  359. inv 计算方阵的逆
  360. pinv 计算举证的Moore-Penrose伪逆
  361. qr 计算QR分解
  362. svd 计算奇异值分解(SVD)
  363. solve 解线性方程组Ax=b ,(A是一个方阵)
  364. istsq 计算Ax=b的最小二乘解
  365. ------------随机数生成
  366. samples=np.random.normal(size=(4,4))
  367. from random import normalvariate
  368. N=100000
  369. %timeit samples=[normalvariate(0,1) for _ in xrange(N)]
  370. %timeit np.random.normal(size=N)
  371. #numpy.random函数
  372. seed 确定随机数生成器种子
  373. permutation 返回一个序列的随机排列 或 返回一个随机排列的范围
  374. shuffle 对一个序列就地随机排列
  375. rand 产生均匀分布的样本值
  376. randint 从给定的上下限范围内随机取整数
  377. randn 产生mean=0 std=1的标准正态分布
  378. binomial 产生二项分布样本值
  379. normal 产生正态分布样本值
  380. beta 产生beta分布样本值
  381. chisquare 产生卡方分布样本值
  382. gamma 产生样gamma本值
  383. uniform 产生[0,1)中均匀分布的样本值
  384. -------------------------------------------ex 随机漫步-------------------------------------------
  385. import random
  386. #method1-标准库
  387. position=0
  388. walk=[position]
  389. steps=1000
  390. for i in xrange(steps):
  391. step=1 if random.randint(0,1) else -1
  392. position+=step
  393. walk.append(position)
  394. #np.where方式
  395. nsteps=1000
  396. draws=np.random.randint(0,2,size=nsteps)
  397. steps=np.where(draws>0,1,-1)
  398. walk=steps.cumsum()
  399. a=pd.Series(walk)
  400. a.plot()
  401. pl.show()
  402. walk.min() / walk.max()
  403. (np.abs(walk)>=10).argmax() #返回绝对值大于10的最大值序号
  404. -------------------一次模拟多个随机漫步
  405. 创建多维数组(按维计做次)
  406. nwalks=5000
  407. nsteps=1000
  408. draws=np.random.randint(0,2,size=(nwalks,nsteps))
  409. steps=np.where(draws>0,1,-1)
  410. walks=steps.cumsum(1)
  411. walks.max() / walks.min()
  412. hist30=(np.abs(walks)>=30).any(1)
  413. hist30.sum()
  414. crossing_time=(np.abs(walks[hist30])>=30).argmax(1)
  415. steps=np.random.normal(loc=0,scale=0.25,size=(nwalks,nsteps))
  416. ---------------------------------------------numpy Senior------------------------------------------------
  417. np.ones((10,5)).shape
  418. np.ones((3,4,5),dtype=float).strides
  419. ------numpy数据类型体系
  420. ints=np.ones(10,dtpye=np.unit16)
  421. floats=np.ones(10,dtpye=np.float32)
  422. np.issubtype(ints.dtype,np.integer)
  423. ------数组重塑
  424. arr=np.arange(8) --->arr.reshape((4,2))-->arr.reshape((4,2)).reshape((2,4))
  425. arr2=np.arange(15)--->arr.reshape((5,-1)) #均匀分配
  426. ot_arr=np.ones((3,5))--->ot_arr.shape--->arr2.reshape(ot_arr.shape)
  427. ------reshape的反运算为raveling/flatten(返回副本)
  428. arr2=np.arange(15).reshape((5,3)) --->arr2.ravel()
  429. ---------------数组的合并与拆分
  430. #合并
  431. arr1=np.array([[1,2,3],[4,5,6]])
  432. arr2=np.array([[7,8,9],[10,11,12]])
  433. np.concatenate([arr1,arr2],axis=0) 4list<|> np.vstack((arr1,arr2)) #arr1中加arr2
  434. np.concatenate([arr1,arr2],axis=1) 2list<-> np.hstack((arr1,arr2)) #arr1中元素级+
  435. #拆分
  436. arr=np.random.randn(5,2)
  437. first,second,third=np.split(arr,[1,3])
  438. #数组连接函数
  439. concatenate 一般化连接,沿一条轴连接一组数组
  440. vstack,row_stack 面向行方式 对数组进行重叠(ix=0
  441. hstack 面向列方式 对数组进行重叠(ix=1
  442. columns_stack 类似hstack,但是会先将一维数组转换为二位列向量
  443. dstack 面向‘深度’的方式 对数组进行堆叠(ix=2
  444. split 沿指定轴在指定的位置拆分数组
  445. hsplit,vsplit,dsplit 沿轴0,1,2进行拆分
  446. #堆叠辅助:r_ 和 c_
  447. arr3=np.arange(6)
  448. arr4=arr3.reshape((3,2))
  449. arr5=np.random.randn(3,2)
  450. np.r_[arr4,arr5] #合并进行(axis=0)
  451. np.c_[np.r_[arr4,arr5],arr3] #合并进列
  452. ---------------元素的重复操作:title和repeat
  453. arr6=np.arange(3)
  454. arr6.repeat(3)
  455. arr6.repeat([2,3,4]) #内元素 *2*3*4
  456. arr7=np.random.randn(2,2)
  457. arr7.repeat([2,3],axis=0) #在行上(|)对一个子*2,第二个*3
  458. np.tile(arr7,(3,2)) #将arr7视为块,进行‘|’*3 ‘-’*2的铺设
  459. ---------------花式索引的等价函数:take和put(用来选取数子集)
  460. arr8=np.arange(10)*100
  461. inds=[7,1,2,6]
  462. arr8[inds]
  463. arr8.take(inds) #选取数组子集
  464. arr8.put(inds,42)
  465. arr8.put(inds,[40,41,42,43])
  466. inds=[2,0,2,1]
  467. arr9=np.random.randn(2,4) #2行4元素
  468. arr9.take(inds,axis=1) #取出子元素中序为3132的 #相当按照arr9排列为行后 按列取值 +1是为了取全部子
  469. arr9.take([0],axis=0) #取出第一行 若[0,1,0] 则取出第1,2,1行 得出结果
  470. arr9.take([0],axis=1) #取出第一列 若[0,1,0] 则取出第1,2,1列 得出结果
  471. ---------------广播(broadcasting)
  472. arr=np.random.randn(4,3)
  473. arr.mean(0) ‘3’ ------>01列 (0:对各列的行求均值,例:子的第一位置by行求均)
  474. demeaned=arr-arr.mean(0) ------>离均差
  475. row_means=arr.mean(1)
  476. row_means.reshape((4,1))
  477. demeaned2=arr-row_means.reshape((4,1)) #广播原则中 广播维必须是1
  478. arr=np.zeros((4,4))
  479. ar3d=arr[:,np.newaxis,:]
  480. ar3d.shape ====>(4,1,4)
  481. ar1d=np.random.normal(size=3)
  482. ar1d[:,np.newaxis]
  483. ar1d[np.newaxis,:]
  484. ---平距化
  485. arr3=np.random.randn(3,4,5)
  486. deep_means=arr3.mean(2)
  487. demeaned3=arr-deep_means[:,:,np.newaxis]
  488. def demean_axis(arr,axis=0):
  489. means=arr.mean(axis)
  490. indexer=[slice(None)]*arr.ndim
  491. indexer[axis]=np.newaxis
  492. return arr - means[indexer]
  493. ---------通过广播设置数组的值
  494. arr5=np.zeros((4,3))
  495. arr5[:]=5
  496. col=np.array([1.25,-0.42,0.44,1.6])
  497. arr5[:]=col[:,np.newaxis]
  498. arr5[:2]=[[-1.33],[0.555]]
  499. ---------ufunc实例
  500. arr=np.arange(10)
  501. np.add.reduce(arr) #相当于1-9的和
  502. arr.sum()
  503. arr=np.random.randn(5,5)
  504. arr[::2].sort(1) ----->隔行根据ix=1排序
  505. arr[:,:-1]<arr[:,1:]
  506. np.logical_and.reduce(arr[:,:-1]<arr[:,1:],axis=1)
  507. arr=np.arange(15).reshape((3,5))
  508. np.add.accumulate(arr,axis=1) ------>按<->累加
  509. ---利用outer计算差积
  510. arr=np.arange(3).repeat([1,2,3])
  511. np.multiply.outer(arr,np.arange(5)) ------>输出数据为2个输入数据维度之和
  512. result=np.subtract.outer(np.random.randn(3,4),np.random.randn(5))
  513. result.shape ------>(3,4,5)
  514. arr=np.arange(10)
  515. np.add.reduceat(arr,[0,5,8])
  516. arr=np.multiply.outer(np.arange(4),np.arange(5))
  517. np.add.reduceat(arr,[0,2,4],axis=1)
  518. #ufunc方法
  519. reduce(x) 通过连续执行原始运算的方式对值进行结合
  520. accumulate(x) 聚合值,保留所有局部聚合结果
  521. reduceat(x,bins) 局部简约(类group by) 约简数据的各个切片以产生聚合型数组
  522. outer(x,y) 对x和y中的每对元素引用原始运算,结果数组的形状为x.shape+y.shape
  523. ----自定义ufunc
  524. def add_elements(x,y):
  525. return x+y
  526. add_them=np.frompyfunc(add_elements,2,1)
  527. add_them(np.arange(8),np.arange(8))
  528. add_them=np.victorize(add_elements,dtypes=[np.float64])
  529. add_them(np.arange(8),np.arrange(8)
  530. -----结构化和记录式数组
  531. dtype=[('x',np.float),('y',np.int32)]
  532. sarr=np.array([(1.5,6),(np.pi,-2)],dtype=dtype)
  533. -----嵌套dtype和多维字段
  534. dtype=[('x',np.int64,3),('y',np.int32)]
  535. arr=np.zeros(4,dtype=dtype)
  536. dtype=[('x',[('a','f8'),('b','f4')]),('y',np.int32)
  537. data=np.array([((1,2),5],((3,4,),6)],dtype=dtype)
  538. data['x']['a']
  539. -----跟多排序话题
  540. arr.sort(0) ------<|>行
  541. arr=np.random.randn(3,5)
  542. arr[:,0].sort() 第一列
  543. -----间接排序:argsort和lexsort
  544. values=np.array(['2:first','2:second','1:first','1:second','1:third'])
  545. key=np.array([2,2,1,1,1])
  546. indexer=key.argsort(kind='mergesort')
  547. values.take(indexer)
  548. #
  549. quicksort
  550. mergesort
  551. heapsort
  552. ----------np.searchsorted:在有序数组中查找元素
  553. arr=np.array([0,1,7,12,15])
  554. arr.searchsorted(9)
  555. arr=np.array([0,0,0,1,1,1,1])
  556. arr.searchsorted([0,1])
  557. arr.searchsorted([0,1],side='right')
  558. data=np.floor(np.random.uniform(0,10000,size=50))
  559. bins=np.array([0,100,1000,5000,10000])
  560. labels=bins.searchsorted(data)
  561. Series(data).groupby(labels).mean()
  562. np.digitize(data,bins)
  563. ----------np的matrix类
  564. x=np.array([[8.254566,3.55445,33166],[1.464,2.5446,3.24865],[9.464,5.646,8.466]])
  565. y=x[:,:1]
  566. np.dot(y.T,np.dot(x,y))
  567. xm=np.matrix(x) --------->矩阵化
  568. ym=xm[:,0]
  569. ym.T*xm*ym
  570. xm.I*x ---------->返回矩阵的逆
  571. --------内存映像文件
  572. mmap=np.memmap('mymmap',dtype='float64',mode='w+',shape=(10000,10000))
  573. section=mmap[:5]
  574. del mmap
  575. -------------------------------------------------CP5 pandas------------------------------------------------
  576. https://www.cnblogs.com/batteryhp/p/5006274.html
  577. import pandas as pd
  578. import numpy as np
  579. from pandas import Series ,DataFrame
  580. import matplotlib.pyplot as pl
  581. from datetime import datetime
  582. from pandas .tseries.offsets import Hour,Minute,Day,MonthEnd
  583. from numpy import nan as NA
  584. import pandas_datareader.data as web
  585. --------------basic Series------------
  586. obj=Series([4,7,-5,3])
  587. obj.values
  588. obj.index
  589. obj2=Series([4,7,-5,3],index=['d','b','a','c'])
  590. obj2[['d','a']]
  591. obj2[obj2>0]
  592. obj2*2
  593. np.exp(obj2)
  594. sdata={'ohio':35000,'texas':71000,'oregon':16000,'utah':5000}
  595. obj3=Series(sdata)
  596. states=['california','ohio','oregon','texas']
  597. obj4=Series(sdata,index=states)
  598. pd.isnull(obj4)/pd.notnull(obj4)
  599. obj4.isnull()
  600. obj4.name='population'
  601. obj4.index.name='state'
  602. obj.index=['bob','steve','jeff','ryan']
  603. obj7=Series([6.5,7.8,-5.9,8.6],index=['d','b','a','c'])
  604. obj8=obj3.reindex(['a', 'b', 'c', 'd''e'],fill_value=0)
  605. ----------------------DataFrame----------------------
  606. data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
  607. 'year': [2000, 2001, 2002, 2001, 2002],
  608. 'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}
  609. frame=DataFrame(data)
  610. DataFrame(data, columns=['year', 'state', 'pop'])
  611. ------基本操作
  612. frame2 = DataFrame(data, columns=['year', 'state', 'pop', 'debt'],
  613. index=['one', 'two', 'three', 'four', 'five'])
  614. frame2['state'] --->state 列
  615. frame2.year --->year 列
  616. frame2.ix['three'] --->index=‘three’
  617. frame2['debt'] = 18.5 --->将debt设置为18.5
  618. frame2['debt'] = np.arange(5.) --->将debt设置为0-4
  619. val = Series([-1.2, -1.5, -1.7], index=['two', 'four', 'five'])
  620. frame2['debt']=val --->frame2载入val
  621. frame2['eastern'] = frame2.state == 'Ohio' --->加入新列并赋值--frame2.state == 'Ohio' 返回true
  622. del frame2['eastern'] --->删除eastern列
  623. ------嵌套字典
  624. pop = {'Nevada': {2001: 2.4, 2002: 2.9},'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}
  625. frame3=DataFrame(pop)
  626. frame3.T --->行列转置
  627. DataFrame(pop, index=[2001, 2002, 2003])
  628. pdata = {'Ohio': frame3['Ohio'][:-1],'Nevada': frame3['Nevada'][:2]}
  629. DataFrame(pdata)
  630. frame3.index.name = 'year'; frame3.columns.name = 'state' --->设置行列名
  631. ---#5-1 DataFrame可接受的数据结构
  632. 二维ndarray 数据矩阵,可传入行标和列标
  633. 数组,列表或元祖组成的字典 每个序列会变成dataframe的一列。所有序列长度必须相同
  634. np的结构化数组/记录数组 类似于由数组组成的字典
  635. 由series组成的字典 每个series成为一列,若没有显式指定索引,则各series的索引会被合并成结果的行索引
  636. 由字典组成的字典 各内层字典成为一列,键会被合并成结果的行索引
  637. 字典或series的列表 各项将会成为dataframe的一行,字典键或series索引的并集将成为dataframe的列标
  638. 由列表或元祖组成的列表 类似ndarry
  639. 另一个dataframe 该dataframe的索引将会被沿用,除非显示指定其他索引
  640. numpy或makedarray 类似于‘二维ndarray’,只是掩码值在结果dataframe会变成NA缺失值
  641. frame3.index.name = 'year'; frame3.columns.name = 'state' --->设置行列名
  642. frame3.values --->values属性会以二维ndarray的形式返回DataFrame中的数据
  643. frame2.values --->只返回值
  644. --------------索引对象-----------Index对象是不可修改的
  645. obj = Series(range(3), index=['a', 'b', 'c'])
  646. index=obj.index
  647. index[1:]
  648. ---#5-2 pandas中主要index对象
  649. Index 最泛化index对象,将轴标签表示为一个由python对象组成的numpy数组
  650. Int64index 针对整数的特殊index
  651. Multiindex ‘层次化’索引对象,表示单个轴上的多层索引.可看做由元祖组成的数组
  652. Datetimeindex 存储纳秒级时间戳(用numpy和datetime64类型表示)
  653. Periodindex 针对period数据(时间间隔)的特殊index
  654. ---#5-3 index的方法和属性
  655. append 连接另一个index对象,产生一个新的index
  656. diff 计算差集
  657. intersection 计算交集
  658. union 计算并集
  659. isin 计算一个指示各值是否都包含在参数集合中的布尔型数组
  660. delete 删除索引i处的元素,并得到新的index
  661. drop 删除传入的值,并得到新的index
  662. insert 将元素插入索引i处,并得到新的index
  663. is_monotonic 当各元素均大于等于前一个元素时,返回true
  664. is_unique 当index没用重复值时,返回true
  665. unique 计算index中唯一值得数组
  666. ---基本操作
  667. obj = Series([1,2,3,4],index=['a','b','c','d'])
  668. obj2=obj.reindex(['a','c','d','b','e'],fill_value = 0)
  669. frame = DataFrame(np.arange(9).reshape((3,3)),index = ['a','c','d'],columns = ['Ohio','Texas','California'])
  670. frame2 = frame.reindex(['a','b','c','d'])
  671. 或 frame2=pd.DataFrame(frame,index=['a','b','c','d'])
  672. frame4 = frame.reindex(index = ['a','b','c','d'],columns=states,method = 'ffill')
  673. frame.ix[['a','d','c','b'],states] -------->使用ix的标签索引功能,重新索引变得比较简洁
  674. ---#reindex的(插值)method选项
  675. ffill或pad 前向填充值
  676. bfill或backfill 后向填充值
  677. ---#reindex函数的参数
  678. index 用作索引的新序列,既可以是index实例,也可以是其他序列型的python数据结构,index会被完全使用,就像没有任何复制一样
  679. method 插值(填充)方式
  680. fill_value 在重新索引的过程中,需要引入缺失值时使用的替代中值
  681. limit 前向或后向填充时的最大填充量
  682. level 在multiindex的指定级别上匹配简单索引,否则选取其子集
  683. copy 默认为true,无论如何都复制,如果为False 则新旧相等就不复制
  684. ---------------丢弃指定轴上的项
  685. obj = Series(np.arange(3.),index = ['a','b','c'])
  686. obj.drop('b')
  687. frame.drop(['a']) ------->丢弃a
  688. frame.drop(['Ohio'],axis = 1) ------->丢弃Ohio
  689. ---索引、选取和过滤
  690. obj = Series([1,2,3,4],index=['a','b','c','d'])
  691. frame = DataFrame(np.arange(9).reshape((3,3)),index = ['a','c','d'],columns = ['Ohio','Texas','California'])
  692. obj['b':'c']
  693. frame['Ohio']
  694. frame[:2]
  695. frame[frame['Ohio'] != 0]
  696. #下面的方式是对frame所有元素都适用,不是行或者列,下面的得到的是numpy.ndarray类型的数据
  697. frame[frame < 5],type(frame[frame < 5])
  698. frame[frame < 5] = 0
  699. frame.ix[['a','d'],['Ohio','Texas']] --->使用ix选取元素
  700. frame.ix[2] --->默认选取第三行
  701. frame.ix[frame.Ohio > 0] --->默认选取ohio大于0的行
  702. frame.ix[frame.Ohio > 0,:2] --->默认选取ohio大于0的行的前2
  703. ---#5-6 DataFrame的索引选项
  704. obj[val] 选取DF的单个列或一组列,在一些特殊情况下比较便利:布尔型数组,切片,布尔型df
  705. obj.ix[val] 选取df的单个行或一组行
  706. obj[:,val] 选取单个列或列子集
  707. obj[val1,val2] 选取行和列
  708. reindex方法 将一个或多个轴匹配到新索引
  709. xs方法 根据标签选取单行或单列,并返回一个series
  710. icol,irow 根据整数位置选取单列或单行,并返回一个series
  711. get_value,set_value 根据行标签和列标签选取单个值
  712. frame.ix[['d'],['Texas']] --->ix方法选取 d行 Texas列
  713. ---------------算术运算和数据对齐
  714. s1 = Series([1,2,3],['a','b','c'])
  715. s2 = Series([4,5,6],['b','c','d'])
  716. df1 = DataFrame(np.arange(12.).reshape(3,4),columns=list('abcd'))
  717. df2 = DataFrame(np.arange(20.).reshape(4,5),columns=list('abcde'))
  718. df1 + df2
  719. df1.add(df2,fill_value = 1000) --->函数add方法
  720. df1.reindex(columns = df2.columns,fill_value=0) --->reindex(df1)by DF2cols 重新索引指定填充值
  721. ---#5-7 灵活的算术方法
  722. add (+)
  723. sub (-)
  724. div (/)
  725. mul (*)
  726. ---------------DataFrame和Series之间的运算
  727. arr = DataFrame(np.arange(12.).reshape((3,4)),columns = list('abcd'))
  728. arr - arr.ix[0] --->广播原理
  729. Series2 = Series(range(3),index = list('cdf'))
  730. Series2
  731. Series3 = arr['d']
  732. arr.sub(Series3,axis = 0) --->列减
  733. ---------------函数应用和映射
  734. frame = DataFrame(np.random.randn(4,3),columns = list('abc'),index = ['Ut','Oh','Te','Or'])
  735. np.abs(frame) --->绝对值
  736. fun = lambda x:x.max() - x.min() --->构造函数
  737. frame.apply(fun) --->应用函数
  738. frame.apply(fun,axis = 1) --->在行上应用函数
  739. frame.sum(axis=1) --->根据行求和
  740. frame.sum() --->根据列求和
  741. def f(x):
  742. return Series([x.min(),x.max()],index = ['min','max'])
  743. frame.apply(f)
  744. format = lambda x: '%.2f' % x ---->元素级的python函数也是可以用的,但是要使用applymap函数
  745. frame.applymap(format) ---->四舍五入
  746. frame['b'].map(format)
  747. ---------------排序与排名sorting
  748. obj = Series(range(4),index = ['d','a','b','c'])
  749. obj.sort_index() --->对index排序
  750. frame = DataFrame(np.arange(8).reshape((2,4)),index = ['three','one'],columns = ['d','a','b','c'])
  751. frame.sort_index(axis = 1) --->对行排序
  752. frame.sort_index() --->对列index排序 正序
  753. frame.sort_index(axis = 1,ascending = False) --->对列index排序 倒序
  754. np.sort(obj) --->np.sort
  755. frame = DataFrame({'b':[4,7,-3,2],'a':[0,1,0,1]})
  756. frame.sort_index(by = ['a','b']) --->对列值排序
  757. obj = Series([7,-5,7,4,2,0,4])
  758. obj.rank(method='first')
  759. obj.rank(method = 'first',ascending=False)
  760. obj.rank(method = 'max',ascending=False)
  761. obj.rank(method = 'min',ascending=False)
  762. frame.rank()
  763. frame.rank(axis=1)
  764. #5-8 排名时用于破坏平级关系的method选项
  765. average 默认:在相等分组中,为各个值分配平均排名
  766. min 使用整个分组的最小排名
  767. max 使用整个分组的最大排名
  768. first 按值在原始数据中的出现顺序分配排名
  769. ---------------带有重复值的轴索引
  770. obj = Series(range(5),index = list('aabbc'))
  771. obj.index.is_unique
  772. obj['a']
  773. df = DataFrame(np.random.randn(4,3),index = list('aabb'))
  774. df.ix['b']
  775. ---------------汇总和计算描述统计
  776. df = DataFrame([[1.4,np.nan],[7.1,-4.5],[np.nan,np.nan],[0.75,-1.3]],index = list('abcd'),columns=['one','two'])
  777. df.sum(axis=1)
  778. df.idxmin() -------->列最小值
  779. df.idxmax() -------->列最大值
  780. df.cumsum() -------->01
  781. df.describe()
  782. obj = Series(['c','a','a','b','d'] * 4)
  783. obj.index=range(1,21)
  784. obj.describe()
  785. ---#简约方法的选项
  786. axis 轴,行=0 列=1
  787. skipna 排除缺失值,默认为True
  788. level 如果轴是层次化索引,则根据level分组简约
  789. ---#描述和汇总统计
  790. count 非NA的数量
  791. describe 针对Series或各DataFrame列计算汇总统计
  792. min,max 计算最小值和最大值
  793. argmin,argmax 计算能够取到最小值和最大值的索引位置(整数)
  794. idmax,idmin 计算能够取到最小值和最大值的索引值
  795. quantile 计算样本分位数(01
  796. sum 值的总和
  797. mean 值的平均数
  798. median 值的算术中位数(50%分位数)
  799. mad 根据平均值计算平均值绝对离差
  800. var 样本值的方差
  801. std 样本值的标准差
  802. skew 样本值的偏度(三阶距)
  803. kurt 样本值的偏度(四阶距)
  804. cumsum 样本值的累积和
  805. cummin,cummax 样本值的累计最大值和累计最小值
  806. cumpord 样本值的累计积
  807. diff 计算一阶差分(timeseries)
  808. pct_change 计算百分数变化
  809. frame = DataFrame([[1,2,3,4],[5,6,7,8],[-10,11,12,-13]],index = list('abc'),columns = ['one','two','three','four'])
  810. frame.cummin() 默认为0 <|>
  811. ---------------相关系数与协方差
  812. import pandas_datareader.data as web
  813. all_data={}
  814. for ticker in ['AAPL','IBM','MSFT','GOOG']:
  815. all_data[ticker]=web.get_data_yahoo(ticker,'1/1/2000','1/1/2010')
  816. price=DataFrame({tic:data['Adj Close'] for tic,data in all_data.items()})
  817. volume=DataFrame({tic:data['volume'] for tic,data in all_data.items()})
  818. returns=price.pct_change()
  819. returns.tail()
  820. returns.MSFT.corr(returns.IBM) corr用于计算2个series中重叠的,非NA的,按索对齐的值的相关系数
  821. returns.MSFT.cov(returns.IBM) 计算协方差
  822. returns.corr()
  823. returns.cov()
  824. returns.corrwith(returns.IBM)
  825. returns.corrwith(volume)
  826. ---------------唯一值、值计数以及成员资格
  827. obj = Series(['a','a','b','f','e'])
  828. uniques = obj.unique()
  829. uniques.sort() #记住这是就地排序
  830. obj.value_counts() --->统计计数
  831. obj.values
  832. pd.value_counts(obj.values,sort = False)
  833. mask = obj.isin(['b','c'])
  834. obj[mask]
  835. data = DataFrame({'Qu1':[1,3,4,3,4],
  836. 'Qu2':[2,3,1,2,3],
  837. 'Qu3':[1,5,2,4,4]})
  838. data.apply(pd.value_counts).fillna(0)
  839. ---#5-11 唯一值,值计数,成员资格方法
  840. isin 计算一个表示-series各值是否包含于传入的值序列中-的布尔型数组
  841. unique 计算series中的唯一值数组,按发现的顺序返回
  842. value_counts 返回一个series,其所以为唯一值,其值为频率,按计数值降序排列
  843. ---------------处理缺失数据
  844. str_data = Series(['a',np.nan,'b','c'])
  845. str_data[0] = None
  846. str_data.isnull()
  847. str_data.notnull()
  848. ---#5-12 NA处理方法
  849. dropna 根据各标签的值中是否存在缺失数据对轴标签进行过滤,通过阀值调节对缺失值的容忍度
  850. fillna 用指定或插值方法(如ffill或bfill)填充缺失数据
  851. isnull 饭回一个布尔值对象,这些布尔值表示那些事缺失值NA
  852. notnull isnull否定式
  853. data = Series([1,NA,3.5,7,NA])
  854. data.dropna() --->滤除缺失值
  855. data[data.notnull()]
  856. data1 = DataFrame([[1,2,3],[NA,2.3,4],[NA,NA,NA]])
  857. data1.dropna() --->默认:除缺失值的行列 这样操作函授NA值的行列都将不存在
  858. data1.dropna(how = 'all') --->指定how='all' 默认axis=0 表示滤除整行为NA的行
  859. data1.dropna(how = 'all',axis = 1) thresh指定列
  860. data2.ix[:4,1] = NA
  861. data2.ix[:2,2] = NA
  862. data2.dropna(thresh = 2) --->thresh:按照行选取NAN的个数
  863. data2.dropna(thresh = 4,axis = 1)
  864. ---------------填充缺失数据
  865. df = DataFrame([[1.4,np.nan],[7.1,-4.5],[np.nan,np.nan],[0.75,-1.3]],index = list('abcd'),columns=['one','two'])
  866. df.fillna(0)
  867. data2 = DataFrame(np.random.randn(7,3))
  868. data2.ix[:4,1] = NA
  869. data2.ix[:2,2] = NA
  870. data2.fillna(0) --->0填充,返回视图不修改
  871. data2.fillna(0,inplace = True) --->0填充,修改原表值
  872. data2.fillna({1:0.5,2:-1}) --->按列分别填充
  873. data2.fillna({1:data2.mean(0)[1],2:-data2.mean(0)[2]}) --->填充均值
  874. df = DataFrame(np.random.randn(6,3))
  875. df.ix[2:,1] = NA
  876. df.ix[4:,2] = NA
  877. df.fillna(method = 'ffill',limit = 2)
  878. data = Series([1.2,NA,4,NA])
  879. data.fillna(data.mean()) --->填充均值
  880. ---#filla函数的参数
  881. value 用于填充缺失值的标量值或字典对象
  882. method 插值方式,默认-ffill
  883. axis 待填充的轴,默认axis=0
  884. inplace 修改调用者对象而不产生副本
  885. limit (对于前向和后向填充)可以连续填充的最大数量
  886. ---------------层次化索引(纵表转横表)
  887. data = Series(np.random.randn(10),index=[['a','a','a','b','b','b','c','c','d','d'],[1,2,3,1,2,3,1,2,2,3]])
  888. data.index
  889. data['b']
  890. data['b':'c']
  891. data.ix[['b','d']] --->index为bd的
  892. data[:,2] --->第一层index中第二个值
  893. data.unstack().fillna(0) --->基于第一层ix的第二层转成列
  894. frame = DataFrame(np.arange(12).reshape((4,3)),
  895. index = [['a','a','b','b'],[1,2,1,2]],
  896. columns = [['Ohio','Ohio','Colorado'],['Green','Red','Green']])
  897. frame.index.names = ['key1','key2'] --->给ix层名
  898. frame.columns.names = ['state','color'] --->给col层名
  899. columns = pd.MultiIndex.from_arrays([['Ohio','Ohio','Colorado'],['Green','Red','Green']],names = ['state','color']) --->创建Multiindex复用分级
  900. frame1 = DataFrame(np.arange(12).reshape((4,3)),columns = columns)
  901. --------------根据级别汇总统计
  902. frame.swaplevel('key1','key2') --->用swaplevel重排分级顺序(接受2个级别编号或名称)#将k1,k2对换ix
  903. frame.sortlevel(1) --->根据index的第二层进行排序
  904. frame.swaplevel(1,0).sortlevel(0) --->index的第二层和第一层对换,根据0 sortlevel进行排列
  905. frame.sum(level = 'key2') --->求k2层汇总
  906. frame.sum(level = 'color',axis = 1) --->根据color汇总
  907. --------------使用DataFrame的列
  908. frame = DataFrame({'a':range(7),'b':range(7,0,-1),'c':['one','one','one','two','two','two','two'],'d':[0,1,2,0,1,2,3]})
  909. frame2 = frame.set_index(['c','d']) ------>以cd为index的列
  910. frame3 = frame.set_index(['c','d'],drop = False) ------>以cd为列 保留cd列
  911. frame2.reset_index() ------>与set_index相反的是reset_index函数
  912. --------------其他有关pandas的话题
  913. #-*- encoding:utf-8 -*-
  914. import numpy as np
  915. import os
  916. import pandas as pd
  917. from pandas import Series,DataFrame
  918. import matplotlib.pyplot as plt
  919. import pandas.io.data as web
  920. #这里说的是一些蛋疼的问题:整数索引和整数标签
  921. ser = Series(np.arange(3.))
  922. #print ser[-1] #报错,因为整数索引的歧义性
  923. ser2 = Series(np.arange(3.),index = ['a','b','c'])
  924. print ser2[-1] #正确
  925. #ix函数总是面向标签的
  926. print ser.ix[:1]
  927. #如果需要可靠的、不考虑索引类型的、基于位置的索引,可以使用Series的iget_value方法,Dataframe的irow 和 icol方法
  928. ser3 = Series(range(3),index= [-5,1,3])
  929. print ser3.iget_value(2)
  930. frame = DataFrame(np.arange(6).reshape(3,2),index = [2,0,1])
  931. print frame.irow(0)
  932. #pandas 有一个Panel数据结构(不是主要内容),可以看作是三维的DataFrame。pandas中的多维数据可以利用多层索引进行处理
  933. #可以利用DataFrame对象组成的字典或者一个三维ndarray来创建Panel对象
  934. pdata = pd.Panel(dict((stk,web.get_data_yahoo(stk,'1/1/2009','6/1/2012')) for stk in ['AAPL','GOOG','MSFT','DELL']))
  935. #网络错误,得不到数据
  936. #Panel的每一项都是一个DataFrame.
  937. 与或非(交并差集)
  938. a = t | s # t 和 s的并集
  939. b = t & s # t 和 s的交集
  940. c = t – s # 求差集(项在t中,但不在s中)
  941. d = t ^ s # 对称差集(项在t或s中,但不会同时出现在二者中)
  942. -------------------------------------------------CP6 文件存取------------------------------------------------
  943. https://www.cnblogs.com/batteryhp/p/5021858.html
  944. file ch06
  945. --------------------读写文本格式数据
  946. #pandas 中的函数
  947. read_csv 从文件,url,文件对象中加载带分隔符的数据,默认分隔符为逗号
  948. read_table 从文件,url,文件对象中加载带分隔符的数据,默认分隔符为制表符\t
  949. read_fwf 读取定宽格式数据(也就是说,没有分隔符)
  950. read_clipboard 读取粘贴板中的数据,可以看做read_table的粘贴板,将网页装换为表格时很有用
  951. df=pd.read_csv('C:/Users/admin/Desktop/pyda/ch06/ex1.csv',index_col='message') --->读取文件并将message列作为index
  952. pd.read_table('C:/Users/admin/Desktop/pyda/ch06/ex1.csv',sep=',')
  953. pd.read_csv('C:/Users/admin/Desktop/pyda/ch06/ex1.csv',header=None) --->读取文件无列名
  954. name=['a','b','c','d','me']
  955. pd.read_csv('C:/Users/admin/Desktop/pyda/ch06/ex2.csv',names=name,index_col='mes') --->指定列名index
  956. parsed=pd.read_csv('C:/Users/admin/Desktop/pyda/ch06/csv_mindex.csv',index_col=['key1','key2']) --->指定层次化索引
  957. #read_csv/read_table 函数的参数
  958. path 表示文件系统位置,url,文件型对象的字符串
  959. sep/delimiter 用于对行中各字段进行拆分的字符序列或正则表达式
  960. header 用作列名的行号,默认0(第一行),如果没有header行就应该设置为None
  961. index_col 用作索引的列编号或列名.可以是单个名称/数字或多个名称/数字组成的列表(层次化索引)
  962. names 用于结果的列名列表,结合header=None
  963. skiprows 需要忽略的行数(从文件开始处算起),或需要跳过的行号列表(从0开始)
  964. na_values 一组用于替换NA的值
  965. comments 用于将注释信息从行尾拆分出去的字符(一个或多个)
  966. parse_datas 尝试将数据解析为日期,默认为False,如果为True。则尝试解析所有列,
  967. 此外还可以指定需要解析的一组列号或列名。如果列表的元素为列表或元祖,就会将多个列组合到一起进行日期解析工作(例:时间/日期分别位于2个列中)
  968. keep_date_col 如果连接多列解析日期,则保持参与连接的列。默认为False
  969. converters 由列号/列名跟函数之间的映射关系组成的字典,例如,{'foo':f}会对foo列的所有值应用函数F
  970. dayfirst 当解析有歧义的日期时,将其看做国际格式(例,7/6/2012/->june 7,2012) 默认为False
  971. data_parser 用于解析日期的函数
  972. nrows 需要读取的行数
  973. iterator 返回一个TextParser一遍逐块读取文件
  974. chunksize 文件块的大小(用于迭代)
  975. skip_footer 需要忽略的行数(从文件末尾处算起)
  976. verbose 打印各种解析器输出信息,比如“非数值列中缺失值的数量”等
  977. encoding 用于unicode的文本编码格式,例 utf-8表示UTF-8编码的文本
  978. squeeze 如果数据经解析后仅含一列 则返回series
  979. thousands 千分位分隔符,如',''.'
  980. list(open('C:/Users/admin/Desktop/pyda/ch06/ex3.txt'))
  981. result=pd.read_table('C:/Users/admin/Desktop/pyda/ch06/ex3.txt',sep='\s+') --->非逗号(space)分隔符文件的读取
  982. pd.read_csv('C:/Users/admin/Desktop/pyda/ch06/ex4.csv',skiprows=[0,2,3]) --->跳过第一三四行
  983. result=pd.read_csv('C:/Users/admin/Desktop/pyda/ch06/ex5.csv')
  984. result=pd.read_csv('C:/Users/admin/Desktop/pyda/ch06/ex5.csv',na_values=['null']) --->用字符串表示缺失值
  985. sentinels={'message':['foo','NA'],'something':['two']} --->用字典为各列指定不同的NA值
  986. result=pd.read_csv('C:/Users/admin/Desktop/pyda/ch06/ex5.csv',na_values=sentinels)
  987. --------------逐块读取文件(chunksize)
  988. result=pd.read_csv('C:/Users/admin/Desktop/pyda/ch06/ex6.csv')
  989. pd.read_csv('C:/Users/admin/Desktop/pyda/ch06/ex6.csv',nrows=5) --->取前五行
  990. chunker=pd.read_csv('C:/Users/admin/Desktop/pyda/ch06/ex6.csv',chunksize=1000)
  991. tot=Series([])
  992. for price in chunker:
  993. tot=tot.add(price['key'].value_counts(),fill_value=0)
  994. tot=tot.order(ascending=False) --->chunk块
  995. --------------------逐块读取文件way2----------
  996. #-*- encoding:utf-8 -*-
  997. import numpy as np
  998. import os
  999. import pandas as pd
  1000. from pandas import Series,DataFrame
  1001. import matplotlib.pyplot as plt
  1002. import pandas.io.data as web
  1003. import csv
  1004. f = open('ex6.csv')
  1005. reader = csv.reader(f)
  1006. for line in reader:print(line)
  1007. lines = list(csv.reader(open('ex7.csv')))
  1008. header,values = lines[0],lines[1:]
  1009. print header
  1010. print values
  1011. #下面的 * 应该是取出值的意思
  1012. data_dict = {h:v for h,v in zip(header,zip(*values))}
  1013. print(data_dict)
  1014. class my_dialect(csv.Dialect):
  1015. lineterminator = '\n'
  1016. delimiter = ';'
  1017. quotechar = '"'
  1018. reader = csv.reader(f,dialect=my_dialect)
  1019. #csv语支的参数也可以用参数的形式给出
  1020. reader = csv.reader(f,delimiter = '|')
  1021. --------------------------------------------------------------------------------
  1022. ---------将数据写出到文本格式
  1023. data=pd.read_csv('C:/Users/admin/Desktop/pyda/ch06/ex5.csv')
  1024. data.to_csv('C:/Users/admin/Desktop/pyda/zz.csv') --->保存为csv
  1025. data.to_csv(sys.stdout,sep='|') --->保存为|分隔符
  1026. data.to_csv(sys.stdout,na_rep='NULL') --->输出结果中的缺失值用null或其他形式表示
  1027. data.to_csv(sys.stdout,na_rep='NULL',index=False,header=False) --->
  1028. data.to_csv(sys.stdout,na_rep='NULL',index=False,cols=['a','b','c']) ---> 指定列名
  1029. dates=pd.date_range('1/1/2000',periods=7)
  1030. ts=Series(np.arange(7),index=dates)
  1031. ts.to_csv('C:/Users/admin/Desktop/pyda/ts.csv')
  1032. ---------手工处理分隔符格式
  1033. import csv
  1034. f=open('C:/Users/admin/Desktop/pyda/ch06/ex7.csv')
  1035. reader=csv.reader(f) --->打开
  1036. for line in reader:
  1037. print(line)
  1038. lines=list(csv.reader(open('C:/Users/admin/Desktop/pyda/ch06/ex7.csv'))) --->简化后代码
  1039. class my_dialect(csv.Dialect):
  1040. lineterminator='\n'
  1041. delimiter=';'
  1042. quotechar='"'
  1043. reader=csv.reader(f,dialect=my_dialect)
  1044. reader=csv.reader(f,delimiter='|')
  1045. #6-3csv语支选项
  1046. delimiter 用于分隔字段的单字符字符串。默认为“,”
  1047. lineterminator 用于写操作的行结束符,默认为‘\r\n’,读操作将忽略此选项,他能认出跨平台的行结束符
  1048. quotechar 用于带有特殊字符(如分隔符)的字段引用符号,默认为“
  1049. skipinitialspace 忽略分隔符后面的空白符,默认为False
  1050. quoting 引用约定
  1051. doublequote 如何处理字段内的引用符号,如True则双写
  1052. escapechar 对分隔符进行转译的字符串
  1053. '''with open('C:/Users/admin/Desktop/pyda/ch06/mydata.csv','w') as f:
  1054. writer=csv.writer(f,dialect=my_dialect)
  1055. writer.writerow(('one','two','three'))
  1056. writer.writerow(('1','2','3'))
  1057. writer.writerow(('4','5','6'))
  1058. writer.writerow(('7','8','9'))''' #python3中此代码不可用
  1059. --------------json数据
  1060. import json
  1061. df=json.loads(obj)
  1062. asjson=json.dump(obj)
  1063. sublings=DataFrame(result['sublings'],columns=['name','age'])
  1064. --------------XML和HTML:Web信息收集
  1065. --------------二进制数据文件
  1066. frame = pd.read_csv('ex1.csv')
  1067. print frame
  1068. frame.save('frame_pickle') #存储为二进制文件
  1069. ok = pd.load('frame_pickle') #load函数
  1070. #ok1 = pd.read_table('frame_pickle') #不能用read_table函数
  1071. #print ok1
  1072. print ok
  1073. --------------读取Excel数据(详见uexcel)
  1074. xls_file = pd.ExcelFile('ex1.xlsx')
  1075. table = xls_file.parse('ex1')
  1076. print table
  1077. ----------------------------------------C7数据规整化:清洗 转换 合并 重塑----------------------------------------
  1078. https://www.cnblogs.com/virusolf/p/6226296.html
  1079. #encoding=gbk
  1080. import numpy as np
  1081. import pandas as pd
  1082. import matplotlib.pyplot as plt
  1083. from pandas import Series,DataFrame
  1084. import re
  1085. -----------------------------DataFrame合并
  1086. df1 = DataFrame({'key':['b','b','a','c','a','a','b'],'data1':range(7)})
  1087. df2 = DataFrame({'key':['a','b','d'],'data2':range(3)})
  1088. pd.merge(df1,df2) ---合并df1和df2,默认为inner(内连接)
  1089. pd.merge(df1,df2,on = 'key') ---合并键为key
  1090. pd.merge(df1,df2,how = 'outer') ---笛卡尔积合并
  1091. ---分别指定对象列名
  1092. df3 = DataFrame({'lkey':['b','b','a','c','a','a','b'],'data1':range(7)})
  1093. df4 = DataFrame({'rkey':['a','b','d'],'data2':range(3)})
  1094. pd.merge(df3,df4,left_on = 'lkey',right_on = 'rkey') ---当连接写的key在各自df中名称不同时指定左右既可
  1095. ---对多个键进行合并
  1096. left = DataFrame({'key1':['foo','foo','bar'],'key2':['one','two','one'],'lval':[1,2,3]})
  1097. right = DataFrame({'key1':['foo','foo','bar','bar'],'key2':['one','one','one','two'],'rval':[4,5,6,7]})
  1098. pd.merge(left,right,on = ['key1','key2'],how = 'outer')
  1099. ---通过suffixes选项指定后缀
  1100. pd.merge(left,right,on = 'key1',suffixes = ('_left','_right'))
  1101. #merge函数中的参数
  1102. left 合并左侧
  1103. right 合并右侧
  1104. how inner,outer,left,right其中之一,默认inner
  1105. on 用于连接的列名。必须存在于左右2个df对象中。如果未指定 且其他键也未指定,则以left和right列名的交集作为连接键
  1106. left_on 左侧df用作连接键的列
  1107. right_on 右侧df用作连接键的列
  1108. left_index 将左侧的行索引用作连接键
  1109. right_index 同上-右侧
  1110. sort 根据连接键对合并后的数据进行排序,默认为True.有时处理太体量数据集时 禁用可以获得更高的性能
  1111. suffixes 字符串元组,用于追加到重叠列名的末尾,默认为('_x','_y'),例如左右2个df都有data字段 则合并后为data_x,data_y
  1112. copy 设置为False,可以
  1113. -----------------------------索引上的合并
  1114. DataFrame中连接键有时候在索引中。这时可以传入left_index = True或者right_index = True
  1115. left1 = DataFrame({'key':list('abaabc'),'value':range(6)})
  1116. right1 = DataFrame({'group_val':[3.5,7]},index=['a','b'])
  1117. pd.merge(left1,right1,left_on = 'key',right_index = True,how = 'inner')
  1118. pd.merge(left1,right1,left_on = 'key',right_index = True,how = 'outer').fillna(0)
  1119. ---层次化索引 合并
  1120. lefth = DataFrame({'key1':['Ohio','Ohio','Ohio','Nevada','Nevada'],
  1121. 'key2':[2000,2001,2002,2001,2002],'data':np.arange(5.)})
  1122. righth = DataFrame(np.arange(12.).reshape((6,2)),index = [['Nevada','Nevada','Ohio','Ohio','Ohio','Ohio',],
  1123. [2001,2000,2000,2000,2001,2002]],columns = ['event1','event2'])
  1124. pd.merge(lefth,righth,left_on = ['key1','key2'],right_index = True,how = 'outer')
  1125. ---同时使用合并双方的索引也没问题
  1126. left2 = DataFrame([[1.,2.],[3.,4.],[5.,6.]],index = ['a','c','e'],columns = ['Ohio','Nevada'])
  1127. right2 = DataFrame([[7.,8.],[9.,10.],[11.,12.],[13,14]],index = ['b','c','d','e'],columns = ['Missouri','Alabama'])
  1128. pd.merge(left2,right2,how = 'outer',left_index = True,right_index = True)
  1129. ---左连接
  1130. left2.join(right2,how = 'outer',on='key')
  1131. another = DataFrame([[7.,8.],[9.,10.],[11.,12.],[16.,17.]],index = ['a','c','e','f'],columns = ['New York','Oregon'])
  1132. left2.join([right2,another],how = 'outer')
  1133. ---轴向连接p194
  1134. arr=np.arange(12).reshape((3,4))
  1135. np.concatenate([arr,arr],axis=1) -->横向拼接
  1136. s1=Series([0,1],index=['a','b'])
  1137. s2=Series([2,3,4],index=['c','d','e'])
  1138. s3=Series([5,6],index=['f','g'])
  1139. pd.concat([s1,s2,s3],axis=1)
  1140. s4=pd.concat([s1*5,s3])
  1141. pd.concat([s1,s4],axis=1,join_axes=[['a','c','b','e']]) -->同index
  1142. result=pd.concat([s1,s1,s3],keys=['one','two','three'])
  1143. result.unstack() -->堆叠
  1144. pd.concat([s1,s2,s3],axis=1,keys=['one','two','three'])
  1145. --df合并
  1146. df1=DataFrame(np.arange(6).reshape(3,2),index=['a','b','c'],columns=['three','four'])
  1147. df2=DataFrame(5+np.arange(4).reshape(2,2),index=['a','c'],columns=['three','four'])
  1148. pd.concat([df1,df2],axis=1,keys=['l1','l2'])
  1149. pd.concat({'l1':df1,'l2':df},axis=1)
  1150. --层次化索引
  1151. pd.concat([df1,df2],axis=1,keys=['l1','l2'],names=['upper','lower'])
  1152. --ignore 原有索引
  1153. df3=DataFrame(np.random.randn(3,4),columns=['a','b','c','d'])
  1154. df4=DataFrame(np.random.randn(2,3),columns=['a','b','d'])
  1155. pd.concat([df3,df4],ignore_indes=True)
  1156. --根据index交集合并
  1157. pd.concat([df3,df4],join='inner')
  1158. #concat中的参数
  1159. objs 参与连接的pandas对象的列表或字典
  1160. axis 轴向练级,默认为0
  1161. join inner/outer 默认为outer。指明其他轴上的索引是按交集inner还是并集outer进行合并
  1162. join_axes 指明用于其他n-1条轴的索引,不执行交/并集运算
  1163. keys 与连接对象有关的值,用于形成连接轴上的层次化索引
  1164. levels 指定用作层次化索引各级别上的索引,如果设置了keys和levels的话
  1165. names 创建分层级别名称
  1166. verify_integrity 检查结果对象新轴上的重复情况,如果发现则引发异常,默认False
  1167. ignore_index 忽略原连接轴上索引
  1168. -----------------合并重叠数据
  1169. a=Series([np.nan,2.5,np.nan,3.5,4.5,np.nan],index=['f','e','d','c','b','a'])
  1170. b=Series(np.arange(len(a),dtype=np.float64),index=['f','e','d','c','b','a'])
  1171. --Series的combine_first方法
  1172. b[:-2].combine_first(a[2:])
  1173. df1.combine_first(df2) -->类似于打补丁,如果df1为空,则用df2补足df1
  1174. -----重塑层次化索引
  1175. data=DataFrame(np.arange(6).reshape((2,3)),index=pd.Index(['ohio','colorado'],
  1176. name='state'),columns=pd.Index(['one','two','three'],name='number'))
  1177. result=data.stack()
  1178. result.unstack(0) 轴变换
  1179. df=DataFrame({'L':result,'R':result+5},columns=pd.Index(['L','R'],name='side'))
  1180. df.unstack('stste').stack('side')
  1181. 索引对换结合unstack使用
  1182. df.unstack('stste').stack('side').swaplevel(1,0).sortlevel(0)
  1183. -----剔除重复数据
  1184. data=DataFrame({'k1':['one']*3+['two']*4,'k2':[1,1,2,3,3,4,4]})
  1185. data.duplicated()
  1186. data.drop_duplicates() -->去重(默认为保留第一个出现的值)
  1187. data['v1']=range(7) -->加个v1列
  1188. data.drop_duplicates(['k1']) -->根据k1列去重
  1189. data.drop_duplicates(['k1','k2'],take_last=True) -->默认取最后一个值
  1190. -----------------------------利用函数或映射进行数据转换 map
  1191. data=DataFrame({'food':['bacon','pulled pork','bacon','pastrami',
  1192. 'corned beef','Bacon','pastrami','honey ham','nova lox'],
  1193. 'ounce':[4,3,12,6,7.5,8,3,5,6]})
  1194. meat={'bacon':'pig','pulled pork':'pig','pastrami':'cow','honey ham':'pig',
  1195. 'nova lox':'salmon','corned beef':'cow'}
  1196. data['animal']=data['food'].map(str.lower).map(meat) -->map映射(类似于vlookup)
  1197. data['food'].map(lambda x:meat[x.lower()])
  1198. -----------替换值
  1199. d=Series([1,22,3,99,-1,2,4])
  1200. d.replace([99,3],np.nan)
  1201. d.replace([99,3],[np.nan,0])
  1202. -----------重命名索引轴
  1203. 轴标签可以通过函数或映射来转换
  1204. da=DataFrame(np.arange(12).reshape((3,4)),index=['ohio','colorado','new york'],
  1205. columns=['one','two','three','four'])
  1206. da.index=da.index.map(str.upper) -->对da的index 进行map-upper处理
  1207. da.columns=da.columns.map(str.upper) -->对da的columns 进行map-upper处理
  1208. da.rename(index=str.title,columns=str.upper) -->也可以对标签进行rename操作
  1209. da.rename(index={'OHIO':'INDIAN'},columns={'THREE':'peekaboo'})
  1210. _=da.rename(index={'OHIO':'INDIAN'},inplace=True)
  1211. -----------------------------离散化和原面划分
  1212. 常见使用有 根据年龄段切分
  1213. ages=[20,22,25,27,24,26,35,37,39,45,66,45,98,25,33]
  1214. bins=[18,25,35,60,100]
  1215. cat=pd.cut(ages,bins) --->pd.cut(a,b)函数:list-a 根据b的规则切分
  1216. pd.value_counts(cat) --->实现年龄分段统计
  1217. --->pd.value_counts(pd.cut(ages,bins))
  1218. pd.cut(ages,[18,26,36,61,100],right=False) --->类似区间符号,(18..100] right为闭端
  1219. group_names=['younth','youngadult','middleaged','senior']
  1220. --->pd.value_counts(pd.cut(ages,bins,labels=group_names)) --->实现分段统计并修改段名
  1221. d2=np.random.rand(20)
  1222. pd.cut(d2,4,precision=2) --->根据d2最大最小值计算等长元面,并4等分,保留2位小数
  1223. d3=np.random.randn(1000)
  1224. cats=pd.qcut(d3,4) --->qut:按照样本分位数切割
  1225. --->pd.value_counts(pd.qcut(np.random.randn(1000),4))
  1226. pd.qcut(d3,[0,0.1,0.5,0.9,1]) --->自定义分位数
  1227. -----------------------------检测和过滤异常值
  1228. np.random.seed(12345)
  1229. data=DataFrame(np.random.randn(1000,4))
  1230. data.describe() --->数据描述
  1231. col=data[3]
  1232. col[np.abs(col)>3] --->选取abs>3的值
  1233. data[np.abs(data)>3]=np.sign(data)*3 --->sign函数 -1 0 1
  1234. -----------排列和随机采样(np.random.permutation)
  1235. df=DataFrame(np.arange(5*4).reshape((5,4)))
  1236. samper=np.random.permutation(5) --->创建随机数
  1237. df.take(samper) --->进行(take)随机采样
  1238. --->df.take(np.random.permutation(len(df))[:3])
  1239. bag=np.array([5,7,-1,6,4])
  1240. sampler=np.random.randint(0,len(bag),size=10) --->randint(a,b,c) 随机抽取a-b之间的c个数
  1241. draw=bag.take(sampler)
  1242. 基本逻辑是 take() 出np.random.permutation() 随机出的列标
  1243. ->bag=np.array([5,7,-1,6,4])
  1244. -->draw=bag.take(np.random.randint(0,len(bag),size=10))
  1245. -----------------------------计算指标/哑变量
  1246. df=DataFrame({'key':['b','b','a','c','a','b'],'data1':range(6)})
  1247. pd.get_dummies(df['key'])
  1248. dummies=pd.get_dummies(df['key'],prefix='key') --->给变量加一个前缀
  1249. df_with_dummy=df[['data1']].join(dummies)
  1250. ---结合get_dummies和cut
  1251. pd.get_dummies(pd.cut(np.random.rand(10),[0,0.2,0.4,0.6,0.8,1]))
  1252. -----------------------------字符串对象方法
  1253. v='a,b,zieox'
  1254. v.split(',') --->split
  1255. pieces=[x.strip() for x in v.split(',')] --->strip 用于修剪空白符(换行符)
  1256. first,second,third=pieces --->将列标中的值赋给f s t
  1257. first+'::'+second+'::'+third --->拼接
  1258. 或者
  1259. '::'.join(pieces) --->join拼接方法
  1260. v.count(',') --->count方法 类似select count(',') from v
  1261. v.replace(',','-') --->replace方法
  1262. #python内置的字符串方法
  1263. count count
  1264. endswith/startswith(v) 如果字符串以v结尾/开始则返回true,例 v.startswith('a')
  1265. join join拼接方法,'+'.join(pieces) ->a+b+zieox
  1266. index 查找字符在字符串内位置,v.index('o')->7 字符不在字符串内则报错
  1267. find 与index一样,不过若字符不在字符串内则返回-1
  1268. rfind 如果找到,返回第一个找到的位置
  1269. replace 替换 v.replace('a','A')
  1270. strip/rstrip/lstrip 去除空白符(左/右)
  1271. split 拆分
  1272. lower/upper 全小/大写
  1273. ljust/rjust 用空格(或其他字符)填充字符串的空白处返回最低宽度字符要求
  1274. 类似impala中的兰帕德函数,lpad(str,10,'-') ->select lpad('apple',10,'-')
  1275. ----------------------------------------正则表达式----------------------------------------
  1276. t='i have\t an \tapple'
  1277. re.split('\s+',t)
  1278. http://www.runoob.com/python3/python3-reg-expressions.html
  1279. https://www.cnblogs.com/dyfblog/p/5880728.html
  1280. #re
  1281. 一.元字符 (参见 python 模块 re 文档)
  1282. . 匹配任意字符(不包括换行符)
  1283. ^ 匹配开始位置,多行模式下匹配每一行的开始
  1284. $ 匹配结束位置,多行模式下匹配每一行的结束
  1285. * 匹配前一个元字符0到多次
  1286. + 匹配前一个元字符1到多次
  1287. ? 匹配前一个元字符01
  1288. {m,n} 匹配前一个元字符m到n次
  1289. \\ 转义字符,跟在其后的字符将失去作为特殊元字符的含义,例如\\.只能匹配.,不能再匹配任意字符
  1290. [] 字符集,一个字符的集合,可匹配其中任意一个字符
  1291. | 逻辑表达式 或 ,比如 a|b 代表可匹配 a 或者 b
  1292. (...) 分组,默认为捕获,即被分组的内容可以被单独取出,默认每个分组有个索引,从 1 开始,按照"("的顺序决定索引值
  1293. (?iLmsux) 分组中可以设置模式,iLmsux之中的每个字符代表一个模式,用法参见 模式 I
  1294. (?:...) 分组的不捕获模式,计算索引时会跳过这个分组
  1295. (?P<name>...) 分组的命名模式,取此分组中的内容时可以使用索引也可以使用name
  1296. (?P=name) 分组的引用模式,可在同一个正则表达式用引用前面命名过的正则
  1297. (?#...) 注释,不影响正则表达式其它部分,用法参见 模式 I
  1298. (?=...) 顺序肯定环视,表示所在位置右侧能够匹配括号内正则
  1299. (?!...) 顺序否定环视,表示所在位置右侧不能匹配括号内正则
  1300. (?<=...) 逆序肯定环视,表示所在位置左侧能够匹配括号内正则
  1301. (?<!...) 逆序否定环视,表示所在位置左侧不能匹配括号内正则
  1302. (?(id/name)yes|no) 若前面指定id或name的分区匹配成功则执行yes处的正则,否则执行no处的正则
  1303. \number 匹配和前面索引为number的分组捕获到的内容一样的字符串
  1304. \A 匹配字符串开始位置,忽略多行模式
  1305. \Z 匹配字符串结束位置,忽略多行模式
  1306. \b 匹配位于单词开始或结束位置的空字符串
  1307. \B 匹配不位于单词开始或结束位置的空字符串
  1308. \d 匹配一个数字, 相当于 [0-9]
  1309. \D 匹配非数字,相当于 [^0-9]
  1310. \s 匹配任意空白字符, 相当于 [ \t\n\r\f\v]
  1311. \S 匹配非空白字符,相当于 [^ \t\n\r\f\v]
  1312. \w 匹配数字、字母、下划线中任意一个字符, 相当于 [a-zA-Z0-9_]
  1313. \W 匹配非数字、字母、下划线中的任意字符,相当于 [^a-zA-Z0-9_]
  1314. 二.模式
  1315. I IGNORECASE, 忽略大小写的匹配模式, 样例如下
  1316. s = 'hello World!'
  1317. regex = re.compile("hello world!", re.I)
  1318. regex.match(s).group()
  1319. #output> 'Hello World!'
  1320. #在正则表达式中指定模式以及注释
  1321. regex = re.compile("(?#注释)(?i)hello world!")
  1322. print regex.match(s).group()
  1323. #output> 'Hello World!'
  1324. M MULTILINE,多行模式, 改变 ^ 和 $ 的行为
  1325. s = '''first line second line third line'''
  1326. # ^
  1327. regex_start = re.compile("^\w+")
  1328. regex_start.findall(s)
  1329. # output> ['first']
  1330. regex_start_m = re.compile("^\w+", re.M)
  1331. regex_start_m.findall(s)
  1332. # output> ['first', 'second', 'third']
  1333. #$
  1334. regex_end = re.compile("\w+$")
  1335. regex_end.findall(s)
  1336. # output> ['line']
  1337. regex_end_m = re.compile("\w+$", re.M)
  1338. regex_end_m.findall(s)
  1339. # output> ['line', 'line', 'line']
  1340. S DOTALL,此模式下 '.' 的匹配不受限制,可匹配任何字符,包括换行符
  1341. s = '''first line second line third line'''
  1342. regex = re.compile(".+")
  1343. regex.findall(s)
  1344. # output> ['first line', 'second line', 'third line']
  1345. # re.S
  1346. regex_dotall = re.compile(".+", re.S)
  1347. regex_dotall.findall(s)
  1348. # output> ['first line\nsecond line\nthird line']
  1349. ----------------------USDA食品数据库范例
  1350. import json
  1351. db=json.load(open('E:/work/qbao/PY-W-new/pydata-book-master/ch07/foods-2011-10-03.json'))
  1352. len(db)
  1353. db[0].keys() --->查看列表title
  1354. key=[ i for i in db[0].keys()]
  1355. db[0]['nutrients'][0] --->查看nutrients下的结构
  1356. nutrients=DataFrame(db[0]['nutrients']) --->将nutritients载入df
  1357. info_key=['description','group','id','manufacture']
  1358. info=DataFrame(db,columns=info_key) --->读取db并取出相应列
  1359. pd.value_counts(info.group)[:10] --->统计group信息
  1360. n=[]
  1361. for rec in db:
  1362. funts=DataFrame(rec['nutrients'])
  1363. funts['id']=rec['id']
  1364. n.append(funts)
  1365. nutrients=pd.concat(n,ignore_index=True)
  1366. nutrients.duplicated().sum() --->去重
  1367. nutrients=nutrients.drop_duplicates() --->丢弃
  1368. col_mapping={'description':'food','group':'fgroup'}
  1369. info=info.rename(columns=col_mapping,copy=False)
  1370. col={'description':'nutrient','group':'nutgroup'}
  1371. nutrients=nutrients.rename(columns=col,copy=False)
  1372. ndata=pd.merge(nutrients,info,on='id',how='outer') --->合并nutrients和info
  1373. ndata.ix[30000]
  1374. ---
  1375. result=ndata.groupby(['nutrient','fgroup'])['value'].quantile(0.5)
  1376. #result['Zinc, Zn'].order().plot(kind='barh')
  1377. by_nutrient=ndata.groupby(['nutgroup','nutrient'])
  1378. get_max=lambda x: x.xs(x.value.idmax())
  1379. get_min=lambda x: x.xs(x.value.idmin())
  1380. #max_foods=by_nutrient.apply(get_max)[['value','food']]
  1381. max_foods.food=max_foods.food.str[:50]
  1382. ---------------------------------------------C8 绘图可视化---------------------------------------------
  1383. ------matplotlib
  1384. matplotlib官方文档 https://matplotlib.org/
  1385. #---figure和subplot
  1386. import matplotlib.pyplot as pl
  1387. import numpy as np
  1388. import pandas as pd
  1389. from pandas import Series,DataFrame
  1390. fig=pl.figure()
  1391. #定义一个图
  1392. ax1=fig.add_subplot(2,2,1)
  1393. ax2=fig.add_subplot(2,2,2)
  1394. ax3=fig.add_subplot(2,2,3)
  1395. #画一个2*2*3的subplot
  1396. #建一个2行3列的subplot
  1397. fig=pl.figure()
  1398. fig,axes=pl.subplots(2,3)
  1399. #在2*2 3 的版面上画一个虚线图 一个hist 一个虚线图
  1400. from numpy.random import randn
  1401. fig=pl.figure()
  1402. ax1=fig.add_subplot(2,2,1)
  1403. ax2=fig.add_subplot(2,2,2)
  1404. ax3=fig.add_subplot(2,2,3)
  1405. pl.plot(randn(50).cumsum(),'k--')
  1406. _ =ax1.hist(randn(100),bins=20,color='k',alpha=0.3)
  1407. ax2.scatter(np.arange(30),np.arange(30)+randn(30))
  1408. #---pyplot.subplots的选项
  1409. nrows subplot的行数
  1410. ncols subplot的列数
  1411. sharx 共享x轴
  1412. shary 共享y周
  1413. subplot_kw 用于创建各subplot的关键字字典
  1414. **fig_kw 创建figure时的其他关键字,如plt.subplots(2,2,figesiz=(8,6))
  1415. #调整subplot周围的距离
  1416. #wspace和hspace用于调整宽高百分比
  1417. subplot_adjust(left=None,bottom=None,right=None,top=None,wspace=None,hspace=None)
  1418. fig,axes=pl.subplots(2,2,sharey=True)
  1419. for i in range(2):
  1420. for j in range(2):
  1421. axes[i,j].hist(randn(50),bins=50,color='k',alpha=0.5)
  1422. pl.subplots_adjust(wspace=0,hspace=0)
  1423. #---颜色,标记和线型
  1424. ax.plot(x,y,linestyle='--',color='g')
  1425. #plot 线条样式参数
  1426. 字符 描述
  1427. - 实线
  1428. -- 虚线
  1429. -. 点线
  1430. : 点虚线
  1431. . 点
  1432. , 像素
  1433. o 圆形
  1434. v 朝下的三角形
  1435. ^ 朝上的三角形
  1436. < 朝左的三角形
  1437. > 朝右的三角形
  1438. 1 tri_down marker
  1439. 2 tri_up marker
  1440. 3 tri_left marker
  1441. 4 tri_right marker
  1442. s 正方形
  1443. p 五角形
  1444. * 星型
  1445. h 1号六角形
  1446. H 2号六角形
  1447. + +号标记
  1448. x x号标记
  1449. D 钻石形
  1450. d 小版钻石形
  1451. | 垂直线形
  1452. _ 水平线行
  1453. ko-- 点线
  1454. #线条颜色参数
  1455. 字符 颜色
  1456. b 蓝色
  1457. g 绿色
  1458. r 红色
  1459. c 青色
  1460. m 品红
  1461. y 黄色
  1462. k 黑色
  1463. w 白色
  1464. RGB色参数
  1465. https://www.cnblogs.com/darkknightzh/p/6117528.html
  1466. #带标记的线型图
  1467. pl.plot(randn(30).cumsum(),'ko--')
  1468. pl.plot(randn(30).cumsum(),color='k',linestyle='dashed',marker='o')
  1469. #
  1470. data=randn(30).cumsum()
  1471. pl.plot(data,'k--',label='Default')
  1472. pl.plot(data,'k-',drawstyle='steps-post',label='step-post')
  1473. pl.legend(loc='best')
  1474. #刻度,标签和图例
  1475. xlim,xticks,xticklabels
  1476. ax.set_xlim,ax.set_xlim
  1477. #设置标题,轴标签,刻度及刻度线
  1478. fig=pl.figure()
  1479. ax=fig.add_subplot(1,1,1)
  1480. ax.plot(randn(1000).cumsum())
  1481. #设置x,y轴刻度,轴标签,表名title
  1482. ticks=ax.set_xticks([0,250,500,750,1000])
  1483. labels=ax.set_xticklabels(['one','two','three','four','five'],rotation=30,fontsize='small')
  1484. ax.set_title('made by :zieox')
  1485. ax.set_xlabel('stage')
  1486. #添加图例(legend)
  1487. fig=pl.figure()
  1488. ax=fig.add_subplot(1,1,1)
  1489. ax.plot(randn(1000).cumsum(),'k',label='one',color='y')
  1490. ax.plot(randn(1000).cumsum(),'k--',label='two',color='b')
  1491. ax.plot(randn(1000).cumsum(),'k.',label='three',color='r')
  1492. ax.legend(loc='best')
  1493. #注解以及在subplot上绘图
  1494. ax.text(x,y,'hello word',family='monospace',fontszie=10)
  1495. #例:给 2008-2009年金融危机期间的重要日期 加上标注
  1496. from datetime import datetime
  1497. fig=pl.figure()
  1498. ax=fig.add_subplot(1,1,1)
  1499. data=pd.read_csv('E:/work/qbao/PY-W-new/pydata-book-master/ch08/spx.csv',index_col=0,parse_dates=True)
  1500. spx=data['SPX']
  1501. spx.plot(ax=ax,style='k-')
  1502. crisis_data=[(datetime(2017,10,11),'peak of bull market'),
  1503. (datetime(2008,3,12),'bear stearns fails'),
  1504. (datetime(2008,9,15),'lehman bankruptcy')]
  1505. for date,label in crisis_data:
  1506. ax.annotate(label,xy=(date,spx.asof(date)+50),
  1507. xytext=(date,spx.asof(date)+200),
  1508. arrowprops=dict(facecolor='black'),
  1509. horizontalalignment='left',verticalalignment='top')
  1510. #|放大到2017-2010
  1511. ax.set_xlim(['1/1/2007','1/1/2011'])
  1512. ax.set_ylim([600,1800])
  1513. ax.set_title('import dates in 2008-2009 fincial crisis')
  1514. ax.set_title('Important dates in 2008-2009 finacial crisis')
  1515. pl.show()
  1516. #绘制图形 长方形 椭圆 三角
  1517. fig = pl.figure()
  1518. ax = fig.add_subplot(1,1,1)
  1519. rect = pl.Rectangle((0.2,0.75),0.4,0.15,color = 'k',alpha = 0.3)
  1520. circ = pl.Circle((0.7,0.2),0.15,color = 'b',alpha = 0.3)
  1521. pgon = pl.Polygon([[0.15,0.15],[0.35,0.4],[0.2,0.6]],color = 'g',alpha = 0.5)
  1522. ax.add_patch(rect)
  1523. ax.add_patch(circ)
  1524. ax.add_patch(pgon)
  1525. pl.show()
  1526. #将图标保存到文件
  1527. pl.save('C:/desktop/image.svg',dpi=400,bbox_inches='tight')
  1528. #不一定save到文件中,也可以写入任何文件型对象,比如StringIO:
  1529. buffer = StringIO()
  1530. plt.savefig(buffer)
  1531. plot_data = buffer.getvalue()
  1532. #figure.savefig选项
  1533. fname 含有文件路径的字符串或python的文件类型
  1534. dpi 图像分辨率(每英寸点数)默认100
  1535. faceolor,edgrcolor 图像的背景色,默认为‘w’
  1536. format 显式设置文件格式(png,pdf,svg,ps,eps)
  1537. bbox_inches 图表需要保存的部分,如果设置为tight,则将尝试剪除图表周围的空白部分
  1538. #matplotlib配置
  1539. pl.rc('figure',figsize=(10,10))
  1540. font_options={'family':'monospace','weight':'blod','size':'small'}
  1541. pl.rc('font',**font_options)
  1542. #例 1列2行的排版
  1543. fig=pl.figure()
  1544. ax=fig.add_subplot(1,1,1)
  1545. ax2=fig.add_subplot(2,1,1)
  1546. ax.plot(randn(1000).cumsum())
  1547. ax2.plot(randn(500))
  1548. ------pandas 中的绘图函数
  1549. #style见上方
  1550. s=Series(np.random.rand(10).cumsum(),index=np.arange(0,100,10))
  1551. s.plot()
  1552. #Series.plot方法参数
  1553. label 用于图例标签
  1554. ax 要在ax上绘制matplotlib subplot对象,如果没有设置 则使用当前m s
  1555. style 将要传给matplotlib的风格字符
  1556. alpha 图表的不透明度
  1557. kind 可以是'line','barh','kde'
  1558. logy 在Y轴上使用对数标尺
  1559. use_index 将对象的索引用作刻度标签
  1560. rot 旋转刻度标签(0360)
  1561. xticks 用作x轴刻度值
  1562. yticks 用作y轴刻度值
  1563. xlim x轴的界限(例[0,10])
  1564. ylim Y轴的界限
  1565. grid 显示轴网络
  1566. #DataFrame的plot参数
  1567. subplots 将各个DataFrame;列绘制到单独的subplot中
  1568. sharex if sharx=True 则共享x轴刻度和界限
  1569. sharey if shary=True 则共享y轴刻度和界限
  1570. figsize 表示图像大小的元祖
  1571. title 表示图像标题的字符串
  1572. legend 添加一个subplot图例(默认为True)
  1573. sort_columns 以字母表顺序绘制各列,默认使用当前列顺序
  1574. #2行1列的subplots
  1575. fig,axes=pl.subplots(2,1)
  1576. data=Series(np.random.rand(16),index=list('abcdefghijklmnop'))
  1577. data.plot(kind='bar',ax=axes[0],color='k',alpha=0.7)
  1578. data.plot(kind='barh',ax=axes[1],color='k',alpha=0.7)
  1579. #df绘图
  1580. df=DataFrame(np.random.rand(6,4),index=['one','two','three','four','five','six'],
  1581. columns=pd.Index(['A','B','C','D'],name='Genus'))
  1582. df.plot(kind='bar')
  1583. #例:DataFrame百分比占比图
  1584. tips=pd.read_csv('E:/work/qbao/PY-W-new/pydata-book-master/ch08/tip.csv')
  1585. party_counts=pd.crosstab(tips.day,tips.size)
  1586. party_counts=party_counts.ix[:,2:5]
  1587. #然后进行归一化是各行和为1
  1588. party_pcts = party_counts.div(party_counts.sum(1).astype(float),axis = 0)
  1589. print party_pcts
  1590. party_pcts.plot(kind = 'bar',stacked = True)
  1591. plt.show()
  1592. -----直方图和密度图hist
  1593. #平均小费百分比
  1594. #add column tip_pct
  1595. tips['tip_pct']=tips['tip']/tips['total_bill']
  1596. tips['tip_pct'].hist(bins=50)
  1597. tips['tip_pct'].plot(kind='kde') --->小费百分比密度图
  1598. #曲线+hist图
  1599. comp1 = np.random.normal(0,1,size = 200)
  1600. comp2 = np.random.normal(10,2,size = 200)
  1601. values = Series(np.concatenate([comp1,comp2]))
  1602. values.hist(bins = 100,alpha = 0.3,color = 'k',normed = True)
  1603. values.plot(kind = 'kde',style = 'k--')
  1604. #散布图
  1605. macro=pd.read_csv('E:/work/qbao/PY-W-new/pydata-book-master/ch08/macrodata.csv')
  1606. data = macro[['cpi','m1','tbilrate','unemp']]
  1607. trans_data = np.log(data).diff().dropna()
  1608. pl.scatter(trans_data['m1'],trans_data['unemp'])
  1609. pl.title('Changes in log %s vs. log %s'%('m1','unemp'))
  1610. pd.scatter_matrix(trans_data,diagonal = 'kde',color = 'k',alpha = 0.3)
  1611. pd.scatter_matrix(trans_data,diagonal = 'hist',color = 'k',alpha = 0.3)
  1612. pl.show()
  1613. --------------------------------------------DS-CP3
  1614. #example-matplotlib
  1615. from matplotlib import pyplot as pl
  1616. year=[1950,1960,1970,1980,1990,2000,2010]
  1617. gdp=[300.2,543.3,1075.9,2862.5,5979.6,10289.7,14958.3]
  1618. pl.plot(year,gdp,color='green',marker='o',linestyle='solid')
  1619. pl.title('name-GDP')
  1620. pl.ylabel('billion$')
  1621. pl.show()
  1622. ------bar (条形图)
  1623. #coding:utf-8
  1624. movies=['old boy','revenages','iron-man','starwar','HelloKitty']
  1625. num_oscars=[11,65,53,26,11]
  1626. #在3.6中此操作将条形放置于中心左侧
  1627. xs=[i+0.1 for i ,_ in enumerate(movies)]
  1628. pl.bar(xs,num_oscars)
  1629. pl.ylabel('num of get_oscar')
  1630. pl.title('my favourite movie')
  1631. pl.xticks([i+0.5 for i ,_ in enumerate(movies)],movies)
  1632. pl.show()
  1633. #example3
  1634. from collections import Counter
  1635. grades=[86,45,46,79,13,49,79,65,35,46]
  1636. #//取整
  1637. decile=lambda grade:grade//10*10
  1638. #用counter计数器计数
  1639. histgram=Counter(decile(grade) for grade in grades)
  1640. #分别按照histgrame的key和value计数值作图,其中设置宽度为8
  1641. pl.bar([x for x in histgram.keys()],histgram.values(),8)
  1642. #设置x,y轴取值范围
  1643. pl.axis([-5,105,0,5])
  1644. #设置x轴的标记点
  1645. pl.xticks([10*i for i in range(11)])
  1646. pl.xlabel('+scorelike')
  1647. pl.ylabel('num of students')
  1648. pl.title('score-pic')
  1649. pl.show()
  1650. #example4
  1651. mentions=[500,505]
  1652. years=[2013,2014]
  1653. pl.bar(years,mentions,0.8)
  1654. pl.xticks(years)
  1655. pl.ylabel('mentioned ds')
  1656. pl.ticklabel_format(useOffset=False)
  1657. pl.axis([2012.5,2014.5,499,506])
  1658. pl.title('look this is a big change')
  1659. pl.show()
  1660. #now we set x,y -value_range
  1661. pl.axis([2013,2015,0,550])
  1662. pl.show()
  1663. ------line picture (线图)
  1664. '''#easy_way
  1665. varience=[2**(i-1) for i in range(1,10)]
  1666. bias_aquared=sorted(varience,reverse=True)'''
  1667. varience=[1, 2, 4, 8, 16, 32, 64, 128, 256]
  1668. bias_aquared=[256, 128, 64, 32, 16, 8, 4, 2, 1]
  1669. total_error=[x+y for x,y in zip(varience,bias_aquared)]
  1670. xs=[i for i ,_ in enumerate(varience)]
  1671. pl.plot(xs,varience,'g-',label='varience')
  1672. pl.plot(xs,bias_aquared,'r-.',label='bias^2')
  1673. pl.plot(xs,total_error,'b:',label='total_error')
  1674. #loc=9指(tag框)顶部中央
  1675. pl.legend(loc=9)
  1676. pl.xlabel('model-complex_value')
  1677. pl.title('bias - var picture')
  1678. pl.show()
  1679. ------scatter 散点图
  1680. import random
  1681. '''friends=[random.randint(1,100) for _ in range(10)]
  1682. minutes=[random.randint(100,200) for _ in range(10)]'''
  1683. #这里我们不用随机数
  1684. friends=[61, 73, 80, 93, 13, 26, 57, 59, 88, 84]
  1685. minutes=[157, 184, 101, 198, 196, 158, 178, 150, 113, 154]
  1686. labels=['a','b','c','d','e','f','g','h','i','j']
  1687. pl.scatter(friends,minutes)
  1688. for label,friend_count,minute_count in zip(labels,friends,minutes):
  1689. pl.annotate(label,
  1690. xy=(friend_count,minute_count),
  1691. xytext=(-5,5),
  1692. textcoords='offset points')
  1693. pl.title('num_minutes&friends')
  1694. pl.xlabel('num of friend')
  1695. pl.ylabel('minutes of spending')
  1696. pl.show()
  1697. '''#在这里我们实验一下在轴上放置tag,利用annotate,xytext为位移,axis为xy轴的值域
  1698. pl.bar([i for i in range(10)],minutes)
  1699. pl.axis([-1,10,0,200])
  1700. for label,i,j in zip(labels,[i for i in range(10)],minutes):
  1701. pl.annotate(label,
  1702. xy=(i,j),
  1703. xytext=(-5,5),
  1704. textcoords='offset points')'''
  1705. -------------------------------------------------CP9 数据聚合分组------------------------------------------------
  1706. ----------------------------------cp9数据聚合与groupby
  1707. https://www.cnblogs.com/virusolf/p/6259614.html
  1708. -------简单实例
  1709. import numpy as np
  1710. import pandas as pd
  1711. import matplotlib.pyplot as plt
  1712. from pandas import Series,DataFrame
  1713. df=DataFrame({'key1':list('aaba'),'key2':['one','two','one','two','one'],
  1714. 'data1':np.random.randn(5),'data2':np.random.randn(5)})
  1715. grouped=df['data1'].groupby(df['key1'])
  1716. #对data1列 聚合根据key1为分组键
  1717. print(grouped.mean())
  1718. means=df['data1'].groupby([df['key1'],df['key2']]).mean()
  1719. #对data1列 聚合根据key1,key2为分组键
  1720. print(means.unstack())
  1721. states=np.array(['ohio','california','Ohio','Ohio'])
  1722. years=np.array([2005,2005,2006,2005,2006])
  1723. df['data1'].groupby([states,years]).mean()
  1724. #根据指定键进行分组
  1725. df.groupby('key1').mean()
  1726. df.groupby(['key1','key2']).mean()
  1727. df.groupby(['key1','key2']).size()
  1728. -------对分组进行迭代
  1729. df =DataFrame({'key1':list('aabba'),'key2':['one','two','one','two','one'],
  1730. 'data1':np.random.randn(5),'data2':np.random.randn(5)})
  1731. print df.groupby('key1')
  1732. for name,group in df.groupby('key1'):
  1733. print('one')
  1734. print(name)
  1735. print(group,'\n')
  1736. #多重键的情况,元组的第一个元素将会是由键值组成的元组,下面会打印四个two
  1737. #也就是说,下面的三个print是一个组合,打印key值这一点挺好
  1738. for (k1,k2),group in df.groupby(['key1','key2']):
  1739. print 'two'
  1740. print k1,k2
  1741. print group,'\n'
  1742. #当然,可以对数据片段进行操作
  1743. #转换为字典,应该是比较有用的一个转换方式
  1744. list(df.groupby('key1'))
  1745. pieces=dict(list(df.groupby('key1')))
  1746. pieces['a']
  1747. type(pieces['a'])
  1748. pieces['a'][['data1','data2']]
  1749. #group by 默认在axis=0上进行分组,也可以在任何轴上分组
  1750. df.dtypes
  1751. grouped=df.groupby(df.dtypes,axis=1)
  1752. dict(list(grouped)) #将grouped装入dict
  1753. -------选取一个或一组列
  1754. df =DataFrame({'key1':list('aabba'),'key2':['one','two','one','two','one'],
  1755. 'data1':np.random.randn(5),'data2':np.random.randn(5)})
  1756. df.groupby('key1')['data1']
  1757. df.groupby('key1')[['data1']]
  1758. #语法糖
  1759. df['data1'].groupby(df['key1'])
  1760. df[['data1']].groupby(df['key1'])
  1761. #尤其对于大数据集,可能只是对部分列进行聚合。比如,想计算data2的均值并返回DataFrame
  1762. df.groupby(['key1','key2'])[['data2']].mean()
  1763. -------通过字典或Series进行分组
  1764. people = DataFrame(np.random.randn(5,5),columns = ['a','b','c','d','e'],
  1765. index = ['Joe','Steve','Wes','Jim','Travis'])
  1766. people.ix[2:3,['b','c']] = np.nan #加点NaN
  1767. #假设已经知道列的分组方式,现在需要利用这个信息进行分组统计:
  1768. mapping = {'a':'red','b':'red','c':'blue','d':'blue','e':'red','f':'orange'}
  1769. #下面为groupby传入一个已知信息的字典
  1770. by_column = people.groupby(mapping,axis = 1)
  1771. by_column.sum()
  1772. map_series = Series(mapping)
  1773. people.groupby(map_series,axis = 1).count()
  1774. -------利用函数进行分组
  1775. people=DataFrame(np.random.randn(5,5),columns=['a','b','c','d','e'],
  1776. index=['joe','steve','wes','jim','travis'])
  1777. people.groupby(len).sum() #根据名字长度相同的人进行加和
  1778. #将函数、数组、字典、Series混用也ok,因为最终都会转换为数组
  1779. key_list = ['one','one','one','two','two']
  1780. people.groupby([len,key_list]).min()
  1781. -------根据索引级别分组
  1782. #层次化索引数据集最方便的地方就在于它能够根据索引级别进行聚合。要实现该目的,只要通过level关键字传入级别编号或名称即可
  1783. columns = pd.MultiIndex.from_arrays([['US','US','US','JP','JP'],[1,3,5,1,3]],names = ['cty','tenor'])
  1784. hier_df = DataFrame(np.random.randn(4,5),columns = columns)
  1785. print (hier_df)
  1786. print (hier_df.groupby(level = 'cty',axis = 1).count())
  1787. print (hier_df.groupby(level = 'tenor',axis = 1).count())
  1788. print (hier_df.groupby(level = ['cty','tenor'],axis = 1).count())
  1789. -------数据聚合
  1790. df =DataFrame({'key1':list('aabba'),'key2':['one','two','one','two','one'],
  1791. 'data1':np.random.randn(5),'data2':np.random.randn(5)})
  1792. grouped = df.groupby('key1')
  1793. grouped['data1'].quantile(0.9) #切片
  1794. #对于自己定义的聚合函数,只需将其传入aggregate或agg即可
  1795. def peak_to_peak(arr):
  1796. return arr.max() - arr.min()
  1797. print grouped.agg(peak_to_peak),
  1798. grouped.describe() #有些方法(describe)也是可以应用的
  1799. #经过优化的groupby的方法
  1800. count 分组中非NA值得数量
  1801. sum 非NA和
  1802. mean 非NA均值
  1803. median 非NA的算术中位数
  1804. std,var 无偏(分母为n-1)标准差和方差
  1805. min,max 非NA值 最大 最小
  1806. prod 非NA值得积
  1807. first,last 第一个和随后一个非NA值
  1808. -------面向列的多函数应用
  1809. tips = pd.read_csv('E:\\tips.csv')
  1810. #增加小费占比一列
  1811. tips['tip_pct'] = tips['tip'] / tips['total_bill']
  1812. print (tips.head())
  1813. grouped = tips.groupby(['sex','smoker'])
  1814. grouped_pct = grouped['tip_pct']
  1815. print(grouped_pct.agg('mean'))
  1816. #若传入一组函数或函数名,得到的DataFrame的列就会以相应的函数命名
  1817. def peak_to_peak(arr):
  1818. return arr.max() - arr.min()
  1819. print(grouped_pct.agg(['mean','std',peak_to_peak])) #对比例这一列应用三个函数
  1820. #上面有个问题就是列名是自动给出的,以函数名为列名,若传入元组
  1821. #(name,function)组成的列表,就会自动将第一个元素作为列名
  1822. print (grouped_pct.agg([('foo','mean'),('bar',np.std)])) #注意np.std不能加引号
  1823. #还可以对多列应用同一函数
  1824. functions = ['count','mean','max']
  1825. result = grouped['tip_pct','total_bill'].agg(functions) #对两列都应用functions
  1826. result['tip_pct']
  1827. ftuples = [('DDD','mean'),('AAA',np.var)]
  1828. print (grouped['tip_pct','total_bill'].agg(ftuples))
  1829. #如果想对不同的列应用不同的函数,具体的办法是向agg传入一个从列映射到函数的字典
  1830. print (grouped.agg({'tip':np.max,'size':sum})) #sum这样的函数可以加引号或者不加
  1831. print (grouped.agg({'tip':['min','max','mean','std'],'size':sum}))
  1832. -------以‘无索引’的方式返回聚合数据
  1833. tips = pd.read_csv('E:\\tips.csv')
  1834. #增加小费占比一列
  1835. tips['tip_pct'] = tips['tip'] / tips['total_bill']
  1836. print tips.head()
  1837. print tips.groupby(['sex','smoker'],as_index = False).mean() #这里的形式可能有时候更好用
  1838. -------分组级运算和转换
  1839. #下面为DataFrame添加一个用于存放各索引分组平均值的列。一个办法是先聚合在合并:
  1840. df =DataFrame({'key1':list('aabba'),'key2':['one','two','one','two','one'],
  1841. 'data1':np.random.randn(5),'data2':np.random.randn(5)})
  1842. k1_means = df.groupby('key1').mean().add_prefix('mean_')
  1843. #下面用左边的key1作为连接键,right_index是将右边的行索引作为连接键
  1844. print pd.merge(df,k1_means,left_on = 'key1',right_index = True)
  1845. #上面的方法虽然也行,但是不灵活。可以看作利用mean函数对数据的两列进行转换。
  1846. people = DataFrame(np.random.randn(5,5),columns = ['a','b','c','d','e'],
  1847. index = ['Joe','Steve','Wes','Jim','Travis'])
  1848. print people
  1849. key = ['one','two','one','two','one']
  1850. print people.groupby(key).mean()
  1851. #看下面神奇的事情
  1852. print people.groupby(key).transform(np.mean),'\n'
  1853. #不难看出,transform会将一个函数应用到各个分组并将结果放置到适当的位置,
  1854. #如果各分组产生的是一个标量值,则改值就会被广播出去
  1855. #下面的例子很说明问题,很灵活
  1856. def demean(arr):
  1857. return arr - arr.mean()
  1858. demeaned = people.groupby(key).transform(demean)
  1859. print demeaned,'\n'
  1860. #下面检查一下demeaned各组均值是否为0
  1861. print demeaned.groupby(key).mean()
  1862. -------apply:一般性的“拆分-应用-合并”
  1863. tips = pd.read_csv('E:\\tips.csv') #增加小费占比一列
  1864. tips['tip_pct'] = tips['tip'] / tips['total_bill']
  1865. #print tips.head()
  1866. #下面找出指定列的最大的几个值,然后将所在行选出来
  1867. def top(df,n = 5,column = 'tip_pct'):
  1868. return df.sort_index(by = column)[-n:]
  1869. print top(tips,n = 6)
  1870. #如果对smoker分组并用该函数调用apply
  1871. print tips.groupby('smoker').apply(top),'\n'
  1872. #上面实际上是在各个片段上调用了top,然后用pd.concat进行了连接,并以分组名称进行了标记,于是就形成了层次化索引
  1873. #当然可以向top函数传入参数
  1874. print tips.groupby(['smoker','day']).apply(top,n = 1,column = 'total_bill')
  1875. #需要说明的是:apply很强大,需要发挥想象力,它只需返回一个pandas对象或者标量值即可
  1876. #之前曾经这么做过:
  1877. result = tips.groupby('smoker')['tip_pct'].describe()
  1878. print result,'\n'
  1879. print result.unstack('smoker'),'\n'
  1880. #下面的方式,效果一样
  1881. f = lambda x : x.describe()
  1882. print tips.groupby('smoker')['tip_pct'].apply(f),'\n'
  1883. #对所有列都行
  1884. print tips.groupby('smoker').apply(f),'\n'
  1885. #看的出,上面自动生成了层次化索引,可以将分组键去掉
  1886. print tips.groupby('smoker',group_keys = False).apply(top),'\n'
  1887. #下面看得出,重新设置索引会去掉原来所有索引,并重置索引
  1888. print tips.groupby('smoker').apply(top).reset_index(drop = True),'\n'
  1889. #下面看的出来,as_index在这里并不管用
  1890. print tips.groupby('smoker',as_index = False).apply(top),'\n'
  1891. #下面看的出来,as_index在这里并不管用
  1892. print tips.groupby(['sex','smoker'],as_index = False).apply(top),'\n'
  1893. -------分位数和桶分析
  1894. frame=DataFrame({'data1':np.random.randn(1000),'data2':np.random.randn(1000)})
  1895. frame.head()
  1896. 面向列的多函数应用#切分成4份(等距切割,非等量)
  1897. factor=pd.cut(frame.data1,4)
  1898. def get_stats(group):
  1899. return('min':group.min(),'max':group.max(),'count':group.count())
  1900. grouped=frame.data2.groupby(factor)
  1901. grouped.apply(get_stats).unstack()
  1902. #利用qcut进行等量切割
  1903. grouping=pd.qcut(frame.data1,10,labels=False)
  1904. print(grouping)
  1905. grouped=frame.data2.groupby(grouping)
  1906. print(grouped.apply(get_stats).unstack())
  1907. https://www.cnblogs.com/batteryhp/p/5049644.html
  1908. ----------------------------------示例部分
  1909. -------3.1用特定于分组的值填充缺失值
  1910. s = Series(np.random.randn(6))
  1911. s[::2] = np.nan
  1912. s.fillna(s.mean()) --->缺失值以均值填充
  1913. #假如需要对不同的分组填充不同的值。只需要groupby然后应用fillna即可。
  1914. states = ['Ohio','New York','Vermont','Florida','Oregon','Nevada','California','Idaho']
  1915. group_key = ['East'] * 4 + ['West'] * 4
  1916. data = Series(np.random.randn(8),index = states)
  1917. data[['Vermont','Nevada','Idaho']] = np.nan
  1918. data.groupby(group_key).mean()
  1919. #lambda函数方法填充
  1920. fill_mean = lambda g:g.fillna(g.mean())
  1921. data.groupby(group_key).apply(fill_mean)
  1922. #1定义填充值
  1923. fill_values = {'East':0.5,'West':0.4}
  1924. fill_func = lambda g:g.fillna(fill_values[g.name])
  1925. data.groupby(group_key).apply(fill_func)
  1926. -------3.2随机采样和排列
  1927. 假如想从一个大数据集中抽样完成蒙特卡洛模拟或其他工作。
  1928. “抽取”的方式有很多,但是效率是不一样的。一个办法是,
  1929. 选取np.random.permutation(N)的前K个元素。下面是个更有趣的例子:
  1930. #红桃(Hearts)、黑桃(Spades)、梅花(Clubs)、方片(Diamonds)
  1931. suits = ['H','S','C','D']
  1932. card_val = (range(1,11) + [10] * 3) * 4
  1933. #print(card_val)
  1934. base_names = ['A'] + range(2,11) + ['J','K','Q']
  1935. cards = []
  1936. for suit in ['H','S','C','D']:
  1937. cards.extend(str(num) + suit for num in base_names)
  1938. print(cards)
  1939. deck = Series(card_val,index = cards)
  1940. print (deck[:13])
  1941. #从牌中抽取5张,注意抽取方式,是一种随机选取5个的方式,即先选出一个排列,再从中拿出5个
  1942. def draw(deck,n = 5):
  1943. return deck.take(np.random.permutation(len(deck))[:n])
  1944. print (draw(deck))
  1945. #假如想从每种花色中随机抽取两张。先分组,再对每个组应用draw函数进行抽取
  1946. get_suit = lambda card:card[-1]
  1947. print(deck.groupby(get_suit).apply(draw,2))
  1948. #另一种方法
  1949. print (deck.groupby(get_suit,group_keys = False).apply(draw,2))
  1950. -------3.3分组加权平均数和相关系数
  1951. df = DataFrame({'category':list('aaaabbbb'),
  1952. 'data':np.random.randn(8),'weights':np.random.randn(8)})
  1953. #下面以category分组并计算加权平均
  1954. grouped=df.groupby('category')
  1955. get_wavg=lambda g:np.average(g['data'],weights=g['weights'])
  1956. grouped.apply(get_wavg)
  1957. close_px = pd.read_csv('E:/work/qbao/PY-W-new/pydata-book-master/ch11/stock_px.csv',
  1958. parse_dates = True,index_col = 0)
  1959. #下面做一个比较有趣的任务:计算一个由日收益率(通过百分比计算)与SPX之间的年度相关系数
  1960. #组成的DataFrame,下面是一个实现办法,下面的pct_change是计算每列下一个数值相对于上一个值的百分比变化,所以,第一个肯定为NaN
  1961. rets = close_px.pct_change().dropna()
  1962. #print rets[-4:]
  1963. spx_corr = lambda x:x.corrwith(x['SPX'])
  1964. #注意下面隐式的函数,作者好高明
  1965. by_year = rets.groupby(lambda x:x.year)
  1966. #对每一小块的所有列和SPX列计算相关系数
  1967. print by_year.apply(spx_corr),'\n'
  1968. #当然,还可以计算列与列之间的相关系数
  1969. print by_year.apply(lambda g:g['AAPL'].corr(g['MSFT']))
  1970. -------3.4面向分组的线性回归
  1971. import statsmodels.api as sm
  1972. def regress(data,yvar,xvars):
  1973. Y = data[yvar]
  1974. X = data[xvars]
  1975. X['intercept'] = 1
  1976. result = sm.OLS(Y,X).fit()
  1977. return result.params
  1978. print by_year.apply(regress,'AAPL',['SPX'])
  1979. -------4 透视表和交叉表 pivot_table和cross table
  1980. ---pivot_table
  1981. tips=pd.read_csv('E:/work/qbao/PY-W-new/pydata-book-master/ch08/tip.csv')
  1982. tips['tip_pct'] = tips['tip'] / tips['total_bill']
  1983. tips.pivot_table(index = ['sex','smoker'])
  1984. #对tip_pct和size根据index=sex和day 列为smoke or not 做数透视表
  1985. tips.pivot_table(['tip_pct','size'],index = ['sex','day'],columns = 'smoker')
  1986. #可以添加选项 margins = True添加分项小计。这将会添加All行和列,这里的all行或者列将不考虑差别,算整体的值
  1987. tips.pivot_table(['tip_pct','size'],index= ['sex','day'],columns = 'smoker',margins = True)
  1988. #对透视表 应用函数aggfunc
  1989. tips.pivot_table('tip_pct',index = ['sex','smoker'],columns = 'day',aggfunc = len,margins = True)
  1990. tips.pivot_table('size',index = ['time','sex','smoker'],columns = 'day',aggfunc = 'sum',fill_value = 0)
  1991. pivot_table参数
  1992. 参数名 说明
  1993. values 待聚合的列的名称。默认聚合所有数值
  1994. index index键
  1995. columns 列键
  1996. aggfunc 应用函数或函数列表,默认为'mean' 可以是对groupby有效的函数
  1997. fill_value 用于替换结果表中的缺失值
  1998. margins 添加行/列小计和总计,默认为False
  1999. ---交叉表:crosstab
  2000. data = DataFrame({'Sample':range(1,11,1),'Gender':['F','M','F','M','M','M','F','F','M','F'],'Handedness':['R','L','R','R','L','R','R','L','R','R']})
  2001. pd.crosstab(data.Gender,data.Handedness,margins = True) #第1(|),2(-)个参数可以是列表或数组
  2002. pd.crosstab([tips.time,tips.day],tips.smoker,margins = True)
  2003. -------5.2012联邦选举委员会数据库
  2004. fec = pd.read_csv('E:\\P00000001-ALL.csv')
  2005. print fec,'\n'
  2006. print fec.ix[123456],'\n'
  2007. #下面介绍几种不同的分析方法
  2008. #通过unique,你可以获取全部的候选人名单
  2009. unique_cands = fec.cand_nm.unique()
  2010. print unique_cands,'\n'
  2011. #下面将候选人和党派对应起来,额,写了半天,奥巴马是Democrat(民主党),其他人都是共和党……
  2012. parties = {'Bachmann, Michelle':'Republican',
  2013. 'Cain, Herman':'Republican',
  2014. 'Gingrich, Newt':'Republican',
  2015. 'Huntsman, Jon':'Republican',
  2016. 'Johnson, Gary Earl':'Republican',
  2017. 'McCotter, Thaddeus G':'Republican',
  2018. 'Obama, Barack':'Democrat',
  2019. 'Paul, Ron':'Republican',
  2020. 'Pawlenty, Timothy':'Republican',
  2021. 'Perry, Rick':'Republican',
  2022. "Roemer, Charles E. 'Buddy' III":'Republican',
  2023. 'Romney, Mitt':'Republican',
  2024. 'Santorum, Rick':'Republican'}
  2025. #为其添加新列
  2026. fec['party'] = fec.cand_nm.map(parties)
  2027. print fec['party'].value_counts(),'\n'
  2028. #注意,这份数据既包括赞助也包括退款
  2029. print (fec.contb_receipt_amt > 0).value_counts(),'\n'
  2030. #为了简便,这里将只研究正出资额的部分
  2031. fec = fec[fec.contb_receipt_amt > 0]
  2032. #专门准备两个子集盛放奥巴马和Mitt Romney
  2033. fec_mrbo = fec[fec.cand_nm.isin(['Obama, Barack','Romney, Mitt'])]
  2034. #根据职业和雇主统计赞助信息,例如律师倾向于赞助民主党,企业主倾向于自主共和党
  2035. #下面看一下职业
  2036. print fec.contbr_occupation.value_counts()[:10],'\n'
  2037. #下面将这些职业进行一些处理(将一个职业信息映射到另一个)
  2038. occ_mapping = {
  2039. 'INFORMATION REQUESTED PER BEST EFFORTS':'NOT PROVIDED',
  2040. 'INFORMATION REQUESTED':'NOT PROVIDED',
  2041. 'INFORMATION REQUESTED (BEST EFFORTS)':'NOT PROVIDED',
  2042. 'C.E.O':'CEO'
  2043. }
  2044. #下面用了一个dict.get,下面的get第一个x是dict的键,映射到返回对应的key,第二个是没有映射到返回的内容,如果没有提供映射的话,返回x
  2045. f = lambda x:occ_mapping.get(x,x)
  2046. fec.contbr_occupation = fec.contbr_occupation.map(f)
  2047. #对雇主的信息也这样处理一下
  2048. emp_mapping = {
  2049. 'INFORMATION REQUESTED PER BEST EFFORTS':'NOT PROVIDED',
  2050. 'INFORMATION REQUESTED':'NOT PROVIDED',
  2051. 'SELF':'SELF-EMPLOYED',
  2052. 'SELF EMPLOYED':'SELF-EMPLOYED'
  2053. }
  2054. f = lambda x:emp_mapping.get(x,x)
  2055. fec.contbr_employer = fec.contbr_employer.map(f)
  2056. #下面可以通过pivot_table根据党派和职业对数据进行聚合,然后过滤掉出资总额不足200万美元的数据
  2057. by_occupation = fec.pivot_table('contb_receipt_amt',rows = 'contbr_occupation',cols = 'party',aggfunc = sum)
  2058. print by_occupation.head(),'\n' #这个数据一定要看一下
  2059. over_2mm = by_occupation[by_occupation.sum(1) > 2000000]
  2060. print over_2mm
  2061. over_2mm.plot(kind = 'barh')
  2062. plt.show()
  2063. #你可能还想了解一下对OBAMA和ROMNEY总出资额最高的职业和企业,想法是先分组,然后再选取
  2064. def get_top_amounts(group,key,n = 5):
  2065. totals = group.groupby(key)['contb_receipt_amt'].sum()
  2066. return totals.order(ascending = False)[:n] #作者书上写错了
  2067. grouped = fec_mrbo.groupby('cand_nm')
  2068. #下面的语句是说,grouped对象可以被进一步groupby
  2069. print grouped.apply(get_top_amounts,'contbr_occupation',n = 7),'\n'
  2070. print fec_mrbo.groupby(['cand_nm','contbr_occupation'])['contb_receipt_amt'].sum(),'\n' #不知道这里为啥不对……,为什么跟前面的语句结果不一样?……
  2071. #print fec_mrbo.pivot_table('contb_receipt_amt',rows = ['cand_nm','contbr_occupation'],aggfunc = 'sum')
  2072. print grouped.apply(get_top_amounts,'contbr_employer',n = 10)
  2073. ---对出资额分组
  2074. #部分代码
  2075. bins = np.array([0,1,10,100,1000,10000,100000,1000000,10000000])
  2076. labels = pd.cut(fec_mrbo.contb_receipt_amt,bins)
  2077. print labels,'\n'
  2078. #然后根据候选人姓名以及面元标签对数据进行分组
  2079. grouped = fec_mrbo.groupby(['cand_nm',labels])
  2080. print grouped.size().unstack(0),'\n' #可以看出两个候选人不同面元捐款的数量
  2081. #还可以对出资额求和并在面元内规格化,以便图形化显示两位候选人各种赞助的比例
  2082. bucket_sums = grouped.contb_receipt_amt.sum().unstack(0)
  2083. print bucket_sums,'\n'
  2084. normed_sums = bucket_sums.div(bucket_sums.sum(axis = 1),axis = 0)
  2085. print normed_sums,'\n'
  2086. #排除最大的两个面元并作图:
  2087. normed_sums[:-2].plot(kind = 'barh',stacked = True)
  2088. plt.show()
  2089. -------------------------------------------------CP10 时间序列------------------------------------------------
  2090. https://www.cnblogs.com/batteryhp/p/5055149.html
  2091. http://www.cnblogs.com/batteryhp/p/5058400.html
  2092. https://www.cnblogs.com/batteryhp/p/5059670.html
  2093. import numpy as np
  2094. import pandas as pd
  2095. import matplotlib.pyplot as plt
  2096. import datetime as dt
  2097. from datetime import datetime
  2098. from dateutil.parser import parse
  2099. from pandas import Series,DataFrame
  2100. import time
  2101. from pandas.tseries.offsets import Hour,Minute,Day,MonthEnd
  2102. import pytz
  2103. -------1、日期和时间数据类型及工具
  2104. now = datetime.now()
  2105. now,now.year,now.month,now.day,now.microsecond
  2106. #datetime格式可以相相减
  2107. delta = datetime(2011,1,7) - datetime(2008,6,24,8,15)
  2108. delta
  2109. #把注意下面是days And seconds
  2110. dt.timedelta(926,56700)
  2111. delta.days
  2112. delta.seconds
  2113. ##datetime模块中的数据类型
  2114. date 以公历形式存储日历日期(年月日)
  2115. time 将时间存储为时,分,秒,毫秒
  2116. datetime 存储日期和时间
  2117. timedelta 表示两个datetime值之间的差
  2118. #字符串转时间格式(strftime方法)
  2119. str(datetime(2011,1,3))
  2120. stamp.strftime('%Y-%m-%d')
  2121. datestrs = ['7/6/2011','8/6/2011']
  2122. [datetime.strptime(x,'%m/%d/%Y') for x in datestrs] #注意这是datetime函数的函数,不是模块的函数
  2123. #dateutil包的parser.parser方式
  2124. parse('2011/01/03')
  2125. parse('Jan 31,1997 10:45 PM')
  2126. #国际通用格式中,日出现在月的前面,传入dayfirst = True即可
  2127. parse('6/12/2011',dayfirst = True)
  2128. ##datetime格式定义
  2129. %Y 4位数年
  2130. %y 2位数年
  2131. %m 2位数月
  2132. %d 2位数日
  2133. %H 时(24)[00,23]
  2134. %I 时(12)[01,12]
  2135. %M 2位数的分[00,59]
  2136. %S 秒[00.61]
  2137. %w 用整数表示的星期几[0(sunday),6]
  2138. %U 每年的第几周[00,53] 星期天为每周第一天,每年第一个新七天之前为0
  2139. %W 每年的第几周[00,53] 星期一为每周第一天,每年第一个新七天之前为0
  2140. %z 以+HHMM或-HHMM表示的UTC时区偏移量
  2141. %F %Y-%m-%d简写形式,例2018-8-18
  2142. %D %m/%d/%y简写形式,例18/08/18
  2143. ##特定于当前环境的日期格式
  2144. %a 星期几的简写
  2145. %A 星期几的全称
  2146. %b 月份的简写
  2147. %B 月份的全称
  2148. %c 完整的日期和时间,例如'Tue 01 May 2018 10:18:18 AM'
  2149. %p 不同环境中的AM和PM
  2150. %x 适合于当前环境的日期格式,例如 in USA 'may 1,2012'会产生'05/0`/2012'
  2151. %X 适合于当前环境的时间格式,例如'08:28:18 PM'
  2152. -------2、时间序列基础
  2153. dates = [datetime(2011,1,2),datetime(2011,1,5),datetime(2011,1,7),
  2154. datetime(2011,1,8),datetime(2011,1,10),datetime(2011,1,12)]
  2155. #print dates
  2156. ts = Series(np.random.randn(6),index = dates)
  2157. type(ts)
  2158. ts.index
  2159. ts + ts[::2]
  2160. ts.index.dtype
  2161. stamp = ts.index[0]
  2162. stamp
  2163. #索引、选取、子集构造
  2164. ts[ts.index[2]]
  2165. #还有更方便的用法,传入可以被解释为日期的字符串
  2166. ts['1/10/2011']
  2167. ts['20110110']
  2168. #对于较长的时间序列,只需传入“年”或“年月”即可轻松选取数据切片
  2169. long_ts = Series(np.random.randn(1000),
  2170. index = pd.date_range('1/1/2000',periods = 1000))
  2171. long_ts
  2172. long_ts['2001']
  2173. long_ts['2001-05']
  2174. ts[datetime(2011,1,7):] #对时间段切片 选择2011年1月7日后的数据
  2175. ts['1/6/2011':'1/11/2011']
  2176. print('This is time and localtime')
  2177. print("time.time(): %f " % time.time())
  2178. print(time.localtime( time.time() ))
  2179. print( time.asctime( time.localtime(time.time()) ))
  2180. ltime=time.localtime(int(time.time())) #time.time()不能直接运用strftime进行转换
  2181. time.strftime("%Y-%m-%d %H:%M:%S", ltime)
  2182. #time asctime() 函数接受时间元组并返回一个可读的形式为"Tue Dec 11 18:07:14 2008"
  2183. print 'over','\n'
  2184. #还有一个等价方法截取两个日期之间的TimeSeries.
  2185. ts.truncate(after = '1/9/2011')
  2186. #上面这些对DataFrame也有效
  2187. dates = pd.date_range('1/1/2000',periods = 100,freq = 'W-WED') #这里的freq是按照星期进行增加
  2188. long_df = DataFrame(np.random.randn(100,4),index = dates,columns = ['Colorado','Texas','New York','Ohio'])
  2189. long_df.ix['2001-05']
  2190. ##带有重复索引的时间序列
  2191. dates = pd.DatetimeIndex(['1/1/2000','1/2/2000','1/2/2000','1/2/2000','1/3/2000'])
  2192. dup_ts = Series(np.arange(5),index = dates)
  2193. dup_ts.index.is_unique --->False
  2194. grouped=dup_ts.groupby(level=0) ---> 对唯一时间戳进行聚合groupby,LEVEL=0
  2195. grouped.mean()
  2196. grouped.count()
  2197. -------3、日期的范围、频率以及移动
  2198. dates = [datetime(2011,1,2),datetime(2011,1,5),datetime(2011,1,7),
  2199. datetime(2011,1,8),datetime(2011,1,10),datetime(2011,1,12)]
  2200. ts = Series(np.random.randn(6),index = dates)
  2201. #下面进行重采样,得到具有固定时间频率(每天)的时间序列,当让这样的话就会产生缺失值
  2202. print ts.resample('D')
  2203. #生成日期范围(DATE_RANGE)
  2204. index = pd.date_range('4/1/2015','6/1/2015') --->产生一个date_range
  2205. pd.date_range('1/1/2016',periods = 31) --->产生一个从2016-1-1开始 周期为31天的时间数据
  2206. pd.date_range('12/18/2015','1/1/2016',freq = 'BM') --->BM:bussiness end of month,传入一个时间区间并以bm形式
  2207. #date_range默认保留起始和结束时间戳信息
  2208. pd.date_range('5/2/2015 12:12:12',periods = 5)
  2209. #有时,虽然起始和结束带有时间信息,但是可以用normalize = True把它们吧变为00:00:00
  2210. pd.date_range('5/2/2015 12:12:12',periods = 5,normalize = True)
  2211. #频率和日期偏移量
  2212. from pandas.tseries.offsets import Hour,Minute
  2213. #pandas中的频率是由一个基础频率和一个乘数组成的。基础的频率由字符串表示,比如‘M’表示月,‘H’表示小时
  2214. #对于每个基础频率,都有一个被称为日期偏移量(date offset)的对象与之对应。
  2215. hour = Hour()
  2216. print hour #感觉这个形式比较霸气
  2217. #传入整数可以自定义偏移量倍数
  2218. four_hours = Hour(4)
  2219. print four_hours
  2220. #一般而言,并不需要显示创建偏移量,只需创建时间序列时传入'H'或者'4h'即可
  2221. print pd.date_range('1/1/2016','1/2/2016',freq = '4h'),'\n'
  2222. #偏移量可以拼接
  2223. print Hour(1) + Minute(30)
  2224. #传入频率字符串('2h30min'),这种字符串可以被高效地解析为等效的表达式
  2225. print pd.date_range('1/1/2016',periods = 10,freq = '1h30min'),'\n'
  2226. #有些频率所描述的时间点并不是均匀分隔的。例如'M'和'BM'就取决于每月的天数,对于后者,还要考虑月末是不是周末,将这些成为锚点偏移量(anchored offset)
  2227. #WOM(Week Of Month)日期是一个非常常用的频率,以WOM开头,能产生诸如“每月第三个星期五”之类的信息
  2228. rng = pd.date_range('1/1/2016','9/1/2016',freq = 'WOM-3FRI')
  2229. ##时间序列的基础频率表(freq参数)
  2230. D Day 每日历日
  2231. B BusinessDay 每工作日
  2232. H Hour 每小时
  2233. T/min Minute 每分
  2234. S Second 每秒
  2235. L/ms Milli 每毫秒
  2236. U Micro 每微秒
  2237. M MonthEnd 每月最后一个日历日
  2238. BM BusinessMonthEnd 每月最后一个日历日
  2239. MS MonthBegin 每月第一个日历日
  2240. BMS BusinessMonthBegin 每月第一个工作日
  2241. W-MON/W-TUE... Week 从指定的星期几(mon,tues,wed,thu,fri,sat,sun)开始算起,每周
  2242. WOM-1MON/WOM-2MON... WeekOfMonth 产生每月第一二三或四周的星期几。例如,WOM-3FRI表示每月第3个星期五
  2243. Q-JAN/Q-FEB... QuarterEnd 对于指定月份(JAN,FEB,MAR,...DEC)结束的年度,每季度最后一个月的最后一个日历日
  2244. BQ-JAN/BQ-FEB... BusinessQuarterEnd 对于以指定月份结束的年度,每季度最后一月的最后一个工作日
  2245. QS-JAN/QS-FEB... QuarterBegin 对于指定月份结束的年度,每季度最后一月的第一个日历日
  2246. BQS-JAN/BQS-FEB... BusinessQuarterBegin 对于指定月份结束的年度,每季度最后一月的第一个工作日
  2247. A-JAN/A-FEB YearEnd 每年指定月份(JAN,FEB...DEC)的最后一个日历日
  2248. BA-JAN/BA-FEB... BusinessYearEnd 每年指定月份的最后一个工作日
  2249. AS-JAN/AS-FEB... YearBegin 每年指定月份的第一日历日
  2250. BAS-JAN/BAS-FEB... BusinessYearBegin 每年指定月份的第一个工作日
  2251. #移动(超前和滞后)数据(移动数据或时间戳)
  2252. ts = Series(np.random.randn(4),index = pd.date_range('1/1/2016',periods = 4,freq = 'M'))
  2253. ts.shift(2)/ts.shift(-2)
  2254. ts / ts.shift(1) - 1 #计算环比
  2255. ts.shift(2,freq = 'M') #时间戳移动,而数据不动
  2256. ts.shift(3,freq = 'D'),'\n' #时间的移动不是上下移动,而是将时间列的每个值进行移动
  2257. ts.shift(1,freq = '3D')
  2258. ts.shift(1,freq = '90T')
  2259. #通过偏移量对日期进行位移
  2260. now = datetime(2018,11,18)
  2261. type(now)
  2262. now + Day(3)
  2263. #如果加的是锚点偏移量,第一次增量会将原日期向前滚动到符合频率规则的下一个日期
  2264. #如果本来就是锚点,那么下一个就是下一个锚点
  2265. now + MonthEnd() #本月底
  2266. now + MonthEnd(2) #下月底
  2267. #通过锚点偏移量的rollforward和rollback方法,可显示地将日期向前或向后“滚动”
  2268. offset = MonthEnd()
  2269. offset.rollforward(now)
  2270. offset.rollback(now)
  2271. #日期偏移量还有一个巧妙的用法,即结合groupby使用这两个“滚动”方法
  2272. ts = Series(np.random.randn(20),index = pd.date_range('1/15/2000',periods = 20,freq = '4d'))
  2273. ts
  2274. #注意下面的方式,很隐晦
  2275. ts.groupby(offset.rollforward).mean()
  2276. #当然,更简单快速的方式是使用resample
  2277. ts.resample('M',how = 'mean')
  2278. -------时区转换和处理
  2279. import pytz
  2280. pytz.common_timezones[-5:] #从pytz内获取时区对象
  2281. tz = pytz.timezone('US/Eastern') #获取US西部时间区
  2282. -------本地化和转换
  2283. rng = pd.date_range('3/9/2012 9:30',periods = 6,freq = 'D')
  2284. ts = Series(np.random.randn(len(rng)),index = rng)
  2285. pd.date_range('3/9/2012',periods = 10,freq = 'D',tz = 'UTC')
  2286. ts_utc = ts.tz_localize('US/Pacific') #对时区进行localize
  2287. ts_utc.tz_convert('US/Eastern') #再对localized的时区进行转换
  2288. -------操作时区意识型(time zone-aware)Timestamp对象
  2289. stamp = pd.Timestamp('2011-03-12 04:00')
  2290. type(stamp)
  2291. stamp_utc = stamp.tz_localize('UTC')
  2292. stamp_utc.tz_convert('US/Eastern')
  2293. stamp_moscow = pd.Timestamp('2011-03-12 04:00',tz = 'Europe/Moscow')
  2294. stamp_utc.value #UTC值 自1970年1月1日起的纳秒数
  2295. stamp_utc.tz_convert('US/Eastern').value #转换过程中这个值不会变
  2296. -------不同时区之间的运算
  2297. rng = pd.date_range('3/7/2012',periods = 10,freq = 'B')
  2298. ts = Series(np.random.randn(len(rng)),index = rng)
  2299. ts1 = ts[:7].tz_localize('Europe/London')
  2300. ts2 = ts1[2:].tz_convert('Europe/Moscow')
  2301. result = ts1 + ts2 #匹配相应的时区进行计算,
  2302. -------5、时期及其算数运算
  2303. p = pd.Period('2016',freq = 'A-DEC')
  2304. p + 5
  2305. rng = pd.Period('2015',freq = 'A-DEC') - p ---> -1
  2306. #注意下面的形式已经不是书上的形式,而是float类型,但是做索引时,还是日期形式
  2307. type(rng)
  2308. Series(np.random.randn(6),index = rng)
  2309. values = ['2001Q3','2002Q2','2003Q1']
  2310. index = pd.PeriodIndex(values,freq = 'Q-DEC')
  2311. -------时期的频率转换(asfreq)
  2312. p = pd.Period('2007',freq = 'A-DEC')
  2313. p
  2314. p.asfreq('M',how = 'start')
  2315. p.asfreq('M',how = 'end')
  2316. #高频率转换为低频率时,超时期是由子时期所属位置决定的,例如在A-JUN频率中,月份“2007年8月”实际上属于“2008年”
  2317. p = pd.Period('2007-08','M')
  2318. p.asfreq('A-JUN')
  2319. rng = pd.period_range('2006','2009',freq = 'A-DEC')
  2320. ts = Series(np.random.randn(len(rng)),index = rng)
  2321. ts.asfreq('M',how = 'start') --->转换为年初的Month
  2322. ts.asfreq('B',how = 'end') --->转换为年末的BusinessDay
  2323. pts = ts.to_period()
  2324. #由于时期指的是非重叠时间区间,因此对于给定的频率,一个时间戳只能属于一个时期。
  2325. #新PeriodIndex的频率默认是从时间戳推断而来的,当然可以自己指定频率,当然会有重复时期存在
  2326. rng = pd.date_range('1/29/2000',periods = 6,freq = 'D')
  2327. ts2 = Series(np.random.randn(6),index = rng)
  2328. ts2
  2329. ts2.to_period('M')
  2330. #要想转换为时间戳,使用to_timestamp即可
  2331. pts.to_timestamp(how = 'end')
  2332. -------通过数组创建PeriodIndex
  2333. data = pd.read_csv('E:\\macrodata.csv')
  2334. data.year
  2335. data.quarter
  2336. index = pd.PeriodIndex(year = data.year,quarter = data.quarter,freq = 'Q-DEC')
  2337. #index是以整数数组的形式存储的,当显示某一个是才会有年份-季度的展示
  2338. data.index = index
  2339. #下面的结果证明,infl的index已经变为了年份-季度形式
  2340. data.infl
  2341. -------6、重采样及频率转换 (resample)
  2342. rng = pd.date_range('1/1/2000',periods = 100,freq = 'D')
  2343. ts = Series(np.random.randn(100),index = rng)
  2344. ts.resample('M',how = 'mean') --->按照monthend求均值的resample
  2345. ts.resample('M',how = 'mean',kind = 'period') --->按照月周期求mean
  2346. #resample参数
  2347. loffset=None 面元标签的时间校正,例:'-1s'/Second(-1)用于将聚合标签调早一秒
  2348. limit=None 在前向或后向填充时,允许填充最大期数
  2349. kind=None 聚合到时期('period')或时间戳('timestamp'),默认聚合到时间序列的索引类型
  2350. convention=None 当重采样时期时,将低频率转换到高频率多采用的约定('start''end'),默认为'end'
  2351. freq 表示重采样频率的字符串或DataOffset,例'M','5min'或Second(15)
  2352. how='mean' 用于产生聚合值得函数名或数组函数'mean','ohlc','np.max'。默认为mean,
  2353. 其他常用的值有first last median ohlc max min
  2354. axis=0 重采样的轴,默认为0
  2355. fill_method=None 升采样时如何插值,比如ffill/bfill,默认不插值
  2356. closed='right' 在降采样中,各时间段的哪一端时闭合的默认'right'
  2357. label='right' 在降采样中,如何设置聚合值得标签,right或left(面元的右/左边界)
  2358. 例,9:30-9:35 之间的者五分钟会被标记为9:30 or 9:35 默认为'right' (本例中就是9:35)
  2359. #降采样
  2360. 将数据的频率降低称为降采样,也就是将数据进行聚合。
  2361. 一个数据点只能属于一个聚合时间段,所有时间段的并集组成整个时间帧。
  2362. rng = pd.date_range('1/1/2000',periods = 12,freq = 'T')
  2363. ts = Series(range(0,12),index = rng) --->生成一分钟线
  2364. ts.resample('5min',how = 'sum') --->聚合到5min线
  2365. #传入的频率将会以“5min”的增量定义面元。默认情况下,面元的有边界是包含右边届的,即00:00到00:05是包含00:05的
  2366. #传入closed = 'left'会让左边的区间闭合
  2367. print ts.resample('5min',how = 'sum',closed = 'left')
  2368. #最终的时间序列默认是用右侧的边界标记,但是传入label = 'left'可以转换为左边标记
  2369. ts.resample('5min',how = 'sum',closed = 'left',label = 'left')
  2370. ts.resample('5min',how = 'sum',closed = 'left',loffset = '-1s') #label减去1s
  2371. #OHLC重采样
  2372. rng = pd.date_range('1/1/2000',periods = 12,freq = 'T')
  2373. ts = Series(np.random.randn(12),index = rng)
  2374. ts
  2375. ts.resample('5min',how = 'ohlc')
  2376. 按照5min进行聚类 结果呈现ohlc(open,high,low,close)
  2377. #通过groupby进行重采样
  2378. rng = pd.date_range('1/1/2000',periods = 100,freq = 'D')
  2379. ts = Series(np.arange(100),index = rng)
  2380. ts.groupby(lambda x:x.month).mean() #作真是越写越省事了……
  2381. ts.groupby(lambda x:x.weekday).mean()
  2382. #升采样和差值
  2383. frame = DataFrame(np.random.randn(2,4),index = pd.date_range('1/1/2000',periods = 2,freq = 'W-WED'),
  2384. columns = ['Colorado','Texas','New York','Ohio'])
  2385. #将其重采样到日频率,默认会引入缺省值
  2386. df_daily = frame.resample('D')
  2387. #可以跟fillna和reindex一样,将上面的数值用resampling进行填充
  2388. frame.resample('D',fill_method = 'ffill')
  2389. #同样,这里可以只填充指定的时期数(目的是限制前面的观测值的持续使用距离)
  2390. frame.resample('D',fill_method = 'ffill',limit = 2)
  2391. #注意,新的日期索引完全没必要跟旧的相交,注意这个例子展现了数据日期可以延长
  2392. frame.resample('W-THU',fill_method = 'ffill')
  2393. #通过日期进行重采样
  2394. frame = DataFrame(np.random.randn(24,4),
  2395. index = pd.period_range('1-2000','12-2001',freq = 'M'),
  2396. columns = ['Colorado','Texas','New York','Ohio'])
  2397. annual_frame = frame.resample('A-DEC',how = 'mean')
  2398. #升采样要稍微麻烦些,因为你必须决定在新的频率中各区间的哪端用于放置原来的值,就像asfreq方法一样,convention默认为'end',可设置为'start'
  2399. #Q-DEC:季度型(每年以12月结束)
  2400. annual_frame.resample('Q-DEC',fill_method = 'ffill')
  2401. annual_frame.resample('Q-DEC',fill_method = 'ffill',convention = 'start'),'\n'
  2402. #由于时期指的是时间区间,所以升采样和降采样的规则就比较严格
  2403. #在降采样中,目标频率必须是原频率的子时期
  2404. #在升采样中,目标频率必须是原频率的超时期
  2405. #如果不满足这些条件,就会引发异常,主要影响的是按季、年、周计算的频率。
  2406. #例如,由Q-MAR定义的时间区间只能升采样为A-MAR、A-JUN等
  2407. annual_frame.resample('Q-MAR',fill_method = 'ffill')
  2408. ------7、时间序列绘图
  2409. #下面两个参数,一个是解析日期形式,一个是将第一列作为行名
  2410. close_px_all = pd.read_csv('E:/work/qbao/PY-W-new/pydata-book-master/ch11/stock_px.csv',
  2411. parse_dates = True,index_col = 0)
  2412. close_px_all.head()
  2413. close_px = close_px_all[['AAPL','MSFT','XOM']]
  2414. close_px = close_px.resample('B',fill_method = 'ffill')
  2415. close_px.head()
  2416. #注意下面的索引方式即可
  2417. close_px['AAPL'].plot()
  2418. close_px.ix['2009'].plot()
  2419. close_px['AAPL'].ix['01-2011':'03-2011'].plot()
  2420. #季度型频率的数据会用季度标记进行格式化,这种事情手工的话会很费力……(真是有道理……)
  2421. appl_q = close_px['AAPL'].resample('Q-DEC',fill_method = 'ffill')
  2422. appl_q.ix['2009':].plot()
  2423. #作者说交互方式右键按住日期会动态展开或收缩,实际自己做,没效果……
  2424. plt.show()
  2425. -------8、移动窗口函数
  2426. #在移动窗口(可以带有指数衰减权数)上计算的各种统计函数也是一类常见于时间序列的数组变换。
  2427. 作者将其称为移动窗口函数(moving window function),其中还包括那些窗口不定长的函数(如指数加权移动平均)。
  2428. 跟其他统计函数一样,移动窗口函数也会自动排除缺失值。这样的函数通常需要指定一些数量的非NA观测值。
  2429. #rolling_mean是其中最简单的一个。它接受一个TimeSeries或DataFrame以及一个window(表示期数)
  2430. close_px_all = pd.read_csv('E:/work/qbao/PY-W-new/pydata-book-master/ch11/stock_px.csv',parse_dates = True,index_col = 0)
  2431. close_px_all.head()
  2432. close_px = close_px_all[['AAPL','MSFT','XOM']]
  2433. close_px = close_px.resample('B',fill_method = 'ffill')
  2434. close_px.AAPL.plot()
  2435. pd.rolling_mean(close_px.AAPL,250).plot()
  2436. plt.show()
  2437. close_px.AAPL.plot()
  2438. appl_std250 = pd.rolling_std(close_px.AAPL,250,min_periods = 10)
  2439. appl_std250[:15]
  2440. appl_std250.plot()
  2441. plt.show()
  2442. #扩展窗口平均(expanding window mean)
  2443. #通过rolling_mean定义扩展平均
  2444. expanding_mean = lambda x:rolling_mean(x,len(x),min_periods = 1)
  2445. #对DataFrame调用rolling_mean(以及其他类似函数)会将转换应用到所有列上
  2446. #下面的logy是将纵坐标显示为科学计数法,暂时搞不懂怎么变换的
  2447. mean_60 = pd.rolling_mean(close_px,60).plot()
  2448. mean_60 = pd.rolling_mean(close_px,60).plot(logy = True)
  2449. #print mean_60[(len(mean_60) - 20):len(mean_60)]
  2450. plt.show()
  2451. '''
  2452. ts = pd.Series(range(10), index=pd.date_range('1/1/2000', periods=10))
  2453. #ts = np.exp(ts.cumsum())
  2454. print ts
  2455. print np.log(ts)
  2456. ts.plot(logy=True)
  2457. plt.show()
  2458. '''
  2459. 移动窗口和指数加权函数
  2460. rolling_count 返回各窗口非NA观测值得数量
  2461. rolling_sum 移动窗口的和
  2462. rolling_mean 移动窗口的平均值
  2463. rolling_median 移动窗口的中位数
  2464. rolling_var,rolling_std 移动窗口的方差和标准差,分母为N-1
  2465. rolling_skew,rolling_kurt 移动窗口的偏度(三阶距)和峰度
  2466. rolling_min,rolling_max 移动窗口的最小最大值
  2467. rolling_quantile 移动窗口的百分位数/样本分位数位置的值
  2468. rolling_corr,rolling_cov 移动窗口的相关系数和协方差
  2469. rolling_apply 对移动窗口应用普通数组函数
  2470. ewmva 指数加权移动平均
  2471. ewmvar,ewmstd 指数加权移动方差和标准差
  2472. ewmcorr,ewmcov 指数加权移动相关系数和协方差
  2473. #指数加权函数
  2474. 另一种使用固定大小窗口及相等权数观测值的方法是,
  2475. 定义一个衰减因子(decay factor)常量,
  2476. 以便使近期的观测值拥有更大的权数。衰减因子的定义方式有很多,
  2477. 比较流行的是使用时间间隔(span),
  2478. 它可以使结果兼容于窗口大小等于时间间隔的简单移动窗口函数。
  2479. fig,axes = plt.subplots(nrows = 2,ncols = 1,sharex = True,sharey = True,figsize = (12,7))
  2480. aapl_px = close_px.AAPL['2005':'2009']
  2481. ma60 = pd.rolling_mean(aapl_px,60,min_periods = 50)
  2482. ewma60 = pd.ewma(aapl_px,span = 60)
  2483. aapl_px.plot(style = 'k-',ax = axes[0])
  2484. ma60.plot(style = 'k--',ax = axes[0])
  2485. aapl_px.plot(style = 'k-',ax = axes[1])
  2486. ewma60.plot(style = 'k--',ax = axes[1])
  2487. axes[0].set_title('Simple MA')
  2488. axes[1].set_title('Exponentially-weighted MA')
  2489. plt.show()
  2490. #二元移动窗口函数
  2491. 有些统计运算(如相关系数和协方差)需要在两个时间序列上执行。
  2492. 比如,金融分析师常常对某只股票对某个参数(如标普500指数)的相关系数感兴趣。
  2493. 我们可以通过计算百分比变化并使用rolling_corr的方式得到该结果。
  2494. #rolling_mean是其中最简单的一个。它接受一个TimeSeries或DataFrame以及一个window(表示期数)
  2495. close_px_all = pd.read_csv('E:/work/qbao/PY-W-new/pydata-book-master/ch11/stock_px.csv',
  2496. parse_dates = True,index_col = 0)
  2497. close_px_all.head(),'\n'
  2498. close_px = close_px_all[['AAPL','MSFT','XOM']]
  2499. spx_px = close_px_all['SPX']
  2500. print spx_px
  2501. #下面是将spx_px数据后移一位,减1是将数据减1,当然后面的是先除,再减1
  2502. #print spx_px.shift(1) - 1
  2503. spx_rets = spx_px / spx_px.shift(1) - 1
  2504. #看一下,下面的函数是跟上面的一样,作者是为了展示函数才这么写的
  2505. #spx_rets_pct_change = spx_px.pct_change()
  2506. #print spx_rets_pct_change[:10]
  2507. spx_rets[:10],'\n'
  2508. returns = close_px.pct_change()
  2509. returns[:10]
  2510. corr = pd.rolling_corr(returns.AAPL,spx_rets,125,min_periods = 100)
  2511. corr.plot()
  2512. plt.show()
  2513. #用户自定义的移动窗口函数
  2514. rolling_apply函数使你能够在移动窗口上应用自己设计的数组函数。
  2515. 唯一的要求就是:该函数要能从数组的各个片段中产生单个值。
  2516. 比如,当用rolling_quantile计算样本分位数时,
  2517. 可能对样本中特定值的百分等级感兴趣。
  2518. from scipy.stats import percentileofscore
  2519. #rolling_mean是其中最简单的一个。它接受一个TimeSeries或DataFrame以及一个window(表示期数)
  2520. close_px_all = pd.read_csv('E:\\stock_px.csv',parse_dates = True,index_col = 0)
  2521. close_px = close_px_all[['AAPL','MSFT','XOM']]
  2522. returns = close_px.pct_change()
  2523. #这里的percentileofscore是指,0.02在x中的位置是x中的百分比
  2524. #AAPL %2回报率的百分等级
  2525. score_at_2percent = lambda x:percentileofscore(x,0.02)
  2526. result = pd.rolling_apply(returns.AAPL,250,score_at_2percent)
  2527. result.plot()
  2528. plt.show()
  2529. ===============================================ITchat包===================================================
  2530. #encoding=gbk
  2531. import itchat
  2532. itchat.login()
  2533. friends=itchat.get_friends(update=True)[0:]
  2534. male=female=other=0
  2535. for i in friends[1:]:
  2536. sex=i['Sex']
  2537. if sex==1:male+=1
  2538. elif sex==2:female+=1
  2539. else:other+=1
  2540. total=len(friends[1:])
  2541. malecol=round(float(male)/total*100,2)
  2542. femalecol=round(float(female)/total*100,2)
  2543. othercol=round(float(other)/total*100,2)
  2544. print('男性朋友:%.2f%%' %(malecol)+'\n'+'女性朋友:%.2f%%' % (femalecol)+'\n'+'性别不明的好友:%.2f%%' %(othercol))
  2545. print("显示图如下:")
  2546. import numpy as np
  2547. import matplotlib.pyplot as plt
  2548. import matplotlib as mpl
  2549. #解决中文乱码不显示问题
  2550. mpl.rcParams['font.sans-serif'] = ['SimHei'] #指定默认字体
  2551. mpl.rcParams['axes.unicode_minus'] = False #解决保存图像是负号'-'显示为方块的问题
  2552. map = {'Female': (malecol, '#7199cf'),'Male': (femalecol, '#4fc4aa'),'other': (othercol, '#e1a7a2')}
  2553. fig = plt.figure(figsize=(5,5))# 整体图的标题
  2554. ax = fig.add_subplot(111)#添加一个子图
  2555. ax.set_title('Gender of friends')
  2556. xticks = np.arange(3)+0.15# 生成x轴每个元素的位置
  2557. bar_width = 0.5# 定义柱状图每个柱的宽度
  2558. names = map.keys()#获得x轴的值
  2559. values = [x[0] for x in map.values()]# y轴的值
  2560. colors = [x[1] for x in map.values()]# 对应颜色
  2561. bars = ax.bar(xticks, values, width=bar_width, edgecolor='none')# 画柱状图,横轴是x的位置,纵轴是y,定义柱的宽度,同时设置柱的边缘为透明
  2562. ax.set_ylabel('Proprotion')# 设置标题
  2563. ax.set_xlabel('Gender')
  2564. ax.grid()#打开网格
  2565. ax.set_xticks(xticks)# x轴每个标签的具体位置
  2566. ax.set_xticklabels(names)# 设置每个标签的名字
  2567. ax.set_xlim([bar_width/2-0.5, 3-bar_width/2])# 设置x轴的范围
  2568. ax.set_ylim([0, 100])# 设置y轴的范围
  2569. for bar, color in zip(bars, colors):
  2570. bar.set_color(color)# 给每个bar分配指定的颜色
  2571. height=bar.get_height()#获得高度并且让字居上一点
  2572. plt.text(bar.get_x()+bar.get_width()/4.,height,'%.2f%%' %float(height))#写值
  2573. plt.show()
  2574. #画饼状图
  2575. fig1 = plt.figure(figsize=(5,5))# 整体图的标题
  2576. ax = fig1.add_subplot(111)
  2577. ax.set_title('Pie chart')
  2578. labels = ['{}\n{} %'.format(name, value) for name, value in zip(names, values)]
  2579. ax.pie(values, labels=labels, colors=colors)#并指定标签和对应颜色
  2580. plt.show()
  2581. #用来爬去各个变量
  2582. def get_var(var):
  2583. variable=[]
  2584. for i in friends:
  2585. value=i[var]
  2586. variable.append(value)
  2587. return variable
  2588. #调用函数得到各个变量,并把数据存到csv文件中,保存到桌面
  2589. NickName=get_var('NickName')
  2590. Sex=get_var('Sex')
  2591. Province=get_var('Province')
  2592. City=get_var('City')
  2593. Signature=get_var('Signature')
  2594. pros=set(Province)#去重
  2595. prosarray=[]
  2596. for item in pros:
  2597. prosarray.append((item,Province.count(item)))#获取个数
  2598. def by_num(p):
  2599. return p[1]
  2600. prosdsored=sorted(prosarray,key=by_num,reverse=True)#根据个数排序
  2601. #画图
  2602. figpro = plt.figure(figsize=(10,5))# 整体图的标题
  2603. axpro = figpro.add_subplot(111)#添加一个子图
  2604. axpro.set_title('Province')
  2605. xticks = np.linspace(0.5,20,20)# 生成x轴每个元素的位置
  2606. bar_width = 0.8# 定义柱状图每个柱的宽度
  2607. pros=[]
  2608. values = []
  2609. count=0
  2610. for item in prosdsored:
  2611. pros.append(item[0])
  2612. values.append(item[1])
  2613. count=count+1
  2614. if count>=20:
  2615. break
  2616. colors = ['#FFEC8B','#FFE4C4','#FFC125','#FFB6C1','#CDCDB4','#CDC8B1','#CDB79E','#CDAD00','#CD96CD','#CD853F','#C1FFC1','#C0FF3E','#BEBEBE','#CD5C5C','#CD3700','#CD2626','#8B8970','#8B6914','#8B5F65','#8B2252']# 对应颜色
  2617. bars = axpro.bar(xticks, values, width=bar_width, edgecolor='none')
  2618. axpro.set_ylabel('人数')# 设置标题
  2619. axpro.set_xlabel('省份')
  2620. axpro.grid()#打开网格
  2621. axpro.set_xticks(xticks)# x轴每个标签的具体位置
  2622. axpro.set_xticklabels(pros)# 设置每个标签的名字
  2623. axpro.set_xlim(0,20)# 设置x轴的范围
  2624. axpro.set_ylim([0, 100])# 设置y轴的范围
  2625. for bar, color in zip(bars, colors):
  2626. bar.set_color(color)# 给每个bar分配指定的颜色
  2627. height=bar.get_height()#获得高度并且让字居上一点
  2628. plt.text(bar.get_x()+bar.get_width()/4.,height,'%.d' %float(height))#写值
  2629. plt.show()
  2630. #保存数据
  2631. from pandas import DataFrame
  2632. data={'NickName':NickName,'Sex':Sex,'Province':Province,'City':City,'Signature':Signature}
  2633. frame=DataFrame(data)
  2634. frame.to_csv('C:/Users/admin/Desktop/pyda/data.csv',index=True)
  2635. ==========================================================================================================
  2636. ===============================================math,numpy包===================================================
  2637. ------------------------------------------------------moudel of Math
  2638. csdn_s: https://blog.csdn.net/Waitfou/article/details/61614400
  2639. csdn_2: https://blog.csdn.net/lijiahong2012/article/details/52416400
  2640. public: https://docs.python.org/3.6/library/math.html
  2641. import math
  2642. math.ceil(x)
  2643. #1.math basic
  2644. dir(math) 查看所有函数名列表
  2645. help(math) 查看具体定义及函数0原型
  2646. ex:help(math.ceil)
  2647. #2.normal function
  2648. ceil(x)help(math)取顶
  2649. floor(x) 取底
  2650. fabs(x) 取绝对值
  2651. factorial (x) 阶乘
  2652. hypot(x,y) sqrt(x*x+y*y)
  2653. pow(x,y) x的y次方
  2654. sqrt(x) 开平方
  2655. exp(x) e**x
  2656. log(x)
  2657. log10(x)
  2658. trunc(x) 截断取整数部分
  2659. isnan (x) 判断是否NaN(not a number)
  2660. degree (x) 弧度转角度
  2661. radians(x) 角度转弧度
  2662. acos(x) x 的反余弦
  2663. asin(x) x 的反正弦。
  2664. atan(x) x 的反正切。
  2665. cos(x) x 的余弦。
  2666. sin(x) x 的正弦。
  2667. tan(x) x 的正切。
  2668. log(x,a) a底log函数
  2669. erf(x) x的误差函数
  2670. erfc(x) 余误差函数
  2671. gamma(x) x的伽玛函数
  2672. lgamma(x) x的绝对值的自然对数的伽玛函数
  2673. #3.random
  2674. import random
  2675. random.random() 产生一个[0.0,1.0)的随机浮点数
  2676. [random.random() for _ in range(10)] 10
  2677. random.uniform(a,b) 产生一个[a,b]的随机浮点数
  2678. random.randint(a,b) 产生一个[a,b]的随机整数,a<=b
  2679. random.randrange(start, stop, [step]) 从指定范围内,按指定基数递增的集合中获取一个随机数,基数缺省值为1
  2680. random.choice(sequence) 随机取值
  2681. ex:random.choice([1,2,3,4])
  2682. random.shuffle(x[, random]) 用于将一个列表中的元素打乱
  2683. ex: a=[1,2,3,4,5] random.shuffle(a) --->[5,2,3,1,4]
  2684. random.sample(sequence, k) 从指定序列中随机获取k个元素作为一个片段返回,sample函数不会修改原有序列
  2685. ex:a = [1,2,3,4,5] random.sample(a,3) --->从a中随机取3个值
  2686. #4.decimal
  2687. from decimal import Decimal
  2688. Decimal('0.1') / Decimal('0.3') --->Decimal('0.3333333333333333333333333333')
  2689. from decimal import getcontext
  2690. getcontext().prec = 4 设置全局精度
  2691. Decimal('0.1') / Decimal('0.3') --->then result is Decimal('0.3333')
  2692. #5.fractions 转换成分子分母的形式 接受 字符串,浮点数,整数
  2693. from fractions import Fraction
  2694. ex: Fraction(16, -10) --->Fraction(-8, 5)
  2695. ex: Fraction(123) --->Fraction(123, 1)
  2696. ex: Fraction('3/7') --->Fraction(3, 7)
  2697. ex: Fraction('-.125') --->Fraction(-1, 8)
  2698. ex: Fraction(2.25) --->Fraction(9, 4)
  2699. ex: a = Fraction(1,2)
  2700. ex: a --->Fraction(1, 2)
  2701. ex: b = Fraction('1/3')
  2702. ex: b --->Fraction(1, 3)
  2703. ex: a + b --->Fraction(5, 6)
  2704. ex: a - b --->Fraction(1, 6)
  2705. #6.数学常数
  2706. math.e = 2.718281828459045
  2707. math.pi = 3.141592653589793
  2708. https://www.cnblogs.com/TensorSense/p/6795995.html
  2709. --------------------------------------------------numpy函数
  2710. a = np.arange(15).reshape(3, 5)
  2711. .ndim :维度
  2712. .shape :各维度的尺度 (25
  2713. .size :元素的个数 10
  2714. .dtype :元素的类型 dtype(‘int32’)
  2715. .itemsize :每个元素的大小,以字节为单位 ,每个元素占4个字节
  2716. ---------------ndarray数组的创建
  2717. np.arange(n) : 元素从0到n-1的ndarray类型
  2718. np.ones((a,b),ddtype = np.int64) : 生成a行b列的全1矩阵
  2719. np.full((a,b), val) : 生成a行b列的全val矩阵
  2720. np.eye(n) : 生成单位矩阵(仅对角线为1)
  2721. np.ones_like(a) : 按数组a的形状生成全1的数组
  2722. np.zeros_like(a) : 同理
  2723. np.full_like (a, val) : 同理
  2724. np.linspace(1,10,4) : 根据起止数据等间距地生成数组
  2725. np.linspace(1,10,4, endpoint = False) : endpoint 表示10是否作为生成的元素
  2726. np.concatenate() : 数组拼接数组
  2727. ---------------数组的维度变换
  2728. .reshape(shape) : 不改变当前数组,依shape生成
  2729. .resize(shape) : 改变当前数组,依shape生成
  2730. .swapaxes(ax1, ax2) : 将两个维度调换
  2731. .flatten() : 对数组进行降维,返回折叠后的一位数组
  2732. ---------------一维数组切片
  2733. a = np.array ([9, 8, 7, 6, 5, ])
  2734. a[1:4:2] –> array([8, 6]) :a[起始编号:终止编号(不含): 步长]
  2735. ---------------多维数组索引
  2736. a = np.arange(24).reshape((2, 3, 4))
  2737. a[1, 2, 3] : 表示 3个维度上的编号, 各个维度的编号用逗号分隔
  2738. ---------------多维数组切片
  2739. a [:,:,::2 ] 缺省时,表示从第0个元素开始,到最后一个元素
  2740. ---------------数组的运算
  2741. np.abs(a)/np.fabs(a) : 绝对值
  2742. np.sqrt(a) : 平方根
  2743. np.square(a) : 平方
  2744. np.log(a)/np.log10(a)/np.log2(a) : 自然对数、102为底的对数
  2745. np.ceil(a)/np.floor(a) : ceiling 值, floor值(ceiling向上取整,floor向下取整)
  2746. np.rint(a) : 四舍五入
  2747. np.modf(a) : 将小数和整数 部分以两个独立数组形式返回
  2748. np.exp(a) : 指数值
  2749. np.sign(a) : 符号值 1(+),0,-1(-)
  2750. np.maximum(a, b)/np.fmax() : 计算元素级的最大值np.fmax([1,2,3,2],[2,3,4,1])->2342
  2751. np.minimum(a, b)/np.fmin() : 取最小值
  2752. np.mod(a, b) : 元素级的模运算
  2753. np.copysign(a, b) : 将b中各元素的符号赋值给数组a的对应元素
  2754. ---------------数据的CSV文件存取
  2755. CSV (Comma-Separated Value,逗号分隔值) 只能存储一维和二维数组
  2756. np.savetxt(frame, array, fmt=’% .18e’, delimiter = None)
  2757. ---frame是文件、字符串等,可以是.gz .bz2的压缩文件
  2758. ---array 表示存入的数组
  2759. ---fmt 表示元素的格式 eg: %d % .2f % .18e
  2760. ---delimiter:分割字符串,默认是空格
  2761. eg: np.savetxt(‘a.csv’, a, fmt=%d, delimiter = ‘,’ )
  2762. np.loadtxt(frame, dtype=np.float, delimiter = None, unpack = False)
  2763. ---frame是文件、字符串等,可以是.gz .bz2的压缩文件
  2764. ---dtype:数据类型,读取的数据以此类型存储
  2765. ---:delimiter: 分割字符串,默认是空格
  2766. ---unpack: 如果为True, 读入属性将分别写入不同变量。
  2767. 多维数据的存取
  2768. a.tofile(frame, sep=’’, format=’%s’ )
  2769. ---frame: 文件、字符串
  2770. ---sep: 数据分割字符串,如果是空串,写入文件为二进制
  2771. ---format: 写入数据的格式
  2772. ---eg: a = np.arange(100).reshape(5, 10, 2) a.tofile(“b.dat”, sep=”,”, format=’%d’)
  2773. np.fromfile(frame, dtype = float, count=-1, sep=’’)
  2774. ---frame:文件、字符串
  2775. ---dtype:读取的数据以此类型存储
  2776. --count: 读入元素个数, -1表示读入整个文件
  2777. ---sep: 数据分割字符串,如果是空串,写入文件为二进制
  2778. PS: a.tofile() 和np.fromfile()要配合使用,要知道数据的类型和维度。
  2779. np.save(frame, array) : frame: 文件名,以.npy为扩展名,压缩扩展名为.npz ; array为数组变量
  2780. np.load(fname) : frame: 文件名,以.npy为扩展名,压缩扩展名为
  2781. np.save() 和np.load() 使用时,不用自己考虑数据类型和维度。
  2782. ---------------numpy随机数函数
  2783. ---numpy.random
  2784. b=np.random.randint(100,200,10)
  2785. rand(d0, d1, …,dn) : [0, 1)的浮点数,服从均匀分布
  2786. randn(d0, d1, …,dn) :标准正态分布
  2787. randint(low, high,()) :依shape创建随机整数或整数数组,范围是[low, high)
  2788. seed(s) :随机数种子
  2789. shuffle(a) : 根据数组a的第一轴进行随机排列,改变数组a
  2790. permutation(a) :根据数组a的第一轴进行随机排列, 不改变原数组,将生成新数组
  2791. choice(a, size, replace, p) : 从一维数组a中以概率p抽取元素, 形成size形状新数组,replace表示是否可以重用元素,默认为True
  2792. eg:---> np.random.choice(b,(2,3),p=b/np.sum(b)) 从b中按(2,3)型状&概率p 进行随机抽样(设置replace=True 做不放回抽样)
  2793. uniform(low, high, size) : 产生均匀分布的数组,起始值为low,high为结束值,size为形状
  2794. normal(loc, scale, size) : 产生正态分布的数组, loc为均值,scale为标准差,size为形状
  2795. poisson(lam, size) : 产生泊松分布的数组, lam随机事件发生概率,size为形状
  2796. eg: a = np.random.uniform(0, 10, (3, 4)) a = np.random.normal(10, 5, (3, 4))
  2797. ---------------numpy的统计函数
  2798. sum(a, axis = None) : 依给定轴axis计算数组a相关元素之和,axis为整数或者元组
  2799. mean(a, axis = None) : 同理,计算平均值
  2800. average(a, axis =None, weights=None) : 依给定轴axis计算数组a相关元素的加权平均值
  2801. std(a, axis = None) :同理,计算标准差
  2802. var(a, axis = None) : 计算方差
  2803. eg: np.mean(a, axis =1) : 对数组a的第二维度的数据进行求平均
  2804. a = np.arange(15).reshape(3, 5)
  2805. np.average(a, axis =0, weights =[10, 5, 1]) : 对a第一各维度加权求平均,weights中为权重,注意要和a的第一维匹配
  2806. min(a)/max(a) : 计算数组a的最小值和最大值
  2807. argmin(a)/argmax(a) : 计算数组a的最小、最大值的下标(注:是一维的下标)
  2808. unravel_index(index, shape) : 根据shape将一维下标index转成多维下标
  2809. ptp(a) : 计算数组a最大值和最小值的差
  2810. median(a) : 计算数组a中元素的中位数(中值)
  2811. eg:a = [[15, 14, 13],
  2812. [12, 11, 10] ]
  2813. np.argmax(a) –> 0
  2814. np.unravel_index( np.argmax(a), a.shape) –> (0,0)
  2815. ----numpy的梯度函数
  2816. np.gradient(a) :计算数组a中元素的梯度,f为多维时,返回每个维度的梯度
  2817. 离散梯度:xy坐标轴连续三个x轴坐标对应的y轴值:a, b, c 其中b的梯度是(c-a)/2 而c的梯度是: (c-b)/1
  2818. 当为二维数组时,np.gradient(a) 得出两个数组,
  2819. 第一个数组对应最外层维度的梯度,第二个数组对应第二层维度的梯度。
  2820. ================================================调用mysql做分词=======================================================
  2821. #coding=gbk
  2822. #encode=utf-8
  2823. import pymysql
  2824. import jieba
  2825. import pandas as pd
  2826. from os import path
  2827. from wordcloud import WordCloud
  2828. import matplotlib.pyplot as plt
  2829. from numpy import *
  2830. from pandas import *
  2831. from datetime import datetime
  2832. from dateutil.parser import parse
  2833. from datetime import datetime
  2834. try:
  2835. conn = pymysql.connect(host='localhost',user='root',passwd='zieox888',db='sys',port=3306,charset='utf8')
  2836. df = pd.read_sql(select ct.`date` dt,CAST(ct.settle AS SIGNED) se,CAST(ct.recharge AS SIGNED) re from ct, con=conn)
  2837. conn.close()
  2838. print ("finish load db")
  2839. except pymysql.Error:print (e.args[1])
  2840. pd.to_datetime(df.dt)
  2841. --------#usedway
  2842. '''db = pymysql.connect(host='localhost',port = 3306,user='root',passwd='zieox888',db ='sys', charset='utf8')
  2843. cursor = db.cursor()
  2844. cursor.execute("select * from ctsl")
  2845. da=cursor.fetchall()
  2846. ti,s1,s2,s3=[],[],[],[]
  2847. '''for rec in da:
  2848. l1.append(rec[3])'''
  2849. for i in da:
  2850. ti.append(parse(i[0]).strftime('%Y-%m-%d')[0:-1])
  2851. s1.append(int(i[11]))
  2852. s2.append(float(i[13]))
  2853. s3.append(float(i[12]))
  2854. print(ti)
  2855. #print(pd.value_counts(pd.qcut(s1,4)))#4分位切割'''
  2856. #步段图+虚线
  2857. plt.plot(s1,'k--',label='Default')
  2858. plt.plot(s2,'k-',drawstyle='steps-post',label='steps-post')
  2859. plt.legend(loc='best')
  2860. #3线图(logsi)
  2861. fig=plt.figure()
  2862. ax=fig.add_subplot(1,1,1)
  2863. ax.plot(s1,'k',label='logPnum')
  2864. ax.plot(s2,label='signum')
  2865. ax.plot(s3,'k-',label='lognum')
  2866. labels=ax.set_xticklabels(ti,rotation=30,fontsize='small') #设置x轴标签
  2867. ax.set_title('ctsllog info')
  2868. ax.set_xlabel('date')
  2869. plt.show
  2870. --------------#写入文件与rows
  2871. numrows = cursor.rowcount
  2872. datacol=[]
  2873. for i in range(numrows):
  2874. row = cursor.fetchone()
  2875. datacol.append(row[4])
  2876. for i in datacol:
  2877. with open(path,'w') as obj:
  2878. obj.write(str(i)+'\n')
  2879. ----------------
  2880. totast=[]
  2881. idd=[]
  2882. x=list(range(1,len(data)+1))
  2883. for i in data : totast.append(int(float(i[24])))
  2884. pl.title('Assets distribution of shanghai',fontsize=20)
  2885. pl.ylabel('$ of assets',fontsize=12)
  2886. pl.scatter(x,totast,s=8)
  2887. pl.axes().get_xaxis().set_visible(False)
  2888. pl.show()
  2889. --------#有逗号的分词统计
  2890. word_lst = []
  2891. word_dict= {}
  2892. for word in datacol[:10]:
  2893. word_lst.append(word.split(','))
  2894. for item in word_lst:
  2895. for item2 in item:
  2896. if item2 not in word_dict:word_dict[item2] = 1
  2897. else:word_dict[item2] += 1
  2898. for key in word_dict:print(key,word_dict[key])
  2899. --------#分词统计
  2900. print ('【Output】')
  2901. text=open(path,'rb').read()
  2902. print('There are :'+str(len(text))+' words ')
  2903. words = [x for x in jieba.cut(text,cut_all=False) if len(x) > 1]
  2904. from collections import Counter
  2905. c = Counter(words).most_common(500)
  2906. d1={h:v for h,v in c}
  2907. print(d1)
  2908. ---------#写入txt
  2909. with open('2.txt','w') as obj:
  2910. for i in c:
  2911. obj.write(str(i)+'\n')
  2912. print(i)

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/145005
推荐阅读
相关标签
  

闽ICP备14008679号