python数据可视化 插值法折线图 补全时间序列 可调横坐标间距不改变节点数 拟合/插值合二为一

python数据可视化 插值法折线图 补全时间序列 可调横坐标间距不改变节点数

1.优点

 1. 利用插值算法,补全时间序列
 2. 不均匀分布(原始数据)——>均匀(处理后的数据)
 3. 横坐标间距可调
 4. 曲线圆润,配合回归方程预测趋势

代码1

import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
import time

#显示中文标签
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False

# 原数据
x = [1611121375, 1611121460, 1611121546, 1611121631, 1611121717, 1611121802, 1611121888, 1611121974, 1611122060, 1611122145, 1611122231, 1611122316, 1611122402, 1611122488, 1611122574, 1611122660, 1611122746, 1611122832, 1611122917, 1611123003, 1611123089, 1611123174, 1611123260, 1611123346, 1611123432, 1611123517, 1611123603, 1611123688, 1611123774, 1611123860, 1611123946, 1611124031, 1611124117, 1611124203, 1611124289, 1611124374, 1611124460, 1611124546, 1611124631, 1611124717, 1611124802, 1611124888, 1611124974, 1611125059, 1611125145, 1611125231, 1611125316, 1611125402, 1611125487, 1611125573, 1611125658, 1611125744, 1611125829, 1611125915, 1611126001, 1611126086, 1611126172, 1611126258, 1611126343, 1611126429, 1611126516, 1611126601, 1611126687, 1611126773, 1611126858, 1611126944, 1611127030, 1611127116, 1611127201, 1611127287, 1611127373, 1611127458, 1611127544, 1611127630, 1611127715, 1611127801, 1611127887, 1611127972, 1611128058, 1611128143, 1611128229, 1611128316, 1611128401, 1611128487, 1611128573, 1611128659, 1611128744, 1611128832, 1611128918, 1611129004, 1611129089, 1611129175, 1611129261, 1611129346]
y = [84, 84, 84, 84, 85, 84, 85, 85, 85, 86, 87, 87, 87, 88, 88, 88, 88, 89, 89, 90, 90, 91, 91, 91, 91, 92, 92, 92, 92, 93, 93, 93, 93, 93, 94, 94, 94, 95, 95, 95, 95, 95, 96, 96, 97, 97, 98, 98, 99, 99, 99, 100, 100, 101, 102, 102, 103, 103, 103, 103, 103, 104, 105, 106, 106, 106, 106, 107, 108, 108, 109, 109, 110, 110, 110, 111, 112, 113, 113, 114, 114, 114, 114, 114, 116, 96, 76, 59, 59, 58, 58, 58, 58, 58]

# 设置时间粒度,原数据是时间戳,单位是秒,转换为分钟;这个数也可以用于控制插入值的数量,从而影响折线平滑度,越小越平滑越耗时
min = 0.5
# 生成x的矩阵
xnew = np.arange(x[0], x[-1], 60*min, int)
# 生成转换函数,这里参数是三维的'cubic',根据不同数据可做修改
func = interpolate.interp1d(x, y, kind='cubic')
# 计算新y值
ynew = func(xnew)
# 将时间戳转换为时间
xnew = [time.strftime('%m%d %H:%M', time.localtime(i)) for i in xnew]

# 设置x,y轴代表意思
plt.xlabel("时间")
plt.ylabel("热度")
plt.plot(xnew, ynew)

# 要显示的x轴,不会改变数据,只会改变x的标识,传入一个列表和风格参数
plt.xticks(xnew[0:-1:10],rotation=90)

# 显示
plt.show()

运行结果1
插值法折线图

2.利用插入后的数据进行拟合分析(只修改虚线内)

代码2

import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
import time

#显示中文标签
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False

# 原数据
x = [1611121375, 1611121460, 1611121546, 1611121631, 1611121717, 1611121802, 1611121888, 1611121974, 1611122060, 1611122145, 1611122231, 1611122316, 1611122402, 1611122488, 1611122574, 1611122660, 1611122746, 1611122832, 1611122917, 1611123003, 1611123089, 1611123174, 1611123260, 1611123346, 1611123432, 1611123517, 1611123603, 1611123688, 1611123774, 1611123860, 1611123946, 1611124031, 1611124117, 1611124203, 1611124289, 1611124374, 1611124460, 1611124546, 1611124631, 1611124717, 1611124802, 1611124888, 1611124974, 1611125059, 1611125145, 1611125231, 1611125316, 1611125402, 1611125487, 1611125573, 1611125658, 1611125744, 1611125829, 1611125915, 1611126001, 1611126086, 1611126172, 1611126258, 1611126343, 1611126429, 1611126516, 1611126601, 1611126687, 1611126773, 1611126858, 1611126944, 1611127030, 1611127116, 1611127201, 1611127287, 1611127373, 1611127458, 1611127544, 1611127630, 1611127715, 1611127801, 1611127887, 1611127972, 1611128058, 1611128143, 1611128229, 1611128316, 1611128401, 1611128487, 1611128573, 1611128659, 1611128744, 1611128832, 1611128918, 1611129004, 1611129089, 1611129175, 1611129261, 1611129346]
y = [84, 84, 84, 84, 85, 84, 85, 85, 85, 86, 87, 87, 87, 88, 88, 88, 88, 89, 89, 90, 90, 91, 91, 91, 91, 92, 92, 92, 92, 93, 93, 93, 93, 93, 94, 94, 94, 95, 95, 95, 95, 95, 96, 96, 97, 97, 98, 98, 99, 99, 99, 100, 100, 101, 102, 102, 103, 103, 103, 103, 103, 104, 105, 106, 106, 106, 106, 107, 108, 108, 109, 109, 110, 110, 110, 111, 112, 113, 113, 114, 114, 114, 114, 114, 116, 96, 76, 59, 59, 58, 58, 58, 58, 58]

# 设置时间粒度,原数据是时间戳,单位是秒,转换为分钟;这个数也可以用于控制插入值的数量,从而影响折线平滑度,越小越平滑越耗时
min = 0.5
# 生成x的矩阵
xnew = np.arange(x[0], x[-1], 60*min, int)
# 生成转换函数,这里参数是三维的'cubic',根据不同数据可做修改
func = interpolate.interp1d(x, y, kind='cubic')
# 计算新y值
ynew = func(xnew)

'''--------------------------------------------------------------------------------'''
# 线性拟合y值,3次多项式,可根据需要调整幂
z1 = np.polyfit(xnew, ynew, 3)  # 曲线拟合,返回值为多项式的各项系数
p1 = np.poly1d(z1)  # 返回值为多项式的表达式,也就是函数式子
yvals = p1(xnew)  # 也可以使用yvals=np.polyval(z1,x)
'''--------------------------------------------------------------------------------'''

# 将时间戳转换为时间
xnew = [time.strftime('%m%d %H:%M', time.localtime(i)) for i in xnew]

# 设置x,y轴代表意思
plt.xlabel("时间")
plt.ylabel("热度")

plt.plot(xnew, ynew, '*')
plt.plot(xnew, yvals)

# 要显示的x轴,不会改变数据,只会改变x的标识,传入一个列表和风格参数
plt.xticks(xnew[0:-1:10],rotation=90)

# 显示
plt.show()

运行结果2
插值拟合
拟合效果不是很好,没办法,知乎热度这种东西

!玄学 !

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值