![](/img/trans.png)
[英]fill missing data in pandas time series with data from the previous week(day) or day?
[英]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.