Классифицировать данные по дням недели 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 ответа:
Это кажется отличной работой для
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]