У меня есть большой df с большим количеством записей в месяц. Я хотел бы увидеть среднее количество записей в месяц, чтобы увидеть, например, есть ли какие-либо месяцы, в которых обычно больше записей. (В идеале я хотел бы построить это с помощью линии общего среднего значения для сравнения, но это, возможно, более поздний вопрос). Мой df выглядит примерно так:
ufo=pd.read_csv('https://raw.githubusercontent.com/justmarkham/pandas-videos/master/data/ufo.csv')
ufo['Time']=pd.to_datetime(ufo.Time)
Так что, если я хочу посмотреть, будет ли больше наблюдений НЛО летом, например, как мне поступить?
Я пытался:
ufo.groupby(ufo.Time.month).mean()
Но это работает, только если я вычисляю числовое значение. Если я использую count()
вместо этого, я получаю сумму всех записей за все месяцы.
Обновлено: Чтобы уточнить, я хотел бы иметь среднее количество записей - наблюдений НЛО - в месяц.
Я не уверен, что ты имеешь в виду. Например, возьмем январь 1930 года. Что вы имеете в виду под «средним количеством записей» в этом месяце? Как бы вы рассчитали это вручную?
@pmarcol вручную я бы посчитал все записи января, а затем разделил на количество «январей», которые есть с начала df до последней записи df. И так с каждым месяцем.
@QuangHoang, тогда я все еще получаю сумму всех записей за каждый месяц. Есть ли способ узнать, сколько из каждого месяца присутствует? я. е. от первой до последней записи, сколько ян, фев и т. д. есть? а затем разделить на это серию, которую я получаю от вашей команды?
Вы должны указать свое уточнение выше в вопросе.
@Mactilda Мактильда, теперь понятно. Тогда я бы определенно предложил извлечь месяц и рассчитать количество с помощью группы, группируя по извлеченному месяцу. Затем среднее значение можно рассчитать путем деления на общее количество конкретных месяцев в общем временном интервале.
Вы имеете в виду, что хотите сгруппировать данные по месяцам? Я думаю, мы можем это сделать
ufo['month'] = ufo['Time'].apply(lambda t: t.month)
ufo['year'] = ufo['Time'].apply(lambda t: t.year)
Таким образом, у вас будет «год» и «месяц» для группировки данных.
ufo_2 = ufo.groupby(['year', 'month'])['place_holder'].mean()
Что такое «заполнитель»? Что оно делает?
Это означает, что я применил метод mean() к столбцу с именем «palce_holder», которого нет в вашем наборе данных. Поэтому вы можете подсчитать «месяц» и создать новый столбец с именем «month_count». Тогда вы должны получить желаемый результат.
Вы можете сделать что-то вроде этого:
# count the total months in the records
def total_month(x):
return x.max().year -x.min().year + 1
new_df = ufo.groupby(ufo.Time.dt.month).Time.agg(['size', total_month])
new_df['mean_count'] = new_df['size'] /new_df['total_month']
Выход:
size total_month mean_count
Time
1 862 57 15.122807
2 817 70 11.671429
3 1096 55 19.927273
4 1045 68 15.367647
5 1168 53 22.037736
6 3059 71 43.084507
7 2345 65 36.076923
8 1948 64 30.437500
9 1635 67 24.402985
10 1723 65 26.507692
11 1509 50 30.180000
12 1034 56 18.464286
Да, это то, что я искал. Мне интересно, не следует ли включать все месяцы, даже если, так сказать, не было никаких наблюдений, чтобы получить статистически правильный материал. Поскольку есть 57 января и 70 февраля, можно подумать, что они не будут различаться более чем на один. Вы понимаете, что я имею в виду?
Я думаю, что это был бы правильный момент. Средний подсчет за 71 год записей имеет больше смысла.
Я думаю, что это то, что вы ищете, но, пожалуйста, попросите разъяснений, если я не нашел то, что вы ищете.
# Add a new column instance, this adds a value to each instance of ufo sighting
ufo['instance'] = 1
# set index to time, this makes df a time series df and then you can apply pandas time series functions.
ufo.set_index(ufo['Time'], drop=True, inplace=True)
# create another df by resampling the original df and counting the instance column by Month ('M' is resample by month)
ufo2 = pd.DataFrame(ufo['instance'].resample('M').count())
# just to find month of resampled observation
ufo2['Time'] = pd.to_datetime(ufo2.index.values)
ufo2['month'] = ufo2['Time'].apply(lambda x: x.month)
и, наконец, вы можете группировать по месяцам :)
ufo2.groupby(by='month').mean()
и это вывод, который выглядит так:
month mean_instance
1 12.314286
2 11.671429
3 15.657143
4 14.928571
5 16.685714
6 43.084507
7 33.028169
8 27.436620
9 23.028169
10 24.267606
11 21.253521
12 14.563380
ufo.groupby(ufo.Time.month).size()
?