在理解意思的情况下,下面这个代码更简洁一些
import pandas as pd
import numpy as np
#导入数据生成数据框data1
#可能由于一些原因导致审核通过日期等变量导入到python中之后变成了字符串变量
data1=pd.read_csv("D:\\A2021_02_13.csv")
#先把审核通过的数据挑出来生成新数据框data2
#这个数据是从mysql数据库中导出的,在mysql数据库中如果审核没有通过,则审核通过日期用-1表示
#这种为-1的数据不是我们需要的,
#所以我们把非-1数据挑选出来。
data2=data1[data1["审核通过日期"]!="-1"]
#需要说明的是学生在mysql数据库中提取这个数据的时候帮我进行了筛选,所以我们这个数据中不存在-1的情况
#我之所以还是把这个命令放到这里,是希望大家在做数据清洗的时候需要注意到这样的业务问题。
#将统计日期和提交资料日期字符串变成日期时间型
data2["统计日期"]=data2["统计日期"].map(lambda x :pd.Timestamp(x))
data2["提交资料日期"]=data2["提交资料日期"].map(lambda x :pd.Timestamp(x))
data2["审核通过日期"]=data2["审核通过日期"].map(lambda x :pd.Timestamp(x))
#计算重要变量
def f1(x):
aa=x["统计日期"]-x["审核通过日期"]
bb=aa.days
return bb
data2["距离审核通过第多少天"]=data2.apply(f1,axis=1)
#根据审核通过日期对数据进行筛选
data3=data2[(data2["审核通过日期"]>=pd.Timestamp("2021-01-01")) & (data2["审核通过日期"]<=pd.Timestamp("2021-01-24"))]
#计算每个人在每个统计日期的总销量
#团长ID为每一个人的唯一标识ID
#每一个人是有很多行记录的
#在一个审核通过日期,可能有很多人通过审核
pivot_table1=data3.pivot_table(values=["销量"],
index=["审核通过日期","团长ID","距离审核通过第多少天"],
aggfunc={ "销量":np.sum})
#更改变量名字,为了以后的调用方便
pivot_table1.columns=["销量"]
#将索引变成普通字段
pivot_table1.reset_index(inplace=True)
#生成是否消费字段
pivot_table1["是否消费"]=pivot_table1["销量"].map(lambda x:1 if x>0 else 0)
#只保留"距离审核通过第多少天"小于等于7的情况
pivot_table1.drop(index=pivot_table1.index[pivot_table1["距离审核通过第多少天"]>7],axis=0,inplace=True)
pivot_table1.set_index(["审核通过日期","团长ID","距离审核通过第多少天"],drop=True,inplace=True)
#将序列由长变宽
ddd=pivot_table1["是否消费"].unstack(level=-1)
#计算是否一日留存
ddd["是否一日留存"]=ddd.apply(lambda x:1 if x[0]==1 else 0,axis=1)
#计算是否次日留存
ddd["是否次日留存"]=ddd.apply(lambda x:1 if x[0]==1 and x[1]==1 else 0,axis=1)
#计算是否次日留存
ddd["是否7日留存"]=ddd.iloc[:,:7].sum(axis=1)==7
ddd["temp"]=1
result=ddd.loc[:,["temp","是否次日留存","是否7日留存"]].sum(axis=0)
print("次日留存率为",result["是否次日留存"]/result["temp"])
print("7日留存率为",result["是否7日留存"]/result["temp"])
ermutuxia
2021-02-14
mysql答案语句如下:
use test1;
CREATE TABLE test1 (city varchar(10), gender char(1));
INSERT INTO test1 (city, gender)
VALUES ('Delhi', 'M')
,('Delhi', 'F')
,('Delhi', 'M')
,('Delhi', 'M')
,('Pune', 'F')
,('Pune', 'M')
,('Pune', 'F')
,('Pune', 'F')
,('Banglore', 'F')
,('Banglore', 'F')
;
SELECT city,COUNT(*)AS "人数合计",
SUM(CASE WHEN gender='M' THEN 1 ELSE 0 END)AS "女士人数",
SUM(CASE WHEN gender='F' THEN 1 ELSE 0 END) AS "男士人数"
FROM test1 GROUP BY city ;
lzp1127774265
2021-02-10
SELECT city,COUNT(*)AS "人数合计"
SUM(CASE WHEN gender='M' THEN 1 ELSE 0 END)AS "女士人数",
SUM(CASE WHEN gender='F' THEN 1 ELSE 0 END) AS "男士人数"
FROM test1 GROUP BY city
把order by删了,你前面按照city分组之后,性别这列就变成了一对多了,一个分组肯定会有多个性别在,所以数据库没办法判断你是用哪个性别排序,反正题目也没要求,你可以直接删了排序,如果一定要排序把性别也丢去分组估计也可以
lzp1127774265
2021-02-10
use test1;
CREATE TABLE test1 (city varchar(10), gender char(1));
INSERT INTO test1 (city, gender)
VALUES ('Delhi', 'M')
,('Delhi', 'F')
,('Delhi', 'M')
,('Delhi', 'M')
,('Pune', 'F')
,('Pune', 'M')
,('Pune', 'F')
,('Pune', 'F')
,('Banglore', 'F')
,('Banglore', 'F')
;
SELECT city,COUNT(*)AS "人数合计",
SUM(CASE WHEN gender='M' THEN 1 ELSE 0 END)AS "女士人数",
SUM(CASE WHEN gender='F' THEN 1 ELSE 0 END) AS "男士人数"
FROM test1 GROUP BY city ORDER BY gender
lzp1127774265
2021-02-10

可以看到存在这个库,如果你的这个文件里没有这个库,则说明你的版本和你的命令不匹配,有可能是你的sklearn版本太新或者太老
CDA100823
2021-02-10