1.5.2 2. 练习
1.5.2.1 【练习一】: 现有一份关于diamonds的数据集,列分别记录了克拉数、颜色、开采深度、价格,请解决下列问题:
pd.read_csv(‘data/Diamonds.csv’).head()
carat color depth price
0 0.23 E 61.5 326
1 0.21 E 59.8 326
2 0.23 E 56.9 327
3 0.29 I 62.4 334
4 0.31 J 63.3 335
1.5.2.2 (a) 在所有重量超过1克拉的钻石中,价格的极差是多少?
1.5.2.3 (b) 若以开采深度的0.2\0.4\0.6\0.8分位数为分组依据,每一组中钻石颜色最多的是哪一种?该种颜色是组内平均而言单位重量最贵的吗?
1.5.2.4 © 以重量分组(0-0.5,0.5-1,1-1.5,1.5-2,2+),按递增的深度为索引排序,求每组中连续的严格递增价格序列长度的最大值。
1.5.2.5 (d) 请按颜色分组,分别计算价格关于克拉数的回归系数。(单变量的简单线性回归,并只使用Pandas和Numpy完成)
1.5.2.6 【练习二】:有一份关于美国10年至17年的非法药物数据集,列分别记录了年份、州(5个)、县、药物类型、报告数量,请解决下列问题:
pd.read_csv(‘data/Drugs.csv’).head()
YYYY State COUNTY SubstanceName DrugReports
0 2010 VA ACCOMACK Propoxyphene 1
1 2010 OH ADAMS Morphine 9
2 2010 PA ADAMS Methadone 2
3 2010 VA ALEXANDRIA CITY Heroin 5
4 2010 PA ALLEGHENY Hydromorphone 5
1.5.2.7 (a) 按照年份统计,哪个县的报告数量最多?这个县所属的州在当年也是报告数最多的吗?
1.5.2.8 (b) 从14年到15年,Heroin的数量增加最多的是哪一个州?它在这个州是所有药物中增幅最大的吗?若不是,请找出符合该条件的药物。
1.5 第3章:练习一
1.5.1 (a) 极差为17561
df = pd.read_csv(‘data/Diamonds.csv’)
df.head()
carat color depth price
0 0.23 E 61.5 326
1 0.21 E 59.8 326
2 0.23 E 56.9 327
3 0.29 I 62.4 334
4 0.31 J 63.3 335
df_r = df.query(‘carat>1’)[‘price’]
df_r.max()-df_r.min()
17561
1.5.2 (b) 0-0.2分位数区间最多的为‘E’,其余区间都为‘G’
bins = df[‘depth’].quantile(np.linspace(0,1,6)).tolist()
cuts = pd.cut(df[‘depth’],bins=bins) #可选label添加自定义标签
df[‘cuts’] = cuts
df.head()
carat color depth price cuts
0 0.23 E 61.5 326 (60.8, 61.6]
1 0.21 E 59.8 326 (43.0, 60.8]
2 0.23 E 56.9 327 (43.0, 60.8]
3 0.29 I 62.4 334 (62.1, 62.7]
4 0.31 J 63.3 335 (62.7, 79.0]
color_result = df.groupby(‘cuts’)[‘color’].describe()
color_result
count unique top freq
cuts
(43.0, 60.8] 11294 7 E 2259
(60.8, 61.6] 11831 7 G 2593
(61.6, 62.1] 10403 7 G 2247
(62.1, 62.7] 10137 7 G 2193
(62.7, 79.0] 10273 7 G 2000
1.5.3 前三个分位数区间不满足条件,后两个区间中数量最多的颜色的确是均重价格中最贵的
df[‘均重价格’]=df[‘price’]/df[‘carat’]
color_result[‘top’] == [i[1] for i in df.groupby([‘cuts’
,‘color’])[‘均重价格’].mean().groupby([‘cuts’]).idxmax().values]
cuts
(43.0, 60.8] False
(60.8, 61.6] False
(61.6, 62.1] False
(62.1, 62.7] True
(62.7, 79.0] True
Name: top, dtype: bool
1.5.4 © 结果见下:
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()
carat color depth price cuts
0 0.23 E 61.5 326 (0.0, 0.5]
1 0.21 E 59.8 326 (0.0, 0.5]
2 0.23 E 56.9 327 (0.0, 0.5]
3 0.29 I 62.4 334 (0.0, 0.5]
4 0.31 J 63.3 335 (0.0, 0.5]
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()))
(0.0, 0.5] 8
(0.5, 1.0] 8
(1.0, 1.5] 7
(1.5, 2.0] 11
(2.0, inf] 7
1.5.5 (d) 计算结果如下:
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]))
当颜色为D时,截距项为:-2361.017152,回归系数为:8408.353126
当颜色为E时,截距项为:-2381.049600,回归系数为:8296.212783
当颜色为F时,截距项为:-2665.806191,回归系数为:8676.658344
当颜色为G时,截距项为:-2575.527643,回归系数为:8525.345779
当颜色为H时,截距项为:-2460.418046,回归系数为:7619.098320
当颜色为I时,截距项为:-2878.150356,回归系数为:7761.041169
当颜色为J时,截距项为:-2920.603337,回归系数为:7094.192092
1.6 第3章:练习二
1.6.1 (a)
df = pd.read_csv(‘data/Drugs.csv’)
df.head()
YYYY State COUNTY SubstanceName DrugReports
0 2010 VA ACCOMACK Propoxyphene 1
1 2010 OH ADAMS Morphine 9
2 2010 PA ADAMS Methadone 2
3 2010 VA ALEXANDRIA CITY Heroin 5
4 2010 PA ALLEGHENY Hydromorphone 5
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 statestate_true:
print(‘在%d年,%s县的报告数最多,它所属的州%s也是报告数最多的’%(i,county,state))
else:
print(‘在%d年,%s县的报告数最多,但它所属的州%s不是报告数最多的,%s州报告数最多’%(i,county,state,state_true))
在2010年,PHILADELPHIA县的报告数最多,它所属的州PA也是报告数最多的
在2011年,PHILADELPHIA县的报告数最多,但它所属的州PA不是报告数最多的,OH州报告数最多
在2012年,PHILADELPHIA县的报告数最多,但它所属的州PA不是报告数最多的,OH州报告数最多
在2013年,PHILADELPHIA县的报告数最多,但它所属的州PA不是报告数最多的,OH州报告数最多
在2014年,PHILADELPHIA县的报告数最多,但它所属的州PA不是报告数最多的,OH州报告数最多
在2015年,PHILADELPHIA县的报告数最多,但它所属的州PA不是报告数最多的,OH州报告数最多
在2016年,HAMILTON县的报告数最多,它所属的州OH也是报告数最多的
在2017年,HAMILTON县的报告数最多,它所属的州OH也是报告数最多的
1.6.2 (b) OH州增加最多,Heroin是增量最大的,但增幅最大的是Acetyl fentanyl
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()
DrugReports OH
dtype: object
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())
DrugReports Heroin
dtype: object
DrugReports Acetyl fentanyl
dtype: object