这是小小本周的最后一篇,本周重点!文末送书,

我是小小,下面是本期文章,为您奉上!

前言

本实例将会以一个完整的例子用来阐述一个较为简单的Python数据分析。其中Python基础部分不再讲解

构建数据

这里使用numpy构建测试所用的数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as pltnp.random.seed(1)
N = 100

第一位同学成绩

# 第一位同学, 成绩平平大约在85分左右, 比较稳定
rand1 = np.random.normal(0, 1, N)
avg1 = 85
std1 = np.rint(avg1 + rand1)
plt.plot(std1)
plt.ylim(50, 100)
plt.show()

画出折线图如下

构造第二位同学成绩

# 第二位同学, 成绩优秀且稳步提高
rand2 = np.random.normal(0, 1, N)
avg2 = 90
trend2 = np.linspace(0, 10, N)
std2 = np.rint(avg2 + rand2 + trend2)    # 故意产出可能出现异常值的情况,后面数据预处理统一处理
std2[10] = np.nan
std2[13] = np.nan    # 有两次考试因病缺席

画出折线图

构造第三位同学成绩

# 第三位同学, 成绩较好但波动较大
rand3 = np.random.normal(0, 5, N)
avg3 = 88
std3 = np.rint(avg3 + rand3)

构造第四位成绩

# 第四位同学, 屌丝逆袭一路高歌
rand4 = np.random.normal(0, 2, N)
avg4 = 55
trend4 = np.linspace(0, 50, N)
std4 = np.rint(avg4 + rand4 + trend4)

构造第五位

# 第五位同学, 不断努力,但受某些外部因素干扰,成绩上升且具有周期性
rand5 = np.random.normal(0, 1, N)
avg5 = 72
trend5 = np.linspace(0, 20, N)
period5 = 3 * np.sin(np.linspace(0, 100, N))
std5 = np.rint(avg5 + rand5 + trend5 + period5)

总结

这里全部显示

# 多子图显示多个同学的成绩曲线
fig, ax = plt.subplots(2, 3, sharex='col', sharey='row', figsize=(20, 10))
plt.ylim(50, 110)
total = {'student1': std1, 'student2': std2, 'student3': std3, 'student4': std4, 'student5': std5}
keys = list(total.keys())
index = 0
for i in range(2):for j in range(3):try:key = keys[index]except Exception as e:passelse:std_score = total[key]ax[i, j].plot(std_score, label=key)ax[i, j].legend()index += 1

数据写入文件

df = pd.DataFrame({'student1': std1, 'student2': std2, 'student3': std3, 'student4': std4, 'student5': std5})
df.to_csv('student_score_raw.csv')

数据处理

这里使用 pandas 库对数据进行处理

读取数据

df = pd.read_csv('student_score_raw.csv', index_col=0)    # 第一例作为行索引,默认使用第一行作为列索引
df.head()

剔除数据

# 查看统计信息,可以看到哪个同学波动较大,哪个同学平均分较高等,却很难像曲线图那样直观看出各个同学的分数趋势
df.describe()

删除脏数据

df.plot(figsize=(10, 5))

# 将超过100分的数据设置为100分满分
df[df > 100] = 100
# 处理缺失值, 用缺失值前面的有效值从前往后填补
df = df.fillna(method='ffill', axis=0)
df.plot(figsize=(10, 5))

# 通过曲线可以直观看出:
# student1: 成绩一般,且很稳定
# student2: 成绩优秀,且稳步上升
# studeng3: 成绩一般,且波动很大
# student4: 屌丝逆袭,一路高歌
# student5: 一直进步,但具有一些周期性
# 和当初的数据设计吻合
df.to_csv('student_score.csv')

成绩预测

这里使用keras进行训练模型,实现对数据的预测

# 使用keras做预测
import math
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from sklearn.metrics import mean_squared_error

获取序列

def gen_data():'''生产用于做预测的数据'''df = pd.read_csv('student_score.csv',index_col=0,header=0)return df['student5']
s = gen_data()    # 抽取student5的同学成绩做模型训练, 预测该同学未来的成绩
s.plot(figsize=(10, 5))

归一化处理

from sklearn.preprocessing import MinMaxScaler
def preprocessing_scale(data):'''对数据进行归一化。args:data: 时序数据原始数据数组returns:dataset: 经过归一化后的时序数据scaler: 缩放'''scaler = MinMaxScaler(feature_range=(0, 1))dataset = np.array(data)dataset = np.reshape(dataset, (dataset.shape[0], 1))dataset = dataset.astype('float32')dataset = scaler.fit_transform(dataset)return dataset, scaler

