多场景下的算法构建

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

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['font.size'] = 15
os.chdir('C:/Users/HP/Desktop/')
'''
1、批量读取数据,并输出以下信息
(1)数据量
(2)数据字段columns
(3)输出每个文件分别有多少缺失值
'''

def f1_1():
    path = input('请输入文件路径:')
    for root, dirs, files in os.walk(path): # 遍历文件夹  os.walk(path)返回路径中的信息及文件,结果为一个生成器
        i = 1
        for name in files:
            path = os.path.join(root, name)
            #print('path:',path)
            data = pd.read_excel(path,index_col = 0) #pd.read_excel()中用“index_col”参数,将第一列变为index
            #print(data.head(),'\n')
            print('第%i个数据的数据量为:'%i,len(data))
            print('第%i个数据的数据字段为:'%i,list(data.columns))
            res = data[data.isnull().values == True]
            print('第%i个数据的缺失值数量为:%i'%(i,len(res)))
            print("=====================================================\n")
            i += 1

f1_1()
print('finished!')

结果:

第1个数据数据量为:31
第1个数据数据字段为: ['productA', 'productB']
第1个数据缺失值数量为:3
------
第2个数据数据量为:28
第2个数据数据字段为: ['productA', 'productB']
第2个数据缺失值数量为:4
------
第3个数据数据量为:31
第3个数据数据字段为: ['productA', 'productB']
第3个数据缺失值数量为:3
------
finished!
'''
2、批量读取数据,用均值填充缺失值数据,并完成以下计算及图表制作
'''
# 读取数据并用均值填充缺失值;
def f2_1():
    path = input('请输入文件路径:')
    for root, dirs, files in os.walk(path):
        lst = []
        for name in files:
            path = os.path.join(root, name)
            data = pd.read_excel(path,index_col = 0)
            data = data.fillna(data.mean())
            # columns = data.columns.tolist()
            # data[columns[0]].fillna(data[columns[0]].mean(),inplace = True)  
            # data[columns[1]].fillna(data[columns[1]].mean(),inplace = True)
            data.index = data.index.to_period() # 对“日期”字段进行时间序列处理,转换成日period
            #print(data.head(10),'\n')
            lst.append(data)
    return(lst)

[data1,data2,data3] = f2_1()
# 分别计算data1,data2,data3中A,B产品的月总销量
def f2_2(*data):
    value1 = []
    value2 = []
    for df in data:
        columns = df.columns
        a_sale_sum = df[columns[0]].sum()
        b_sale_sum = df[columns[1]].sum()
        value1.append(a_sale_sum)
        value2.append(b_sale_sum)
    df = pd.DataFrame({'A_sale_sum':value1,
                      'B_sale_sum':value2},
                     index = pd.period_range('201801','201803',freq = 'M'))

    #绘制多系列柱状图,存储在对应的图片文件夹路径
    plt.figure()
    df.plot(kind = 'bar',color = ['r','g'],alpha = 0.8,figsize = (10,6),rot = 0,edgecolor= 'k')
    plt.grid(True,linewidth = 1,linestyle = '--',color = 'k',alpha = 0.5)
    plt.title('1-3月A,B产品总销量柱状图')
    plt.ylim(0,25000)
    plt.savefig('picture/1-3月A,B产品总销量柱状图.png',dpi=400)

f2_2(data1,data2,data3)

这里写图片描述

# 分别计算A产品在每个月中哪一天超过了月度80%的销量,输出日期
def f2_3(*data):
    keysets = []
    for df in data:
        columns = df.columns
        df['A_sum'] = df[columns[0]].cumsum()/df[columns[0]].sum()
        key = df[df['A_sum']>0.8].index[0]
        keysets.append(str(key)) # 时间戳Timestampe转化成字符串用str()方法
    print('A产品月度超过80%的销量日期分别为:\n',keysets)
    return (keysets)

f2_3(data1,data2,data3)

结果:

A产品月度超过80%的销量日期分别为:
 ['2018-01-26 00:00:00', '2018-02-24 00:00:00', '2018-03-25']
'''
3、读取数据并合并,做散点图观察A,B产品销量,并做回归,预测当A销量为1200时,B产品销量值

(2)针对A产品销量和B产品销量数据做回归分析,制作散点图并存储,并预测当A销量为1200时,B产品销量值
要求:
① 分别创建两个函数,对应完成上述需求
② 数据文件夹路径和图片存储路径不要相同
提示:
① 用pd.dripna方法去掉缺失值,注意inplace参数

'''
# 读取数据删除缺失值;对“日期”字段进行时间序列处理,转换成日period ,合并三个月数据,输出data;
def f3_1():
    data_list = []
    for root, dirs, files in os.walk('data'):
        for name in files:
            path = os.path.join(root, name)
            data = pd.read_excel(path,index_col = 0)
            data.to_period()
            data.dropna(inplace = True)
            data_list.append(data)
    df = pd.concat([data_list[0],data_list[1],data_list[2]])
    return (df) 
data = f3_1()
data[:5]

结果:


              productA  productB
日期      
2018-01-01  270.997943  371.615646
2018-01-02  638.322113  788.081579
2018-01-03  364.454658  454.279288
2018-01-04  251.432000  340.337651
2018-01-05  261.411794  419.372368
# 针对A产品销量和B产品销量数据做回归分析,制作散点图并存储,并预测当A销量为1200时,B产品销量值
def f3_2(data):
    model = LinearRegression()
    model.fit(data['productA'][:,np.newaxis],data['productB'])
    print('相关系数为:',model.score(data['productA'][:,np.newaxis],data['productB']))

    xtest = np.linspace(0,1000,1000)
    ytest = model.predict(xtest[:,np.newaxis])
    # print('model.coef_:',model.coef_)
    # print('model.intercept_:',model.intercept_)
    print('拟合曲线为:y=%.4fx+%.4f'%(model.coef_,model.intercept_))

    plt.figure(figsize = (10,6))
    plt.scatter(data['productA'],data['productB'],color = 'g',marker = '.')
    plt.plot(xtest,ytest,color = 'r')
    plt.grid(True,linewidth =1,linestyle = '--')
    plt.axis([0,1200,0,1400])
    plt.title('A-B产品销量回归拟合')
    plt.savefig('picture/A-B产品销量回归拟合.png',dpi = 400)   
    print('预测当A销量为1200时,B产品销量值为:%.2f'%model.predict(1200))

f3_2(data)  

结果:

相关系数为: 0.984452323374547
拟合曲线为:y=1.0014x+102.1816
预测当A销量为1200时,B产品销量值为:1303.84

这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值