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