[英]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.