簡體   English   中英

時間序列數據:每天的bin數據,然后按星期幾繪制

[英]Time series data: bin data to each day, then plot by day of week

我有一個非常簡單的pandas DataFrame,格式如下:

date        P1      P2      day
2015-01-01  190     1132    Thursday
2015-01-01  225     1765    Thursday
2015-01-01  3427    29421   Thursday
2015-01-01  945     7679    Thursday
2015-01-01  1228    9537    Thursday
2015-01-01  870     6903    Thursday
2015-01-02  785     4768    Friday
2015-01-02  1137    7065    Friday
2015-01-02  175     875     Friday

其中P1和P2是不同的感興趣參數。 我想為每個P1和P2創建一個看起來像這樣的條形圖。 如數據所示,我每天都有幾個值。 我想對給定日期的給定值進行平均,然后根據星期幾進行繪圖(以便將星期一第1周的平均值添加到星期一第2周等)。

我是python的新手,我當前的方法非常討厭,涉及幾個循環。 我目前有兩個專門的代碼部分 - 一個用於執行平均值,另一個用於每周一次執行一次,並計算繪圖的結果。 有更清潔的方法嗎?

好像你在尋找:

df[['day', 'P1']].groupby('day').mean().plot(kind='bar', legend=None)

df[['day', 'P2']].groupby('day').mean().plot(kind='bar', legend=None)

完整示例:

import numpy as np
import pandas as pd

days = ['Mon', 'Tue', 'Wed', 'Thur', 'Fri', 'Sat', 'Sun']
day = np.random.choice(days, size=1000)
p1, p2 = np.random.randint(low=0, high=2500, size=(2, 1000))
df = pd.DataFrame({'P1': p1, 'P2': p2, 'day': day})

# Helps for ordering of day-of-week in plot
df['day'] = pd.Categorical(df.day, categories=days)

# %matplotlib inline

df[['day', 'P1']].groupby('day').mean().plot(kind='bar', legend=None)
df[['day', 'P2']].groupby('day').mean().plot(kind='bar', legend=None)

需要注意的是在現有數據框調用pd.Categorical讓你自定義排序鍵顯示在這里

結果(對於P1):

在此輸入圖像描述

更新

在你的評論中你問過,

groupby是否在組的所有實例中找到給定參數(比如P1)的平均值? 例如,如果我有8個星期一,結果值是星期一發生的所有數據點的平均值嗎? 這里增加的障礙是我對數據的采樣不可靠。 如果我的星期一有10個樣本,星期一有1個,那么簡單地平均所有11個值將在周一淹沒,樣本量很小。 因此,我想在考慮星期幾之前平均給定日期的所有值。

是的,上面的groupby會找到所有實例的平均值。 以下是你可以達到“雙倍”平均值的方法:

# for P1; replace P2 with P1 to find P2 avgs.
df.drop('P2', axis=1).groupby(['date', 'day']).mean()\
    .reset_index().groupby('day').mean().plot(kind='bar', legend=None)

暫無
暫無

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

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