2017-01-22 6 views
4

У меня есть информационный кадр, который включает в себя ряд статистических данных о преступлениях, включая дату и время преступления, а также категорию.Использование даты и времени для определения события высокой частоты за промежуток времени

0  5/13/2015 8:55   VEHICLE THEFT 
1  5/13/2015 8:41   OTHER OFFENSES 
2  5/13/2015 8:36   OTHER OFFENSES 
3  5/13/2015 8:30   NON-CRIMINAL 
4  5/13/2015 8:17   OTHER OFFENSES 
5  5/13/2015 8:16   OTHER OFFENSES 
6  5/13/2015 8:10   LARCENY/THEFT 
7  5/13/2015 8:00    BURGLARY 
8  5/13/2015 8:00   MISSING PERSON 
9  5/13/2015 8:00   OTHER OFFENSES 
10  5/13/2015 8:00     ASSAULT 
--- 

Таким образом, для вышеуказанного образца он просто печатает: «Другие правонарушения».

Это массивная база данных, более 400 000 строк.

Мне нужно написать функцию, которая позволит мне ввести любой заданный временной интервал (используя от и до), а затем определить, какая категория преступления произошла с наибольшей частотой. Это то, что у меня есть, и он не работает:

import pandas as pd 
import csv 
import datetime 
timeData = open("timeData.csv") 
df = pd.read_csv('timeData.csv') 

from datetime import timedelta, date 
df['Dates'] = pd.to_datetime(df['Dates']) #this converts the values in the Dates column to datetime format 

def daterange(start_date, end_date): 
    for n in range(int ((end_date - start_date).days)): 
     yield start_date + timedelta(n) 

start_date = date(2015, 5, 1) 
end_date = date(2015, 6, 2) 
for daterange(start_date, end_date): 
    df['Category'].value_counts() 

Я хочу перебирать Даты столбец (A) и выберите только те даты, которые соответствуют в моей DATERANGE. Для дат в моей датенге я хочу подсчитать количество случаев каждого преступления (столбец B). Сделав это, я хочу напечатать преступление, которое встречается чаще всего.

Предложения?

+1

он смотрит на меня, как вы пытаются изобрести функцию [date_range()] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.date_range.html) ;-) – MaxU

+1

Будучи noob, я, вероятно, .... Как это будет работать для моих целей? –

+0

можете ли вы разместить требуемый набор данных для размещенного набора входных данных? – MaxU

ответ

4

Во-первых, чтобы сделать этот эффективный эр, установите для вашего индекса даты. Предположим, ваша колонка даты является Date и категории преступлений являются Crime

# make pd.Series with date as the index and crimes as the values 
d1 = df.set_index('Date').Crime.sort_index() 

# function that uses date slicing and uses values counts 
def most_freq(start, end): 
    return d1[start:end].value_counts().index[0] 

# demo 
most_freq('2015-05', '2015-05') 

'OTHER_OFFENSES' 
+0

@Jakub спасибо для указание это вне. Я исправил это. – piRSquared

+0

Я удалил свой комментарий, потому что я не понял 'value_counts()' sorts by value. Сожалею! – Jakub

+0

@piRSquared Хорошо - я создал измененный DataFrame «d1», как указано выше. Это сработало. Но когда я использовал ваш код для определения функции most_freq, я получил здесь SyntaxError: ---> def most_freq ('2003-05', '2015-04'): SyntaxError: недопустимый синтаксис –

3

Если вы просто хотите, чтобы сгруппировать ваши DF по дате:

In [204]: df.groupby([pd.Grouper(key='date', freq='D')])['crime'].value_counts() 
Out[204]: 
date  crime 
2015-05-13 OTHER OFFENSES 5 
      ASSAULT   1 
      BURGLARY   1 
      LARCENY/THEFT  1 
      MISSING PERSON 1 
      NON-CRIMINAL  1 
      VEHICLE THEFT  1 
Name: crime, dtype: int64 

или:

In [201]: df 
Out[201]: 
        date   crime 
0 2015-05-13 08:55:00 VEHICLE THEFT 
1 2015-05-13 08:41:00 OTHER OFFENSES 
2 2015-05-13 08:36:00 OTHER OFFENSES 
3 2015-05-13 08:30:00 NON-CRIMINAL 
4 2015-05-13 08:17:00 OTHER OFFENSES 
5 2015-05-13 08:16:00 OTHER OFFENSES 
6 2015-05-13 08:10:00 LARCENY/THEFT 
7 2015-05-13 08:00:00  BURGLARY 
8 2015-05-13 08:00:00 MISSING PERSON 
9 2015-05-13 08:00:00 OTHER OFFENSES 
10 2015-05-13 08:00:00   ASSAULT 

In [202]: df.groupby([pd.Grouper(key='date', freq='D'), 'crime']).size() 
Out[202]: 
date  crime 
2015-05-13 ASSAULT   1 
      BURGLARY   1 
      LARCENY/THEFT  1 
      MISSING PERSON 1 
      NON-CRIMINAL  1 
      OTHER OFFENSES 5 
      VEHICLE THEFT  1 
dtype: int64