版权声明:欢迎转载~ 转载请注明来源及作者,谢谢! https://blog.csdn.net/qq_42442369/article/details/86737739
【项目05】 多场景下的算法构建
'''
【项目05】 多场景下的算法构建
课程数据:
某公司A,B产品在2018年1,2,3月的销量数据,数据格式为xlsx
作业要求:
1、批量读取数据,并输出以下信息
(1)数据量
(2)数据字段columns
(3)输出每个文件分别有多少缺失值
要求:
① 创建独立函数,从读取数据到以上输出要求
② 运行代码多次调用创建函数,对数据进行批量处理
提示:
① 将课程excel数据放入单独文件夹(建议英文路径),函数中通过input来输入excel数据所在文件夹路径,再通过遍历来读取文件
② pd.read_excel()中用“index_col”参数,将第一列变为index
③ os.walk(path) → 返回路径中的信息及文件,结果为一个生成器
④ 定位缺失值位置:data[data.isnull().values == True]
2、批量读取数据,用均值填充缺失值数据,并完成以下计算及图表制作
(1)读取数据并用均值填充缺失值;对“日期”字段进行时间序列处理,转换成日period ,最后输出三个Dataframe文件data1,data2,data3
(2)分别计算data1,data2,data3中A,B产品的月总销量,并绘制多系列柱状图,存储在对应的图片文件夹路径
(3)分别计算A产品在每个月中哪一天超过了月度80%的销量,输出日期
要求:
① 分别创建四个函数,对应完成上述需求
② 数据文件夹路径和图片存储路径不要相同
提示:
① 时间序列转换方法提示:pd.to_period
② 时间戳Timestampe转化成字符串用str()方法
3、读取数据并合并,做散点图观察A,B产品销量,并做回归,预测当A销量为1200时,B产品销量值
(1)读取数据删除缺失值;对“日期”字段进行时间序列处理,转换成日period ,合并三个月数据,输出data;
(2)针对A产品销量和B产品销量数据做回归分析,制作散点图并存储,并预测当A销量为1200时,B产品销量值
要求:
① 分别创建两个函数,对应完成上述需求
② 数据文件夹路径和图片存储路径不要相同
提示:
① 用pd.dripna方法去掉缺失值,注意inplace参数
'''
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
import os
% matplotlib inline
'''
1、批量读取数据,并输出以下信息
(1)数据量
(2)数据字段columns
(3)输出每个文件分别有多少缺失值
要求:
① 创建独立函数,从读取数据到以上输出要求
② 运行代码多次调用创建函数,对数据进行批量处理
提示:
① 将课程excel数据放入单独文件夹(建议英文路径)
② pd.read_excel()中用“index_col”参数,将第一列变为index
③ os.walk(path) → 返回路径中的信息及文件,结果为一个生成器
④ 定位缺失值位置:data[data.isnull().values == True]
'''
def f1_1():
path = 'C:/Users/shuol/Desktop/项目05多场景下的算法构建/'
folder = os.walk(path) # 遍历文件夹
files = list(folder)[0][2]
n = 1
for i in files:
file = path + i
data = pd.read_excel(file,index_col = 0)
data_counts = len(data) # 计算数据量
columns = data.columns.tolist() # 输出数据columns
nan_counts = len(data[data.isnull().values == True]) # 计算缺失值数量
print('第%i个数据数据量为:%i' % (n, data_counts))
print('第%i个数据数据字段为:' % n,columns)
print('第%i个数据缺失值数量为:%i' % (n, nan_counts))
print('------')
n += 1
f1_1() # 运行函数
print('finished!')
'''
2、批量读取数据,用均值填充缺失值数据,并完成以下计算及图表制作
(1)读取数据并用均值填充缺失值;对“日期”字段进行时间序列处理,转换成日period ,最后输出三个Dataframe文件data1,data2,data3
(2)分别计算data1,data2,data3中A,B产品的月总销量,并绘制多系列柱状图,存储在对应的图片文件夹路径
(3)分别计算A产品在每个月中哪一天超过了月度80%的销量,输出日期
要求:
① 分别创建四个函数,对应完成上述需求
② 数据文件夹路径和图片存储路径不要相同
提示:
① 时间序列转换方法提示:pd.to_period
② 时间戳Timestampe转化成字符串用str()方法
'''
# 创建函数f2_1() → 完成问题2-1
def f2_1():
path = 'C:/Users/shuol/Desktop/项目05多场景下的算法构建/'
folder = os.walk(path) # 遍历文件夹
files = list(folder)[0][2]
data_files = []
for i in files:
file = path + i
data = pd.read_excel(file,index_col = 0)
columns = data.columns.tolist() # 提取列名
data.to_period() # 转换成时间序列
data[columns[0]].fillna(data[columns[0]].mean(),inplace = True)
data[columns[1]].fillna(data[columns[1]].mean(),inplace = True)
# 均值填充缺失值
data_files.append(data)
return(data_files)
# 创建函数f2_2() → 完成问题2-2
def f2_2(*data_files):
path = 'C:/Users/shuol/Desktop/项目05图片保存位置/'
A_sale = []
B_sale = []
for data in data_files:
columns = data.columns # 提取列名
A_sale.append(data[columns[0]].sum()) # 更新A产品总销售量
B_sale.append(data[columns[1]].sum()) # 更新B产品总销售量
df = pd.DataFrame({'A_sale_sum': A_sale,'B_sale_sum':B_sale},
index = pd.period_range('201801','201803',freq = 'M'))
#print(df)
# 查看数据
plt.figure()
df.plot(kind = 'bar',style = '--o',color = ['r','g'],alpha = 0.8, rot = 0,figsize = (8,4))
plt.title('1-3月A,B产品总销量柱状图')
plt.ylim([0,25000])
plt.legend(loc = 'upper left')
plt.grid()
plt.savefig(path + '1-3月A,B产品总销量柱状图.png',dpi=400)
# 绘制图表,并导出图表
# 创建函数f2_3() → 完成问题2-3
def f2_3(*data_files):
keydates = []
for data in data_files:
columns = data.columns # 提取列名
data['A_sale_sum%'] = data[columns[0]].cumsum() / data[columns[0]].sum() # 计算A产品累计销量占比
keydate = data[data['A_sale_sum%']>0.8].index[0]
keydates.append(str(keydate))
# 记录销量超过80%的日期
print('A产品月度超过80%的销量日期分别为\n', keydates)
return(keydates)
f2_1()
data1, data2, data3 = f2_1()[0], f2_1()[1], f2_1()[2]
#print(data1.head(),'\n-----')
#print(data1.head(),'\n-----')
#print(data1.head(),'\n-----')
print('运行函数f2_1(), 分别得到 data1,data2,data3\n-------')
f2_2(data1,data2,data3)
print('运行函数f2_2(), 求出不同月份A,B产品总销量,并制作图表\n-------')
f2_3(data1,data2,data3)
print('运行函数f2_3(), 求出A产品每个月中超过了月度80%的销量的日期\n-------')
'''
3、读取数据并合并,做散点图观察A,B产品销量,并做回归,预测当A销量为1200时,B产品销量值
(1)读取数据删除缺失值;对“日期”字段进行时间序列处理,转换成日period ,合并三个月数据,输出data;
(2)针对A产品销量和B产品销量数据做回归分析,制作散点图并存储,并预测当A销量为1200时,B产品销量值
## 回归分析(regression analysis)是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法
要求:
① 分别创建两个函数,对应完成上述需求
② 数据文件夹路径和图片存储路径不要相同
提示:
① 用pd.dripna方法去掉缺失值,注意inplace参数
'''
# 创建函数f3_1() → 完成问题3-1
def f3_1():
path = 'C:/Users/shuol/Desktop/项目05多场景下的算法构建/'
folder = os.walk(path) # 遍历文件夹
files = list(folder)[0][2]
data_files = []
for i in files:
file = path + i
data = pd.read_excel(file,index_col = 0)
columns = data.columns.tolist() # 提取列名
data.to_period() # 转换成时间序列
data.dropna(inplace=True) # 删除缺失值
data_files.append(data)
data = pd.concat([data_files[0],data_files[1],data_files[2]]) # 合并数据
return(data)
# 创建函数f3_2() → 完成问题3-2
def f3_2(data):
path = 'C:/Users/shuol/Desktop/项目05图片保存位置/'
model = LinearRegression()
model.fit(data['productA'][:,np.newaxis],data['productB'])
# 构建回归模型
xtest = np.linspace(0,1000,1000)
ytest = model.predict(xtest[:,np.newaxis])
plt.scatter(data['productA'],data['productB'],marker = '.',color = 'k')
plt.plot(xtest,ytest,color = 'r')
plt.grid(True)
plt.title('A-B产品销量回归拟合')
plt.savefig(path + 'A-B产品销量回归拟合.png',dpi=400)
# 存储图表
return(model.predict(1200))
f3_1()
data = f3_1()
print('运行函数f3_1(), 查看AB产品销量关系,并制作图表\n-------')
f3_2(data)
print('预测当A销量为1200时,B产品销量值为%.1f' % f3_2(data))
print('运行函数f3_2(), 对AB产品销量数据做回归分析并制图,并预测当A销量为1200时,B产品销量值\n-------')
【项目06】 多场景下的图表可视化表达
'''
【项目06】 多场景下的图表可视化表达
课程数据:
2016年奥运运动员数据,数据格式为xlsx,分3个sheet
1、分男女分别分析运动员的身高分布,并制作图表,数据为“奥运运动员数据.xlsx,sheet → 运动员信息”
要求:
① 制作分布密度图
② 计算出男女平均身高,并绘制辅助线表示
提示:
① 可视化制图方法 → sns.distplot()
② 辅助线制图方法 → plt.axvline()
③ 分男女分别筛选数据并制作图表
④ 不需要创建函数
2、综合指标判断运动员的身材,并找到TOP8的运动员,并制作图表,数据为“奥运运动员数据.xlsx,sheet → 运动员信息”
要求:
① 针对不同指标,绘制面积堆叠图
② TOP8的运动员,绘制雷达图表示
提示:
① 四个指标评判运动员身材,并加权平均
a. BMI 指数(BMI =体重kg ÷ 身高m**2,详细信息可百度查询)→ 越接近22分数越高
b. 腿长/身高 指数 → 数据筛选,只选取小于0.7的数据,越大分数越高
c. 臂展/身高 指数 → 数据筛选,只选取大于0.7的数据,比值越接近1分数越高
d. 年龄 指数 → 年龄越小分数越高
对上述abcd指标分别标准化得到n1,n2,n3,n4(划分到0-1的分值)
最后评分: finalscore = (n1 + n2 + n3 + n4)/4
② 制作堆叠面积图,data.plot.area()
③ 雷达图需要构建子图 + for循环遍历得到
3、根据运动员CP数据,分析出CP综合热度,通过python处理数据并导出,在Gephi中绘制图表,数据为“奥运运动员数据.xlsx,sheet → 运动员CP热度”
要求:
① 用python计算出综合热度指标
② 用Gephi绘制关系可视化图表
提示:
① 三个指标评判运动员CP综合热度,并加权平均
a. cp微博数量 → 数量越多分数越高
b. cp微博话题阅读量 → 阅读量越多分数越高
c. B站cp视频播放量 → 播放量越大分数越高
对上述abcd指标分别标准化得到n1,n2,n3,n4(划分到0-1的分值)
最后评分: finalscore = n1*0.5 + n2*0.3 + n3*0.2
② Gephi中布局模式选择“ForceAtlas2”
③ Gephi中通过模块化计算,给关联结果做分组,并且以此分组设定点颜色
'''
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
% matplotlib inline
import warnings
warnings.filterwarnings('ignore')
'''
1、分男女分别分析运动员的身高分布,并制作图表,数据为“奥运运动员数据.xlsx,sheet → 运动员信息”
要求:
① 制作分布密度图
② 计算出男女平均身高,并绘制辅助线表示
提示:
① 可视化制图方法 → sns.distplot()
② 辅助线制图方法 → plt.axvline()
③ 分男女分别筛选数据并制作图表
④ 不需要创建函数
'''
import os
os.chdir('C:/Users/shuol/Desktop/new')
# 创建工作路径
df = pd.read_excel('奥运运动员数据.xlsx',sheetname=1,header=0)
df_length = len(df)
df_columns = df.columns.tolist()
# 查看数据
# pd.read_excel → 读取excel文件,这里得到的是pandas的dataframe数据格式
data = df[['event','name','gender','height']]
data.dropna(inplace = True) # 去掉缺失值
data_male = data[data['gender'] == '男']
data_female = data[data['gender'] == '女']
# 筛选数据,按照目标字段筛选
# 提取男女数据
hmean_male = data_male['height'].mean()
hmean_female = data_female['height'].mean()
# 计算男女平均身高
sns.set_style("ticks")
# 图表风格设置
# 风格选择包括:"white", "dark", "whitegrid", "darkgrid", "ticks"
plt.figure(figsize = (8,4)) # 设置作图大小
sns.distplot(data_male['height'],hist = False,kde = True,rug = True,
rug_kws = {'color':'y','lw':2,'alpha':0.5,'height':0.1} , # 设置数据频率分布颜色
kde_kws={"color": "y", "lw": 1.5, 'linestyle':'--'}, # 设置密度曲线颜色,线宽,标注、线形
label = 'male_height')
sns.distplot(data_female['height'],hist = False,kde = True,rug = True,
rug_kws = {'color':'g','lw':2,'alpha':0.5} ,
kde_kws={"color": "g", "lw": 1.5, 'linestyle':'--'},
label = 'female_height')
# 绘制男女高度分布密度图
plt.axvline(hmean_male,color='y',linestyle=":",alpha=0.8)
plt.text(hmean_male+2,0.005,'male_height_mean: %.1fcm' % (hmean_male), color = 'y')
# 绘制男运动员平均身高辅助线
plt.axvline(hmean_female,color='g',linestyle=":",alpha=0.8)
plt.text(hmean_female+2,0.008,'female_height_mean: %.1fcm' % (hmean_female), color = 'g')
# 绘制女运动员平均身高辅助线
plt.ylim([0,0.03])
plt.grid(linestyle = '--') # 添加网格线
plt.title("Athlete's height") # 添加图表名
# 图表其他内容
'''
2、综合指标判断运动员的身材,并找到TOP8的运动员,并制作图表,数据为“奥运运动员数据.xlsx,sheet → 运动员信息”
要求:
① 针对不同指标,绘制面积堆叠图
② TOP8的运动员,绘制雷达图表示
提示:
① 四个指标评判运动员身材,并加权平均
a. BMI 指数(BMI =体重kg ÷ 身高m**2,详细信息可百度查询)→ 越接近22分数越高
b. 腿长/身高 指数 → 数据筛选,只选取小于0.7的数据,越大分数越高
c. 臂展/身高 指数 → 数据筛选,只选取大于0.7的数据,比值越接近1分数越高
d. 年龄 指数 → 年龄越小分数越高
对上述abcd指标分别标准化得到n1,n2,n3,n4(划分到0-1的分值)
最后评分: finalscore = (n1 + n2 + n3 + n4)/4
② 制作堆叠面积图,data.plot.area()
③ 雷达图需要构建子图 + for循环遍历得到
'''
import os
os.chdir('C:/Users/shuol/Desktop/new2')
# 创建工作路径
df = pd.read_excel('奥运运动员数据.xlsx',sheetname=1,header=0)
df_length = len(df)
df_columns = df.columns.tolist()
# 查看数据
# pd.read_excel → 读取excel文件,这里得到的是pandas的dataframe数据格式
'''
(1) 分析运动员全样本数据的身材分布情况
'''
data = df[['event','name','birthday','height','arm','leg','weight','age']]
data.dropna(inplace = True) # 去掉缺失值
# 筛选数据,按照目标字段筛选
data['BMI'] = data['weight']/(data['height']/100)**2
# 求BMI
data['arm/h'] = data['arm'] / data['height']
data['leg/h'] = data['leg'] / data['height']
data = data[data['leg/h']<0.7]
data = data[data['arm/h']>0.7]
# 分别计算“臂展/身高”、“腿长/身高”,并删除异常数据
data_re = data[['event','name','arm/h','leg/h','BMI','age']]
# 重新新建结果数据data_re
data_re['BMI_assess'] = np.abs(data['BMI'] - 22) # BMI评估 → 最接近22,差值绝对值越小分数越高
data_re['leg_assess'] = data['leg/h'] # 腿长评估 → 与身高比值,越大分数越高
data_re['arm_assess'] = np.abs(data['arm/h'] - 1) # 手长评估 → 与身高比值最接近1,差值绝对值越小分数越高
data_re['age_assess'] = data['age'] # 年龄评估 → 最小,越小分数越高
data_re['BMI_nor'] = (data_re['BMI_assess'].max() - data_re['BMI_assess'])/(data_re['BMI_assess'].max()-data_re['BMI_assess'].min())
data_re['leg_nor'] = (data_re['leg_assess'] - data_re['leg_assess'].min())/(data_re['leg_assess'].max()-data_re['leg_assess'].min())
data_re['arm_nor'] = (data_re['arm_assess'].max() - data_re['arm_assess'])/(data_re['arm_assess'].max()-data_re['arm_assess'].min())
data_re['age_nor'] = (data_re['age_assess'].max() - data_re['age_assess'])/(data_re['age_assess'].max()-data_re['age_assess'].min())
# 标准化
data_re['final'] = (data_re['BMI_nor']+data_re['leg_nor']+data_re['arm_nor']+data_re['age_nor'])/4
# 计算总体评价结果
plt.figure(figsize = (10,6))
data_re.sort_values(by = 'final',inplace = True,ascending=False)
data_re.reset_index(inplace=True)
# 排序并重新设定index
data_re[['age_nor','BMI_nor','leg_nor','arm_nor']].plot.area(colormap = 'PuRd',alpha = 0.5,figsize = (10,6))
plt.ylim([0,4])
plt.grid(linestyle = '--')
# 绘制运动员身材数据分布图表
'''
(2) 解读身材最好的前8位运动员
'''
datatop8 = data_re[:8]
# 数据筛选
fig = plt.figure(figsize=(15,6))
plt.subplots_adjust(wspace=0.35,hspace=0.5)
n = 0
for i in datatop8['name'].tolist():
n += 1
c = plt.cm.BuPu_r(np.linspace(0, 0.7,10))[n-1]
axi = plt.subplot(2,4,n, projection = 'polar')
datai = datatop8[['BMI_nor','leg_nor','arm_nor','age_nor']][datatop8['name']==i].T
scorei = datatop8['final'][datatop8['name']==i]
angles = np.linspace(0, 2*np.pi, 4, endpoint=False)
#axi.plot(angles,datai,linestyle = '-',lw=1,color = c)
plt.polar(angles, datai, 'o-', linewidth=1,color = c)
axi.fill(angles,datai,alpha=0.5,color=c)
axi.set_thetagrids(np.arange(0.0, 360.0, 90),['BMI','腿长/身高','臂长/身高','年龄'])
axi.set_rgrids(np.arange(0.2,1.5,0.2),'--')
plt.title('Top%i %s: %.3f\n' %(n,i,scorei))
# 分别绘制每个运动员的评分雷达图
'''
3、根据运动员CP数据,分析出CP综合热度,通过python处理数据并导出,在Gephi中绘制图表,数据为“奥运运动员数据.xlsx,sheet → 运动员CP热度”
要求:
① 用python计算出综合热度指标
② 用Gephi绘制关系可视化图表
提示:
① 三个指标评判运动员CP综合热度,并加权平均
a. cp微博数量 → 数量越多分数越高
b. cp微博话题阅读量 → 阅读量越多分数越高
c. B站cp视频播放量 → 播放量越大分数越高
对上述abcd指标分别标准化得到n1,n2,n3,n4(划分到0-1的分值)
最后评分: finalscore = n1*0.5 + n2*0.3 + n3*0.2
② Gephi中布局模式选择“ForceAtlas2”
③ Gephi中通过模块化计算,给关联结果做分组,并且以此分组设定点颜色
'''
df = pd.read_excel('奥运运动员数据.xlsx',sheetname=2,header=0)
df_length = len(df)
df_columns = df.columns.tolist()
# 查看数据
# pd.read_excel → 读取excel文件,这里得到的是pandas的dataframe数据格式
df.replace([np.nan,'无数据','无贴吧'],0,inplace=True)
# 数据清洗
df['n1'] = (df['cp微博数量']-df['cp微博数量'].min())/(df['cp微博数量'].max()-df['cp微博数量'].min())
df['n2'] = (df['cp微博话题阅读量']-df['cp微博话题阅读量'].min())/(df['cp微博话题阅读量'].max()-df['cp微博话题阅读量'].min())
df['n3'] = (df['B站cp视频播放量']-df['B站cp视频播放量'].min())/(df['B站cp视频播放量'].max()-df['B站cp视频播放量'].min())
df['f'] = df['n1']*0.5 + df['n2']*0.3 + df['n3']*0.2
# 计算综合热度
df.sort_values(by = 'f',inplace = True,ascending=False)
df.reset_index(inplace=True)
# 数据重新排序
result = df[['p1','p2','f']]
writer = pd.ExcelWriter('output.xlsx')
result.to_excel(writer,'sheet1')
writer.save()
# 数据导出excel文件