理论部分

* 理解SAC过程和groupby机制
* 掌握分组三大操作:聚合、过滤和变换
* 熟悉 apply 函数用法
练习部分

* 钻石数据集分析
* 非法药物数据集分析
<>习题讲解

【练习一】: 现有一份关于diamonds的数据集,列分别记录了克拉数、颜色、开采深度、价格,请解决下列问题:描述如下

(a) 在所有重量超过1克拉的钻石中,价格的极差是多少?
df = pd.read_csv('data/Diamonds.csv') df.head() df_r = df.query('carat>1')[
'price'] df_r.max()-df_r.min()

(b) 若以开采深度的0.2\0.4\0.6\0.8分位数为分组依据,每一组中钻石颜色最多的是哪一种?该种颜色是组内平均而言单位重量最贵的吗?
bins = df['depth'].quantile(np.linspace(0,1,6)).tolist() cuts = pd.cut(df[
'depth'],bins=bins) #可选label添加自定义标签 df['cuts'] = cuts df.head()

color_result = df.groupby('cuts')['color'].describe() color_result

df['均重价格']=df['price']/df['carat'] color_result['top'] == [i[1] for i in df.
groupby(['cuts','color'])['均重价格'].mean().groupby(['cuts']).idxmax().values]

© 以重量分组(0-0.5,0.5-1,1-1.5,1.5-2,2+),按递增的深度为索引排序,求每组中连续的严格递增价格序列长度的最大值。
df = df.drop(columns='均重价格') cuts = pd.cut(df['carat'],bins=[0,0.5,1,1.5,2,np.
inf]) #可选label添加自定义标签 df['cuts'] = cuts df.head()

def f(nums): if not nums: return 0 res = 1 cur_len = 1 for i in range(1, len(
nums)): if nums[i-1] < nums[i]: cur_len += 1 res = max(cur_len, res) else:
cur_len= 1 return res for name,group in df.groupby('cuts'): group = group.
sort_values(by='depth') s = group['price'] print(name,f(s.tolist()))

(d) 请按颜色分组,分别计算价格关于克拉数的回归系数。(单变量的简单线性回归,并只使用Pandas和Numpy完成)
for name,group in df[['carat','price','color']].groupby('color'): L1 = np.array
([np.ones(group.shape[0]),group['carat']]).reshape(2,group.shape[0]) L2 = group[
'price'] result = (np.linalg.inv(L1.dot(L1.T)).dot(L1)).dot(L2).reshape(2,1)
print('当颜色为%s时,截距项为:%f,回归系数为:%f'%(name,result[0],result[1]))

【练习二】:有一份关于美国10年至17年的非法药物数据集,列分别记录了年份、州(5个)、县、药物类型、报告数量,请解决下列问题

(a) 按照年份统计,哪个县的报告数量最多?这个县所属的州在当年也是报告数最多的吗?
df = pd.read_csv('data/Drugs.csv') df.head() idx=pd.IndexSlice for i in range(
2010,2018): county = (df.groupby(['COUNTY','YYYY']).sum().loc[idx[:,i],:].idxmax
()[0][0]) state = df.query('COUNTY == "%s"'%county)['State'].iloc[0] state_true
= df.groupby(['State','YYYY']).sum().loc[idx[:,i],:].idxmax()[0][0] if state==
state_true: print('在%d年,%s县的报告数最多,它所属的州%s也是报告数最多的'%(i,county,state)) else: print
('在%d年,%s县的报告数最多,但它所属的州%s不是报告数最多的,%s州报告数最多'%(i,county,state,state_true))

(b) 从14年到15年,Heroin的数量增加最多的是哪一个州?它在这个州是所有药物中增幅最大的吗?若不是,请找出符合该条件的药物。
df_b = df[(df['YYYY'].isin([2014,2015]))&(df['SubstanceName']=='Heroin')]
df_add= df_b.groupby(['YYYY','State']).sum() (df_add.loc[2015]-df_add.loc[2014])
.idxmax() df_b = df[(df['YYYY'].isin([2014,2015]))&(df['State']=='OH')] df_add =
df_b.groupby(['YYYY','SubstanceName']).sum() display((df_add.loc[2015]-df_add.
loc[2014]).idxmax()) #这里利用了索引对齐的特点 display((df_add.loc[2015]/df_add.loc[2014]).
idxmax())

此部分是有关分组的练习题,接下来就是变形的练习题

技术
©2019-2020 Toolsou All rights reserved,
element-ui+vue-treeselect下拉框的校验ajax get请求中文参数乱码解决(精华)2020年6月29日 C#类库 接口签名校验Map 判断key对应的value值是否存在-containsKey()继承jpa Repository 写自定义方法查询ToastUtils 的使用Result返回结果信息的封装 项目跟了一年,客户最后说不做了org.postgresql.util.PSQLException 处理记录C#/.NET 系统优化专题(redis第六篇 数据结构【List】)