多场景下的算法构建

数据:某公司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-------')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值