Dataframe.resample()仅适用于时间序列数据.我找不到从非时间序列数据中获取每一行的方法.什么是最好的方法?
我正在寻找一种算法来确定实时数据捕获的百分位数.
例如,考虑开发服务器应用程序.
服务器的响应时间可能如下:17 ms 33 ms 52 ms 60 ms 55 ms等.
报告第90百分位响应时间,第80百分位响应时间等是有用的.
朴素算法是将每个响应时间插入列表中.请求统计信息时,对列表进行排序并将值放在适当的位置.
内存使用量与请求数量呈线性关系.
是否有一种算法可以在内存使用量有限的情况下产生"近似"百分位数统计量?例如,假设我想以一种处理数百万个请求的方式来解决这个问题,但只想使用一千字节的内存进行百分位跟踪(丢弃旧请求的跟踪不是一个选项,因为百分位数应该是满足所有要求).
还要求不存在分布的先验知识.例如,我不希望提前指定任何范围的存储桶.
据我所知,OHLC使用一列数据对Pandas中的时间序列数据进行重新采样将完美地工作,例如在以下数据帧上:
>>df
ctime openbid
1443654000 1.11700
1443654060 1.11700
...
df['ctime'] = pd.to_datetime(df['ctime'], unit='s')
df = df.set_index('ctime')
df.resample('1H', how='ohlc', axis=0, fill_method='bfill')
>>>
open high low close
ctime
2015-09-30 23:00:00 1.11700 1.11700 1.11687 1.11697
2015-09-30 24:00:00 1.11700 1.11712 1.11697 1.11697
...
Run Code Online (Sandbox Code Playgroud)
但是如果数据已经是OHLC格式,我该怎么办?根据我的收集,API的OHLC方法为每列计算OHLC切片,因此如果我的数据采用以下格式:
ctime openbid highbid lowbid closebid
0 1443654000 1.11700 1.11700 1.11687 1.11697
1 1443654060 1.11700 1.11712 1.11697 1.11697
2 1443654120 1.11701 1.11708 1.11699 1.11708
Run Code Online (Sandbox Code Playgroud)
当我尝试重新采样时,我会为每个列获得一个OHLC,如下所示:
openbid highbid \
open high low close open high
ctime
2015-09-30 23:00:00 1.11700 1.11700 1.11700 1.11700 …Run Code Online (Sandbox Code Playgroud) 我有一个1-n numpy数组,我想下采样.如果下采样栅格不完全适合数据,则可以使用以下任何方法:
基本上如果我有
1 2 6 2 1
Run Code Online (Sandbox Code Playgroud)
我的下采样率为3,所有以下都可以:
3 3
3 1.5
Run Code Online (Sandbox Code Playgroud)
或者插值会给我的任何东西.
我只是在寻找最快/最简单的方法.
我找到了scipy.signal.decimate,但这听起来像是抽取了值(根据需要取出它们,只在X中留下一个). scipy.signal.resample似乎有正确的名字,但我不明白他们在描述中的整个傅立叶的位置.我的信号不是特别周期性的.
你能帮我一把吗?这似乎是一项非常简单的任务,但所有这些功能都非常错综复杂......
我之前运行过相同的代码(带有我需要的包)并且它有效,不确定现在发生了什么。这显示了错误,
AttributeError: module 'PIL.Image' has no attribute 'Resampling'。可能这是一个小问题,但我无法弄清楚,我正在数据块中工作。
我需要将2D数据重新采样到常规网格.
这就是我的代码:
import matplotlib.mlab as ml
import numpy as np
y = np.zeros((512,115))
x = np.zeros((512,115))
# Just random data for this test:
data = np.random.randn(512,115)
# filling the grid coordinates:
for i in range(512):
y[i,:]=np.arange(380,380+4*115,4)
for i in range(115):
x[:,i] = np.linspace(-8,8,512)
y[:,i] -= np.linspace(-0.1,0.2,512)
# Defining the regular grid
y_i = np.arange(380,380+4*115,4)
x_i = np.linspace(-8,8,512)
resampled_data = ml.griddata(x,y,data,x_i,y_i)
Run Code Online (Sandbox Code Playgroud)
(512,115)是2D数据的形状,我已经安装了mpl_toolkits.natgrid.
我的问题是我得到了一个蒙面数组,其中大部分条目都是nan,而不是一个主要由常规条目组成的数组,而边界只有nan.
有人能指出我做错了吗?
谢谢!
假设我有一个10,000磅的矢量,我想采取一个只有100个对数间隔点的切片.我想要一个函数给我索引的整数值.这是一个简单的解决方案,只需使用+ logspace,然后摆脱重复.
def genLogSpace( array_size, num ):
lspace = around(logspace(0,log10(array_size),num)).astype(uint64)
return array(sorted(set(lspace.tolist())))-1
ls=genLogspace(1e4,100)
print ls.size
>>84
print ls
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 13, 14, 15, 17, 19, 21, 23, 25, 27, 30,
33, 37, 40, 44, 49, 54, 59, 65, 71, 78, 86,
94, 104, 114, 125, 137, 151, 166, 182, 200, 220, 241,
265, 291, 319, 350, 384, 422, 463, 508, 558, 613, 672,
738, 810, 889, 976, 1071, 1176, …Run Code Online (Sandbox Code Playgroud) 我想在C++中实现上面提到的两个图像重采样算法(bicubic和Lanczos).我知道有很多现有的实现,但我仍然想做自己的.我想部分原因是因为我想了解它们是如何工作的,部分是因为我想给它们一些在主流实现中找不到的功能(比如可配置的多CPU支持和进度报告).
我试过读维基百科,但这些东西对我来说太干了.也许对这些算法有一些更好的解释?我在SO或Google上找不到任何东西.
补充:似乎没有人可以给我一个关于这些主题的良好链接.任何人都可以至少尝试在这里解释一下吗?
我有以下15分钟的数据作为dataframe3年.前两列是索引.
2014-01-01 00:15:00 1269.6
2014-01-01 00:30:00 1161.6
2014-01-01 00:45:00 1466.4
2014-01-01 01:00:00 1365.6
2014-01-01 01:15:00 1362.6
2014-01-01 01:30:00 1064.0
2014-01-01 01:45:00 1171.2
2014-01-01 02:00:00 1171.0
2014-01-01 02:15:00 1330.4
2014-01-01 02:30:00 1309.6
2014-01-01 02:45:00 1308.4
2014-01-01 03:00:00 1494.0
Run Code Online (Sandbox Code Playgroud)
我曾经习惯于resample获得月平均值的第二个系列.
data_Monthly = data.resample('1M', how='mean')
Run Code Online (Sandbox Code Playgroud)
如何将最后一列中的值除以月平均值,结果仍然是15分钟粒度的时间序列?
我正在编写一些以不同速度播放WAV文件的代码,因此波浪要么慢,要么低音,要么更快,音高更高.我目前正在使用简单的线性插值,如下所示:
int newlength = (int)Math.Round(rawdata.Length * lengthMultiplier);
float[] output = new float[newlength];
for (int i = 0; i < newlength; i++)
{
float realPos = i / lengthMultiplier;
int iLow = (int)realPos;
int iHigh = iLow + 1;
float remainder = realPos - (float)iLow;
float lowval = 0;
float highval = 0;
if ((iLow >= 0) && (iLow < rawdata.Length))
{
lowval = rawdata[iLow];
}
if ((iHigh >= 0) && (iHigh < rawdata.Length))
{
highval = rawdata[iHigh];
}
output[i] = …Run Code Online (Sandbox Code Playgroud) resampling ×10
python ×6
pandas ×3
algorithm ×2
numpy ×2
audio ×1
average ×1
bicubic ×1
dataframe ×1
matplotlib ×1
percentile ×1
python-2.7 ×1
scipy ×1
time-series ×1