数据:某公司A,B产品在2018年1,2,3月的销量数据,数据格式为xlsx
1 批量读取数据,并输出数据量、数据字段columns、每个文件的缺失值量
要求:
① 创建独立函数,从读取数据到以上输出要求
② 运行代码多次调用创建函数,对数据进行批量处理
提示:
① 将课程excel数据放入单独文件夹(建议英文路径),函数中通过input来输入excel数据所在文件夹路径,再通过遍历来读取文件
② pd.read_excel()中用“index_col”参数,将第一列变为index
③ os.walk(path) → 返回路径中的信息及文件,结果为一个生成器
④ 定位缺失值位置:data[data.isnull().values == True]
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
import os
def f1_1():
path = 'C:/Users/yangy/Desktop/多场景下的算法构建/'
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() # 运行函数
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/Hjx/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/Hjx/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('运行函数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产品销量值
要求:
① 分别创建两个函数,对应完成上述需求
② 数据文件夹路径和图片存储路径不要相同
提示:
① 用pd.dripna方法去掉缺失值,注意inplace参数
# 创建函数f3_1() → 完成问题3-1
def f3_1():
path = 'C:/Users/yangy/Desktop/多场景下的算法构建/'
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/yangy/Desktop/图片保存位置/'
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-------')