获取训练集和测试集

def preprocessing_split(dataset):'''对数据划分训练数据和测试数据。args:dataset: 时序数据数组returns:四元祖,(dataset, train, test, scaler)dataset: 经过reshape和最大最小缩放后的时序数据train: 划分出来的训练集test: 划分出来的测试集scaler: 数据缩放对象'''train_size = int(len(dataset) * 0.66)test_size = len(dataset) - train_sizetrain, test = dataset[0:train_size, :], dataset[train_size:, :]return train, test
train, test = preprocessing_split(dataset)
print(train.shape, test.shape)
# (66, 1) (34, 1)

构造滑动窗口用的特征和标签数据

def create_dataset(dataset, look_back=1):'''构造用于LSTM训练的数据。args:dataset: 时序数据数组look_back: 步长值returns:元组,(特征x数组,标签y数组)'''dataX, dataY = [], []for i in range(len(dataset)-look_back):a = dataset[i: (i+look_back), 0]dataX.append(a)dataY.append(dataset[i+look_back, 0])return np.array(dataX), np.array(dataY)
x, y = create_dataset(train, 3)

构建LSTM模型

def create_lstm_model(look_back, predict_steps=1):'''构建lstm模型传入步长值,构建简单的lstm模型并返回。args:look_back: 步长值returns:model: keras的lstm模型'''model = Sequential()model.add(LSTM(32, input_shape=(1, look_back)))model.add(Dense(predict_steps))model.compile(loss='mean_squared_error', optimizer='adam')return model

对模型反复训练

def model_fit(model, train_x, train_y):'''训练模型'''model.fit(train_x, train_y, epochs=30, batch_size=1, verbose=2)

模型预测

def model_predict(model, trainX, testX, scaler):'''输入训练数据和测试数据,模型输出预测结果。args:model: lstm模型trainX: 训练数据的特征testX: 测试数据的特征scaler: 做缩放的对象,用于将归一化的数据还原returns:二元组,(train_predict, test_predict)train_predict: 训练数据的预测结果test_predict: 测试数据的预测结果'''train_predict = model.predict(trainX)test_predict = model.predict(testX)# 归一化数据还原train_predict = scaler.inverse_transform(train_predict)test_predict = scaler.inverse_transform(test_predict)return train_predict, test_predict

模型训练,查看结果

look_back = 10    # 设置往回看的步长为10
trainX, trainY = create_dataset(train, look_back)
testX, testY = create_dataset(test, look_back)
trainX = np.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1]))
testX = np.reshape(testX, (testX.shape[0], 1, testX.shape[1]))
model = create_lstm_model(look_back)
model_fit(model, trainX, trainY)
train_predict, test_predict = model_predict(model, trainX, testX, scaler)

预测成绩

# 预测未来五次成绩
predict_scores = []
times = 5
datas = dataset[-look_back:].flatten()
while times:datas = datas[-look_back:]input_datas = datas.reshape(1, 1, -1)print(input_datas)predict_score = model.predict(input_datas).flatten()print(predict_score)predict_scores.append(predict_score)datas = np.append(datas, predict_score)times -= 1
predict_scores = scaler.inverse_transform(predict_scores)
print(predict_scores)
plt.plot(predict_scores)

predict_datas = np.empty_like(dataset)
predict_datas[:, :] = np.nan
real_datas = scaler.inverse_transform(dataset)
predict_datas[-1] = real_datas[-1]
predict_datas = np.append(predict_datas, predict_scores, axis=0)
plt.plot(real_datas, label='real')
plt.plot(predict_datas, label='predict')
plt.legend()

文末送书

文末送书时刻!小小为粉文末送书,此时送的书是Python数据科学实践。

在此感谢北京大学出版社的支持,本次送书由北京大学出版社支持。

送书规矩

老规矩,从留言区中选中奖者,按照点赞数选择,点赞数高者获得书一本,累计送书三本。时间截止9月13日的18点。

送的书籍

小明菜市场

推荐阅读

● 优雅 | 今天很水的文章-Excel导入导出

● 理论 | 当 Spring Boot 遇上了消息队列......

● 实践 | kafka 基本使用

● 搭建 | 一步成功搭建Centos + Kubernetes 环境

● 震惊 | 某公司实习生跑路,竟为了学习偷盗面试题

