2017-01-22 7 views
4

私は、犯罪の日付と時刻、カテゴリを含む犯罪に関する統計を含むデータフレームを持っています。datetimeを使用して時間間隔内の最高頻度イベントを特定する

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行以上の大量データベースです。

私は任意の時間範囲(fromとtoを使用して)を入力し、最も頻度の高い犯罪カテゴリを特定できるようにする関数を記述する必要があります。これは私が持っているものであり、それが動作していません。

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

....それは私の目的のためにどのように機能するのだろうか? –

+0

投稿された入力データセットに必要なデータセットを投稿できますか? – MaxU

答えて

4

まず、この効率を高めるには、インデックスを日付に設定します。あなたの日付列がDateであると仮定し、あなただけの日付でグループにあなたのDFをしたい場合は、犯罪のカテゴリは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()'が値でソートされていないので、私のコメントは削除しました。ごめんなさい! – Jakub

+0

@piRSquared Ok - 上記のように変更したDataFrame "d1"を作成しました。それはうまくいった。しかし、私はあなたのコードを使ってmost_freq関数を定義したとき、ここでSyntaxErrorを得ました:---> def most_freq( '2003-05'、 '2015-04'):SyntaxError:無効な構文 –

3

のとおりです。

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 
関連する問題