簡體   English   中英

具有不規則和交替分箱的分箱統計

[英]Binned statistics with irregular and alternating bins

這是一個更復雜的實際應用程序的簡短完整示例。

使用的庫

import numpy as np
import scipy as sp
import scipy.stats as scist
import matplotlib.pyplot as plt
from itertools import zip_longest

數據

我有一個用開始和結束定義的不規則箱的數組,例如像這樣(在現實世界的情況下,這種格式是給定的,因為它是另一個進程的輸出):

bin_starts = np.array([0, 93, 184, 277, 368])
bin_ends = np.array([89, 178, 272, 363, 458])

我結合:

bns = np.stack(zip_longest(bin_starts, bin_ends)).flatten()
bns
>>> array([  0,  89,  93, 178, 184, 272, 277, 363, 368, 458])

給出一個長短間隔的規則交替序列,所有的長度都是不規則的。 這是給定的長間隔和短間隔的草圖表示: Bins_sketch

我有一堆時間序列數據,類似於下面創建的隨機數據:

# make some random example data to bin
np.random.seed(45)
x = np.arange(0,460)
y = 5+np.random.randn(460).cumsum()
plt.plot(x,y);

要裝箱的數據

目標

我想使用間隔序列來收集數據的統計數據(平均值、百分位數) - 但只使用長間隔,即草圖中的黃色間隔。

假設和說明:

長間隔的邊緣從不重疊; 換句話說,長間隔之間總是有一個短的間隔。 此外,第一個間隔總是很長的。

當前解決方案:

一種方法是在所有間隔上使用scipy.stats.binned_statistic ,然后將結果切片以僅保留其他間隔(即[::2] ),就像這樣(對某些統計數據有很大幫助,例如np.percentile ,正在閱讀@ali_m 的這個答案):

ave = scist.binned_statistic(x, y, 
                         statistic = np.nanmean, 
                         bins=bns)[0][::2]

這給了我想要的結果:

plt.plot(np.arange(0,5), ave);

裝箱數據

問題:是否有更 Pythonic 的方式來做到這一點(使用NumpyScipyPandas任何一個)?

我認為使用IntervalIndexpd.cutgroupbyagg一些組合是獲得所需內容的相對簡單易行的方法。

我首先制作 DataFrame(不確定這是否是從 np 數組開始的最佳方式):

df = pd.DataFrame()
df['x'], df['y'] = x, y

然后你可以將你的 bin 定義為一個元組列表:

bins = list(zip(bin_starts, bin_ends))

使用具有from_tuples()方法的 pandas IntervalIndex來創建 bin 以供以后在cut使用。 這很有用,因為您不必依賴切片bns數組來解開“長短間隔的定期交替序列”——相反,您可以明確定義您感興趣的 bin:

ii = pd.IntervalIndex.from_tuples(bins, closed='both')

closed kwarg 指定是否在區間中包含結束成員編號。 例如,對於元組(0, 89) ,如果closed='both'間隔將包括 0 和 89(與leftrightneither )。

然后使用pd.cut()在數據pd.cut()創建一個類別列,這是一種將值划分為區間的方法。 可以使用bin kwarg 指定IntervalIndex對象:

df['bin'] = pd.cut(df.x, bins=ii)

最后,使用df.groupby().agg()獲取您想要的任何統計信息:

df.groupby('bin')['y'].agg(['mean', np.std])

輸出:

                 mean       std
bin                            
[0, 89]     -4.814449  3.915259
[93, 178]   -7.019151  3.912347
[184, 272]   7.223992  5.957779
[277, 363]  15.060402  3.979746
[368, 458]  -0.644127  3.361927

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM