在处理二维数据时,对于在原本在数据集中不存在的数据,我们经常需要利用插值获得其值,恰巧本人最近做时间序列的时候,需要插值得到一些原本不存在的时间处的值,自己写个小博客记录一下。首先是一般序列,然后是日期的序列,最后是任意时间的序列
y
关于np.interp的更多介绍,请参考官方文档:
https://numpy.org/doc/stable/reference/generated/numpy.interp.html
为了方便显示,下面会绘图显示出来插值的点
import matplotlib.pyplot as plt
plt.plot(x, y)
plt.plot(2.017, np.interp(2.017, x, y), 'r*')
plt.show()
得到下图
其中的红色※号点就是我们根据横坐标2.017借助np.interp得到的插值点
我也有看到好像可以借助pandas有interp的包可以处理这个问题,但是我这里用np.interp照样可以处理,只不过需要首先把日期格式转换为整数类型的横坐标(这里我用到的是int(日期方法)),这是因为np.interp的输入
for i in range(180):
day = begin + datetime.timedelta(days=2*i)
xdate.append(day)
y.append(np.cos(i/50 * np.pi))
xdate_int = [int(t.strftime("%Y%m%d")) for t in xdate]
day = datetime.date(2020,10,2)
x_day_int = int(day.strftime("%Y%m%d"))
xday_y = np.interp(x_day_int, xdate_int, y)
plt.plot(xdate, y)
plt.plot(day, xday_y, 'r*')
得到的图和插值点如下,
原本2020.10.02这一天的数据是没有的,但是可以通过插值得到
对于一般的时间序列,我这里是转化为np.datetime64的格式之后转化为int64的整数的,这样就可以继续调用np.interp方法了✌️
import datetime
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
xtimelist = pd.date_range('2020-01-01 00:00:00', '2020-01-01 05:00:00', freq= '1min')
y = []
for i in range(len(xtimelist)):
y.append(np.cos(i/60 * np.pi))
xtimelist_int = [np.datetime64(t).astype(np.int64) for t in xtimelist]
x_time = np.datetime64('2020-01-01 03:21:07.000000')
x_time_int = x_time.astype(np.int64)
x_time_y = np.interp(x_time_int, xtimelist_int, y)
plt.plot(xtimelist, y)
plt.plot(x_time, x_time_y, 'r*')
plt.show()
结果和插值点如下图所示,
就这样我们获得了一个特殊时刻(2020-01-01 03:21:07.000000,注意这里的.000000是必须的)的纵坐标
总结来讲,就是要先把横纵坐标都转化为整数,调用numpy包里的interp方法插值获得已知
在处理二维数据时,对于在原本在数据集中不存在的数据,我们经常需要利用插值获得其值,恰巧本人最近做时间序列的时候,需要插值得到一些原本不存在的时间处的值,自己写个小博客记录一下。首先是一般序列,然后是日期的序列,最后是任意时间的序列1. 一般序列我们举cos()\cos()cos()函数的图像为例import numpy as npx = np.arange(-5, 5, 0.05)y = np.cos(x)然后插值获得x=2.017x=2.017x=2.017处的值,这样就需要插值了。在求
心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,谦虚,自律,反思,成长,还算是比较正能量的博主,公益免费传播……内心特别想在AI界做出一些可以推进历史进程影响力的东西(兴趣使然,有点小情怀,也有点使命感呀)……
04-11
本人由于平常写论文需要输出一些结果图,但是苦于在网上搜python画图时,详细的教程非常多,但是就是找不到能马上解决自己问题那一行代码,所以打算写一些适合需求简单的朋友应急用的教程,应急就必须方便搜索,所以我把主要的内容写在了标题,方便大家到主页查找对应的功能,教程里有对应的效果图,方便查看,希望可以帮助到有需要的朋友。
本教程的效果图是在jupyter notebook完成。教程是接...
import pandas as pd
data=pd.read_excel('0.xlsx','sheet1')
lieshu=data.shape[1]#取dataframe列的数量
l1=data.iloc[:,[0,1]]#选择第1,2列数值
lie=data.columns.values[1]#按位置提取列标题
xueke=[]#定义xueke列表增加一列学科
for i in l1['姓名']:
xueke.append(lie)#用...
x = np.arange(0, 10)
fig = plt.figure()
plt.plot(x, color='black', linestyle='dashed', label='x', marker='*')
plt.legend()
# 更改横坐标刻度
# plt.xticks([0,1,2,3,4,5,6,7,8,9], [0, 10, 20, 30, 40, 50, 60, 70,
在野外布设700米的测线,点距为10米,用GPS每隔50米测量一个坐标,再把测线的头和为测量一个坐标。现在需使用线性插值的方法求取每两个坐标之间的其他4个点的值。
二、插值原理
使用等比插值的方法
起始值为 a
终止值为 b
步长值为 (a-b)/5
后面的数分别为 a+n, a+2n, a+3n, a+4n
三、代码实习对 x 插值
interx.py
import numpy as np
f = np.loadtxt('datax.txt')
a = f[:, 0]
b = f[:, 1]
for j in np.arange(len(a)):
aa = a[j]*1000
import numpy as np
from matplotlib import pyplot as plt
from scipy.interpolate import interp1d
x=np.linspace(0,10*np.pi,num=20)
y=np.sin(x)
f1=interp1d(x,y,kind='linear')#线性插值
f2=interp1d(x,y,kind='cubic')#三次样条插值
x_pred=np.linspace(0,10*np.pi,num=1000)