datawhale pandas 习题02

Ex4:删除同样的行

现有两张表,请在df1中剔除在df2中出现过的行。

df1 = pd.DataFrame({
    "A": [3,2,2,3,1,3],
    "B": [2,1,1,3,6,2],
    "C": [1,2,2,7,7,1],
    "D": [5,6,6,1,2,5],
})

df2 = pd.DataFrame({
    "A": [2,3,1],
    "B": [1,9,6],
    "C": [2,7,7],
    "D": [6,1,2],
})
df1.set_index(df1.columns.tolist(),inplace=True)
df2.set_index(df2.columns.tolist(),inplace=True)
df1.loc[df1.index.difference(df2.index)].reset_index(drop=False)

out
在这里插入图片描述

Ex5:统计每个学区的开课数量

某个城市共有4个学区,每个学区有若干学校,学校之间名字互不相同。每一条记录为该学校开设的课程,一个学校可能有多条记录,每一条记录内部的课程不会重复,但同一学校不同记录之间的课程可能重复。

df = pd.read_csv('../data/supplement/ex5/school_course.csv')
df.Area.unique()

df['Course']=df.Course.str.split(' ')
df=df.explode('Course')
df=df.groupby(['Area','Course'])['School'].count().unstack(0).fillna(0)
df.rename_axis(columns={'Area':''},inplace=True)
df

out
在这里插入图片描述

Ex6:捕获非零的行列索引¶

给定如下的数据框,请返回非零行列组合构成的多级索引。

df = pd.DataFrame(
    [[0,5,0],[2,1,0],[0,0,6],[0,9,0]],
    index=list("ABCD"), columns=list("XYZ"))
df.reset_index(drop=False,inplace=True)
res=df.melt(id_vars=['index'],value_vars=['X','Y','Z'],var_name='XYZ',value_name='count')
res.groupby(['index','XYZ']).sum().query('count==0').index

out

MultiIndex([('A', 'X'),
            ('A', 'Z'),
            ('B', 'Z'),
            ('C', 'X'),
            ('C', 'Y'),
            ('D', 'X'),
            ('D', 'Z')],
           names=['index', 'XYZ'])

Ex7:分析集群日志

(只坐出来第一题😅)
某公司构建了一个分布式文件集群,它共有134台服务器构成,分别存放在五个机房,R0机房存有23台,R1机房存有16台,R2机房存有47台,R3机房存有30台,R4机房存有18台,每个机房的服务器编号从001开始。运维人员通过日志收集功能得到了如下所示的集群在2022年9月27日的文件历史传输记录,其每一行构成如下:方括号中显示了当前操作是否为向其他服务器发出文件的操作(PUSH)还是接收其他服务器文件的操作(SAVE)及其对应的操作时间。Cluster#R?#???表示了当前操作的机器编号,Cluster#R4#014表示R4机房的第14号机器;再后面的十位字符串代表了传输文件的唯一标识,如果某一个条记录为SAVE操作的机器接收了XXX文件,那么一定会有另一台机器PUSH这个XXX文件的记录;对于PUSH记录而言,最后的信息表示发出文件的大小,对于SAVE记录而言,最后的信息表示接收到文件的大小,若同一对PUSH记录和SAVE记录的文件大小不一致,那么表明本次文件传输最终处于未完成状态(Unfinished)。

  • 使用高效方法提取日志中的信息,并注意脏数据的清洗(如时间格式错误和无效数字),将其存放为如下格式,其中push_time按时间顺序。file_id为文件唯一标识,file_size为文件实际大小,save_fize为文件最终被接收的大小,push_from表示PUSH该文件的服务器,push_to表示SAVE该文件的服务器。
data=pd.read_table("../data/supplement/ex7/logs.txt",sep='|',names=['operation_time','id','file_id','save_fize'],engine='python')

data.operation_time=data.operation_time.str.replace('[\[]','',regex=True)
data.id=data.id.str.replace('Cluster#','',regex=True)
data.id=data.id.str.replace('#','-')
res=data.id.str.split('] ',n=2,expand=True)
data['time']=res[0]
data['id']=res[1]

data=data.merge(data,on='file_id',how='left').query("id_x!=id_y").query('operation_time_x=="PUSH"')
data=data.rename(columns={'save_fize_x':'file_size','save_fize_y':'save_size','id_x':'push_from','id_y':'push_to','time_x':'push_time','time_y':'save_time'})
data=data[['file_id','file_size','save_size','push_from','push_to','push_time','save_time']]
data

out
在这里插入图片描述

  • 一般而言,文件在同一机房内的传输速度会比跨机房的传输速度快。请对于所有传输完成的文件,按照服务器的机房号来计算文件传输的平均速度(MB/s)。格式如下,第i行第j列表示从所有从机房i传到机房j传输完成文件的平均速度,矩阵的对角线值是否要高于非对角线值?
  • 题干中提到,并非所有文件都会传输成功,文件传输成功(Finished)当且仅当文件大小等于接收大小;如果日志中出现了只有单条记录的文件,说明当前传输任务为Missed状态;如果文件大小不等于接收大小,说明当前任务为Unfinished状态。其中对于Unfinished状态,可以按照传输的比例超过90%和超过50%分为三档:”Unfinished-Almost”、”Unfinished-Fair”和”Unfinished-Bad”。请计算每个机房的最终状态的比例,格式如下,结果先按照状态Status排序(”Finished”>”Unfinished-Almost”>”Unfinished-Fair”>”Unfinished-Bad”>”Missed”),再按照机房号排序。
  • 按小时计算每个机房发送的大文件数和接收的大文件数之差,其中大文件指大小超过800M的文件。结果的行索引是时间,列索引是机房。
  • 按小时计算每台机器的空闲率,对于某一台机器而言,空闲时间指其既没有处于发送任务中又没有处于接收任务中的时间,每个小时的空闲率指当前小时的区间内空闲时间的占比。结果的行索引是时间,列索引是机器。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值