pandas 如何绘制每x个时间单位的计数频率直方图?

bxpogfeg  于 2023-03-16  发布在  其他
关注(0)|答案(1)|浏览(168)

我有一个非常大的数据集,我可以用它来组织我想要的结构

df.groupby(pd.cut(time, np.arange(0, max(time), t))).sum()

其中df是完整的数据(一个Pandasdf),time是一列数据,其中每一行都是接下来的0.00001秒,t是一个变量,包含我想要分组的时间量--比如说每0.00005秒。
df有几列:countnum(基本上是行号)、time(时间戳)和value(数据值)。
但是,我不知道如何去画这个图,所以x轴是时间组,y轴是频率,我试过的所有方法都是把x轴作为没有组的时间,或者完全错误的东西。
我相信这并不复杂,但谷歌并没有帮上忙
编辑:这里有一些数据

Count #  Time (s)  Values (V)
0        1   0.00001       3.022
1        2   0.00002       3.018
2        3   0.00003       3.013
3        4   0.00004       3.003
4        5   0.00005       3.003
5        6   0.00006       3.013
6        7   0.00007       3.013
7        8   0.00008       3.013
8        9   0.00009       3.003
9       10   0.00010       2.998

寻找:
假设样本集中有另一个值,时间=0.00007

x
  x           x          x           x
  x           x          x           x
0----0.00002-----0.00004-----0.00006-----0.00008
iszxjhcz

iszxjhcz1#

下面是一些随机生成的样本数据,可能更好地说明了这一点。

df = pd.DataFrame({
    "time": np.random.randint(1, 4, size=100).cumsum(),
    "values": np.random.rand(100)
})
t = 5

请注意,值列对于绘图不是必需的。只有时间戳才指示每个柱形图中显示多少个值。供参考:

>>> df["time"].values
array([  1,   4,   6,   7,   8,  11,  14,  15,  18,  20,  22,  23,  26,
        27,  28,  31,  32,  34,  36,  38,  39,  41,  44,  46,  48,  51,
        52,  54,  55,  58,  60,  61,  64,  66,  68,  71,  72,  74,  76,
        79,  80,  82,  83,  84,  87,  88,  90,  91,  93,  96,  99, 100,
       102, 103, 105, 106, 107, 110, 113, 114, 115, 116, 118, 121, 122,
       123, 124, 126, 127, 130, 133, 134, 135, 137, 139, 141, 143, 145,
       147, 150, 152, 154, 155, 158, 161, 162, 163, 164, 165, 166, 169,
       172, 175, 176, 177, 179, 181, 183, 185, 187])

另一种分组方法是除以t,然后使用GroupBy.size获得每组中的事件数:

group_sizes = df.groupby(df["time"] // t).size()

这里我有点困惑,因为每个组中的事件数量是离散的,而直方图通常是收集连续数据的,但是,您可以使用看起来像直方图的条形图。
首先计算pd.Series.value_counts中每个样本数出现的次数:

data = group_sizes.value_counts().sort_index()

数据:
因此:原始数据中只有一个条柱有1个数据点。大多数条柱有2或3个事件,少数条柱有4个事件。最后绘制:

data.plot.bar(width=1)

备选单线图:

df["time"].floordiv(t).value_counts().value_counts().sort_index().plot.bar(width=1)

PS:pd.DataFrame.resample在你的“时间”数据已经是正确格式的情况下是有用的。例如,通过pd.to_timedeltapd.to_datetime。然后你可以用一种非常自然的方式将你的数据重新采样到任意时间步长的bin中。在你的情况下,df.resample("50 us").size()会起作用。

相关问题