Классифицировать данные по дням недели Python


Приведен список списков в Python 2.7:

[['OCT 27, 2015',2,4,6,8],['NOV 03, 2015',1,5,9,2],['NOV 05, 2015',2,4,6,8]]

Как вы печатаете средние значения списка в целом; затем средние значения, основанные на дне недели. Например:

2.5, 6.5, 10.5, 9, 1.5, 4.5, 7.5, 5, 2, 4, 6, 8

Где:

1.5, 4.5, 7.5, 5 являются ли средние значения, полученные выше, так как вторник встречается дважды в этом списке

2.5, 6.5, 10.5, 9 являются ли средние значения списка в целом

Тогда 2, 4, 6, 8-среднее число событий четверга

Я почти уверен, что могу использовать функцию zip (), чтобы получить все подобные ценности. Я просто не уверен в средних значениях, рассчитанных за день недели (Понедельник, Вторник, Среда,...)

Как я могу организовать это в чистый табличный формат с "средними значениями" и " понедельник, вторник,.."как и другие заголовки

   Averages     Monday      Tuesday      Wednesday   Thursday   Friday  Saturday Sunday
2.5 6.5 10.5 9    0      1.5 4.5 7.5 5       0       2 4 6 8       0       0       0

Должен ли я использовать оператор if?

2 2

2 ответа:

Это кажется отличной работой для pandas:

from __future__ import print_function   
import pandas as pd
import numpy as np

raw_data = [['OCT 27, 2015',2,4,6,8],['NOV 03, 2015',1,5,9,2],['NOV 05, 2015',2,4,6,8]]
pandas_data = pd.DataFrame(raw_data, columns=['Date', 'A', 'B', 'C', 'D'])
pandas_data["Date"] = pd.to_datetime(pandas_data["Date"])
print(pandas_data)
print(pandas_data.mean())

Вывод:

        Date  A  B  C  D
0 2015-10-27  2  4  6  8
1 2015-11-03  1  5  9  2
2 2015-11-05  2  4  6  8

A    1.666667
B    4.333333
C    7.000000
D    6.000000

Это дает нам сводную статистику по всем столбцам, но для конкретных дней недели я бы сделал что-то вроде этого (следуя приведенному выше коду):

pandas_data["Day of the Week"] = pandas_data["Date"].dt.dayofweek
grouped_data = pandas_data.groupby('Day of the Week').aggregate(np.mean)
print(grouped_data)

Вывод:

                   A    B    C  D
Day of the Week
1                1.5  4.5  7.5  5
3                2.0  4.0  6.0  8

pandas' условность для дня недели-понедельник=0, воскресенье=6

pandas' groupby функция делает то, что она говорит на tin: она группирует данные на основе некоторых критериев, в данном случае столбец "день недели". Затем функция aggregate запускает заданные функции в этих группах и выдает вам результаты.

Вы можете использовать itertools.groupby для этого:

from itertools import groupby
import datetime


l = [['OCT 27, 2015', 2, 4, 6, 8],
     ['NOV 03, 2015', 1, 5, 9, 2],
     ['NOV 05, 2015', 2, 4, 6, 8]]


# Day of week as number. Monday == 0 ... Sunday == 6
def day_of_week(str_date):
    return datetime.datetime.strptime(str_date, '%b %d, %Y').weekday()


stats = [None] * 7
for key, group in groupby(l, key=lambda x: day_of_week(x[0])):
    z = zip(*group)
    next(z)  # skip dates
    stats[key] = [sum(i) / len(i) for i in z]

print(stats)

Вывод:

[None, [1.5, 4.5, 7.5, 5.0], None, [2.0, 4.0, 6.0, 8.0], None, None, None]