文末送书 | 数据分析简单入门相关推荐

  1. 如何让Join跑的更快?(文末送书)

    JOIN 一直是数据库性能优化的老大难问题,本来挺快的查询,一旦涉及了几个 JOIN,性能就会陡降.而且,参与 JOIN 的表越大越多,性能就越难提上来. 其实,让 JOIN 跑得快的关键是要对 JO ...

  2. 深度学习与计算机视觉群 | 文末送书

    深度学习与计算机视觉③群已组建,上次开放进群,没来得及进的小伙伴,抓紧啦 .之后,我们会在交流群开展"你挑我送"为主题的送书活动哟~ 欢迎加入!!! 在过去的750天里,深度学习与 ...

  3. 文末送书 | 当Python遇上高考,会发生什么?

    (文末送书哦!) 延期一个月之后,1071万考生终于熬出头了. 这届高考太难了,不仅考学生,更是考验疫情的防控能力. 但是说到难,2018年浙江省教育厅的一个决定,让不少人感叹真难! 原来早在2017 ...

  4. 张益唐被曝已证明黎曼猜想相关问题,震动数学界(文末送书)

    金磊 Alex 发自 凹非寺 量子位 | 公众号 QbitAI 文末送书活动,记得看完啊 ! 先加群后抽奖,这次仅限群友参与 Breaking News! 网传数学家张益唐,已经攻克了朗道-西格尔零点 ...

  5. 统计学5大基本概念,建议收藏!(文末送书)

    转自:爱数据LoveD 大家好,我是小z,也可以叫我阿粥~ 今天给大家分享一波统计学重要概念,顺便前排提示文末送书~ 从高的角度来看,统计学是一种利用数学理论来进行数据分析的技术.象柱状图这种基本的可 ...

  6. 文末送书|用Pandas分析了75w多条数据,揭秘美国选民的总统喜好!

    点击"一行数据",选择"置顶公众号" 文末送书,不可错过! 来源:天池大数据科研平台 原文:https://tianchi.aliyun.com/noteboo ...

  7. 【文末送书】豆瓣9.3,这部神作终于出新版了!

    不久前,自称"业余up主"的AI大神李沐开源了一个剪辑神器 ,再圈一波技术粉! 图1:该项目在github上的页面展示 事实上,这位up主可并不业余,反而是妥妥的AI界卓越先驱.对 ...

  8. 真实的上海IT圈:张江男vs漕河泾男(文末送书)

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 人生难得几回搏,此时不搏待何时. ...

  9. 【iToday】涵盖100+技术网站的一站式资讯平台 | 文末送书

    里面包含了上百个IT网站,欢迎大家访问:http://itoday.top/#/ iToday,打开信息的新时代.作为一家创新的IT数字媒体平台,iToday致力于为用户提供最新.最全面的IT资讯和内 ...

最新文章

  1. Matlab与数据结构 -- 搜索向量或矩阵中非零元素的位置
  2. [分享]iOS开发-UI篇:CAlayer层的属性
  3. 熵的定义(很好的方法论工具尤其第三熵增益的计算)
  4. C/C++指针错误与调试相关学习总结
  5. 引用js或css后加?v= 版本号的用法
  6. P2370 yyy2015c01的U盘(二分+背包)
  7. 计算机基础- -认识汇编
  8. cmd 切换目录_Linux Shell从入门到删除根目录跑路指南
  9. iOS开发之二维码生成(错误问题小记,微信扫描,长按不识别)
  10. Caffe傻瓜系列(6):solver及其配置
  11. 电脑预览,电脑怎么预览psd格式?
  12. visio怎么画球_cad怎么画装配图
  13. Android中的工厂模式
  14. 【生信分析】基于TCGA肿瘤数据进行基因共表达网络分析
  15. 代码托管平台的待办事项你知道吗 ?|GitCode
  16. 用python检测微信好友是否删除自己
  17. Android客户端异常检测
  18. 禁忌搜索算法求解TSP旅行商问题Matlab实现
  19. mysql数据库有哪些版本_MySQL数据库各个版本的区别
  20. 熊猫烧香制造者李俊出狱后开软件公司

热门文章

  1. [20151112]ORA-01450?3215?.txt
  2. ubuntu 安装 swoole 和mac 安装swoole 扩展
  3. Java 读写json格式的文件方法详解
  4. dns在企业网络中的应用-1
  5. flex中datagrid中的过滤功能
  6. Python学习笔记——Python的下载与安装
  7. 戴尔网站的服务器,PowerEdge 11G R610机架式服务器
  8. 学习笔记(1):uni-app实战社区交友类app开发-引入自定义图标库
  9. matlab在电力系统潮流计算程序,大神们,求个电力系统潮流计算的matlab程序。
  10. Luogu P2309 loidc,卖卖萌