数据分析练习题目4

1. sql部分

image-20200625210909113
  1. 插入多条记录的语句

    INSERT INTO house_info (`house_id`, `hold_ucid`, `del_type`, `hold_shop_code`) 
    VALUES 
    ('24', '9904', '二手', '1004'),
    ('25', '9905', '二手', '1005'),
    ('26', '9906', '新房', '1006'),
    ('27', '9907', '新房', '1007'),
    ('28', '9908', '新房', '1008');
    
  2. 插入店铺信息表

    INSERT INTO shop_info (shop_id, area) 
    VALUES 
    ( 1001, '宝安'),
    ( 1004, '南山'),
    ( 1005, '南山'),
    ( 1006, '宝安'),
    ( 1007, '南山'),
    ( 1008, '龙岗');
    
  3. 先看看两个表的样子

    image-20200625212730362
    image-20200625212857910
  4. 表格连接外加分类汇总

    select 
    a.area, 
    sum(if(b.del_type='二手', 1, 0)) as 二手房源量,
    sum(if(b.del_type='新房', 1, 0)) as 新房房源量
    FROM
    shop_info a inner join house_info b
    on a.shop_id = b.hold_shop_code
    group by a.area;
    
image-20200625213250190
image-20200625210935367
image-20200625210951210
  1. 看一看电话的表格的基本的样子

    image-20200625215200935

    我们发现里面有很多是重复的,所以需要考虑的是最后一次的接通。最后一次的接通在30天以外或者根本没有接通过。

    1.1 先把最后一次的接通数据找出来

    select house_id, max(tele_date)  -- max得到的肯定就是最后一次
    from telephone_info
    where is_connected = 1
    group by house_id;
    
    image-20200625215248755

    然后拿着这个表和house_info ,左连接,然后再筛选里面的30天开外的和NULL的。

    
    with temp AS
    (select house_id, max(tele_date)  as last_call
    from telephone_info
    where is_connected = 1
    group by house_id)
    select 
    a.house_id, date_format(last_call, '%Y-%m-%d') as 电话拨打时间  -- date_format  设置格式。。
    from house_info a left join temp b
    on a.house_id = b.house_id
    where (DATEDIFF(now(),last_call) > 30) or (last_call is NULL);
    
    
    image-20200625215945299

2、python基础

1.下面这段代码的输出结果是什么?请解释

def extendList(val,list=[]): 

    list.append(val) 

    return list 


list1 = extendList(10) 

list2 = extendList(123,[]) 

list3 = extendList('a') 



print("list1 = %s" %list1)  

print("list1 = %s" %list2) 

print("list1 = %s" %list3) 
  • [10] 因为list没有传入

  • [123] 因为list传入的是空的

  • ['a'] 因为没有传入list

    实际的答案竟然是

    image-20200625221114334

    原因在于多次调用默认参数的时候,默认的那个list参数竟然是同一个,然后list又是可变类型的变量,所以直接在变量身上就地修改了。

2.

2.1下面这段代码输出什么?

num = 9 
def f1(): 
 num = 20 
def f2(): 
 print(num) 
f2() 
f1() 
f2()

9

9

需要global标记才能是这个变量引用全局的变量

2.2在以上代码的基础上如何进行修改使得

def f1(): 
    global num
    num = 20 

输出结果为:

9

20

2.3以下两段代码运行之后结果是否相同?为什么?

第一段:

l=[] 

for i in range(10): 
   l.append({'num':i}) 
print(l) 

第二段:

l=[] 
a={'num':0} 
for i in range(10): 
   a['num']=i 
   l.append(a) 

print(l) 

一个结果 是

[{num:1}, {num:2},{num:3},{num:4},...]

另一个的结果是

[{num:9}, {num:9},{num:9},{num:9},...]

3、python进阶

1.python的传参是传值还是传址

引用

2.如何判断同一个DataFrame中的一列是否包含另一列的元素(举例说明)

生成的代码

import pandas as pd
import numpy as np

s1 = pd.Series(list('ABCDEF'))
s2 = pd.Series(list('EFGHIJ'))

df = pd.DataFrame({'key1':s1, 'key2':s2})
df
image-20200625223314980

判断的代码,用类似sql中自关联

merged = pd.merge(df, df, left_on='key1', right_on='key2')
print(merged)
print("有交集吗={}".format(merged.shape[0] > 0))
image-20200625223904216

3.尝试将以下SQL语句功能用Pandas表达(提示:结合DataFrame的GROUP BY、agg、filter函数)

SELECT user_id, buy_month, mean(price), sum(pro_count) 

FROM sales_tab 

WHERE sex='male'

GROUP BY user_id, buy_month 

HAVING count(*) > 1  # 只考虑当月购买次数多余1 的情况

3.1 原始数据

df = pd.DataFrame({'user_id':[1, 2, 3, 2, 3] ,
                   'buy_month':[1, 2, 2, 2, 2],
                   'sex':['male', 'male', 'male', 'male', 'male'],
                   'price':[1, 2, 3, 4,5],
                   'pro_count':[1, 1, 1, 1, 1]
                  })
df
image-20200625230856437

3.2 where字句 与loc对应

#  相当于where
df = df[ df.sex=='male']
df
image-20200625230933824

3.3 groupgy等价

# group by 
groups = df.groupby( ['user_id', 'buy_month'])
groups.size()
image-20200625231008830

3.4 聚合函数等价于agg

# agg 相当于sql的聚合函数
month_agg = groups.agg({ 'price':'mean', 'pro_count':'sum', 'user_id':'count', 'buy_month':'count'})
month_agg_renamed = month_agg.rename(columns = {'price':'某人某月购买商品的平均价格', 'pro_count':'某人某月一共买了几件', 'user_id':'某人某月发生几次购买'})
month_agg_renamed
image-20200625231055992

3.5 loc再次筛选相当于having

# 针对汇总的字段 再做一次筛选就相当于 sql中的having
month_agg_renamed[ month_agg_renamed['某人某月发生几次购买']>1]
image-20200625231153371

你可能感兴趣的:(数据分析练习题目4)