【问题标题】:Creating a weekly profile in pandas在 Pandas 中创建每周个人资料
【发布时间】:2021-01-03 04:07:10
【问题描述】:

我有这个 df:

df = pd.DataFrame({"on": [1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0]}, 
              index=pd.date_range(start = "2020-04-09 6:45", periods = 30, freq = '8H'))

并希望为df['on'] 列创建每周个人资料。

我可以按如下方式插入工作日和时间:

df['day_name'] = df.index.day_name() 
df['time'] = df.index.time

然后得到这个df:

                    on  day_name    time
2020-04-09 06:45:00 1   Thursday    06:45:00
2020-04-09 14:45:00 1   Thursday    14:45:00
2020-04-09 22:45:00 1   Thursday    22:45:00
2020-04-10 06:45:00 1   Friday      06:45:00
2020-04-10 14:45:00 1   Friday      14:45:00
2020-04-10 22:45:00 0   Friday      22:45:00
2020-04-11 06:45:00 0   Saturday    06:45:00
2020-04-11 14:45:00 0   Saturday    14:45:00
2020-04-11 22:45:00 1   Saturday    22:45:00
2020-04-12 06:45:00 0   Sunday      06:45:00
2020-04-12 14:45:00 0   Sunday      14:45:00
2020-04-12 22:45:00 1   Sunday      22:45:00
2020-04-13 06:45:00 1   Monday      06:45:00
2020-04-13 14:45:00 0   Monday      14:45:00
2020-04-13 22:45:00 0   Monday      22:45:00
2020-04-14 06:45:00 0   Tuesday     06:45:00
2020-04-14 14:45:00 0   Tuesday     14:45:00
2020-04-14 22:45:00 1   Tuesday     22:45:00
2020-04-15 06:45:00 0   Wednesday   06:45:00
2020-04-15 14:45:00 1   Wednesday   14:45:00
2020-04-15 22:45:00 1   Wednesday   22:45:00
2020-04-16 06:45:00 0   Thursday    06:45:00
2020-04-16 14:45:00 0   Thursday    14:45:00
2020-04-16 22:45:00 0   Thursday    22:45:00
2020-04-17 06:45:00 1   Friday      06:45:00
2020-04-17 14:45:00 1   Friday      14:45:00
2020-04-17 22:45:00 1   Friday      22:45:00
2020-04-18 06:45:00 0   Saturday    06:45:00
2020-04-18 14:45:00 0   Saturday    14:45:00
2020-04-18 22:45:00 0   Saturday    22:45:00

有人可以帮助我如何获得在某个时间(例如星期二,22:45)列df['on'] == 1 的概率吗?这最好作为一整周的课程来完成...... (在本例中,星期四 22:45 的概率为:1/2)

非常感谢:)

【问题讨论】:

  • 你能解释一下如何从样本数据中计数2/3
  • 当然是的:@ 星期二 22:45 df['on'] 列是 2x 1 和 1x 0 --> on = 2/3 的概率
  • 我问是因为我只看到1x1 和`2x0
  • 对不起,我想我对周二和周四有点困惑。星期四 22:45 的正确概率是 1/2。感谢关注

标签: python pandas dataframe datetime


【解决方案1】:

我在您的问题中考虑了两个选项:

1.每周日比率: 我计算了给定日期'on'==1 列的比率(概率):

每个工作日的比率:

df_2=pd.DataFrame()
df_2['Ones']=df[df['on']==1]['day_name'].value_counts()
df_2['All']=df['day_name'].value_counts()
df_2['Ratio']=df_2['Ones']/df_2['All']
df_2

这是输出:

        Ones    All Ratio
Friday     5    6   0.833333
Thursday   3    6   0.500000
Wednesday  2    3   0.666667
Monday     1    3   0.333333
Saturday   1    6   0.166667
Sunday     1    3   0.333333
Tuesday    1    3   0.333333

2。每天每次的比例: 在这里,我计算了在时间“y”的第“x”天,"on" 列为 1 的概率:

每周日和时间的比率:

df_3 = df.groupby(['day_name', 'time']).agg({'on': 'count'})
df_3['ones'] = df.groupby(['day_name', 'time']).agg({'on': 'sum'})
df_3['Ratio'] = df_3['ones']/df_3['on']
df_3

这是输出:

                  on    ones    Ratio
day_name    time            
Friday  06:45:00    2   2   1.0
        14:45:00    2   2   1.0
        22:45:00    2   1   0.5
Monday  06:45:00    1   1   1.0
        14:45:00    1   0   0.0
        22:45:00    1   0   0.0
Saturday06:45:00    2   0   0.0
        14:45:00    2   0   0.0
        22:45:00    2   1   0.5
Sunday  06:45:00    1   0   0.0
        14:45:00    1   0   0.0
        22:45:00    1   1   1.0
Thursday06:45:00    2   1   0.5
        14:45:00    2   1   0.5
        22:45:00    2   1   0.5
Tuesday 06:45:00    1   0   0.0
        14:45:00    1   0   0.0
        22:45:00    1   1   1.0
Wednesday06:45:00   1   0   0.0
        14:45:00    1   1   1.0
        22:45:00    1   1   1.0

可能在绘图

为了回答您的请求,我必须对上面的代码进行一些修改:我需要按要求对索引进行排序,将它们合并为一个索引,然后将索引转换为字符串以避免绘图中的一些问题。这是新代码:

#每周一天和时间的比率

days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
df_3 = df.groupby(['day_name', 'time']).agg({'on': 'count'})
df_3['ones'] = df.groupby(['day_name', 'time']).agg({'on': 'sum'})
df_3['Ratio'] = df_3['ones']/df_3['on']
df_3 = df_3.reindex(days, level=0)
df_3.index = [str(i) for i in (df_3.index.map('{0[0]} : {0[1]}'.format))]
df_3

现在我们已经完成了之前的模式,我们可以轻松地绘制比率:

#概率图

import matplotlib.pyplot as plt
plt.figure()

plt.plot(df_3.index, df_3['Ratio'])
plt.xlabel('Date')
plt.xticks(rotation=90)
plt.title('Probability of "on"=1')

这是图表:

【讨论】:

  • 感谢您的帮助。您的 2. 选项是完美的。您还可以帮我从第二个选项创建一个一周内(从星期一开始)的概率图(df2['ratio'])吗?非常感谢:)
  • 不客气。我更新了我的答案以提供您要求的图表。您可以根据需要更改图表的类型。祝你好运!
  • 非常感谢 - 您的回答非常完美。你知道吗,如果可能的话,只有 @ 14:45:00 的日子会显示在绘图 x 轴上?
  • 不客气。对不起,我不确定我知道一个简单的方法来做到这一点。除非您想手动操作 x 值列表。
  • 没问题。我现在正在使用这个plt.xticks(np.arange(0, len(df_3.index), step=3), rotation = 90),这对我来说已经足够了!抱歉下一个问题,但您是否也知道如何为该图创建趋势线?非常感谢!!!
【解决方案2】:

我相信你只需要mean

df1 = df.groupby('day_name', sort=False, as_index=False)['on'].mean()
print (df1)
    day_name        on
0   Thursday  0.500000
1     Friday  0.833333
2   Saturday  0.166667
3     Sunday  0.333333
4     Monday  0.333333
5    Tuesday  0.333333
6  Wednesday  0.666667

【讨论】:

    猜你喜欢
    • 2018-03-26
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多