【Pandas数据清洗与处理】项目3-某公司A,B产品销量分析

数据:

某公司A,B产品在2018年1,2,3月的销量数据,数据格式为xlsx
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/Hjx/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()方法
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)
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)
    # 绘制图表,并导出图表
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参数
def f3_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.dropna(inplace=True)  # 删除缺失值
        data_files.append(data)
    data = pd.concat([data_files[0],data_files[1],data_files[2]])  # 合并数据
    return(data)


def f3_2(data):
    path = 'C:/Users/Hjx/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-------')

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值