Назначение пользовательских категорий для данных json - pandas

Назначение меток необработанным данным вместо получения новых столбцов индикатора из get_dummies. Я хочу что-то вроде этого:

json_input:

[{id: 100, vehicle_type: "Автомобиль", время: "2017-04-06 01:39:43", zone = "A", type: "Checked"}, {id: 101, vehicle_type: "Truck" , время: "2017-04-06 02:35:45", zone = "B", тип: "Unchecked"}, {id: 102, vehicle_type: "Truck", время: "2017-04-05 03: 20:12 ", zone =" A ", тип:" Проверено "}, {id: 103, vehicle_type:" Car ", время:" 2017-04-04 10:05:04 ", zone =" C ", type: "Unchecked"}]

Результат:

  • id, vehicle_type, time_range, zone, type
  • 100, 0 , 1 , 1 , 1
  • 101, 1 , 1 , 2 , 0
  • 102, 1 , 2 , 1 , 1
  • 103, 0 , 3 , 3 , 0

отметка времени - столбцы TS -> тип_ транспортного средства, тип двоичный, диапазон_времени (1 -> (TS1-TS2), 2 -> (TS3-TS4), 3 -> (TS5-TS6)), зона-> категориальный (1, 2 или 3). Я хочу автоматически назначать эти метки, когда я скармливаю сплющенный json фрейму данных в пандах. Это возможно? (Мне не нужны столбцы индикаторов zone_1, type_1, vehicle_type_3 из get_dummies в пандах). Если это невозможно с пандами, предложите python lib для этой автоматизации.


person Milee    schedule 10.04.2017    source источник
comment
Покажите нам свой json и то, как вы хотите, чтобы результат выглядел.   -  person Stephen Rauch    schedule 10.04.2017


Ответы (1)


Вот что я смог придумать. Я не знаю, какие временные диапазоны вы ищете

import datetime
import io
import pandas as pd
import numpy as np
df_string='[{"id":100,"vehicle_type":"Car","time":"2017-04-06 01:39:43","zone":"A","type":"Checked"},{"id":101,"vehicle_type":"Truck","time":"2017-04-06 02:35:45","zone":"B","type":"Unchecked"},{"id":102,"vehicle_type":"Truck","time":"2017-04-05 03:20:12","zone":"A","type":"Checked"},{"id":103,"vehicle_type":"Car","time":"2017-04-04 10:05:04","zone":"C","type":"Unchecked"}]'
df = pd.read_json(io.StringIO(df_string))
df['zone'] = pd.Categorical(df.zone)
df['vehicle_type'] = pd.Categorical(df.vehicle_type)
df['type'] = pd.Categorical(df.type)
df['zone_int'] = df.zone.cat.codes
df['vehicle_type_int'] = df.vehicle_type.cat.codes
df['type_int'] = df.type.cat.codes
df.head()

Изменить Вот что я мог придумать

import datetime
import io
import math
import pandas as pd
#Taken from http://stackoverflow.com/questions/13071384/python-ceil-a-datetime-to-next-quarter-of-an-hour
def ceil_dt(dt, num_seconds=900):
    nsecs = dt.minute*60 + dt.second + dt.microsecond*1e-6  
    delta = math.ceil(nsecs / num_seconds) * num_seconds - nsecs
    return dt + datetime.timedelta(seconds=delta)

df_string='[{"id":100,"vehicle_type":"Car","time":"2017-04-06 01:39:43","zone":"A","type":"Checked"},{"id":101,"vehicle_type":"Truck","time":"2017-04-06 02:35:45","zone":"B","type":"Unchecked"},{"id":102,"vehicle_type":"Truck","time":"2017-04-05 03:20:12","zone":"A","type":"Checked"},{"id":103,"vehicle_type":"Car","time":"2017-04-04 10:05:04","zone":"C","type":"Unchecked"}]'
df = pd.read_json(io.StringIO(df_string))
df['zone'] = pd.Categorical(df.zone)
df['vehicle_type'] = pd.Categorical(df.vehicle_type)
df['type'] = pd.Categorical(df.type)
df['zone_int'] = df.zone.cat.codes
df['vehicle_type_int'] = df.vehicle_type.cat.codes
df['type_int'] = df.type.cat.codes
df['time'] = pd.to_datetime(df.time)
df['dayofweek'] = df.time.dt.dayofweek
df['month_int'] = df.time.dt.month
df['year_int'] = df.time.dt.year
df['day'] = df.time.dt.day
df['date'] = df.time.apply(lambda x: x.date())
df['month'] = df.date.apply(lambda x: datetime.date(x.year, x.month, 1))
df['year'] = df.date.apply(lambda x: datetime.date(x.year, 1, 1))
df['hour'] = df.time.dt.hour
df['mins']  = df.time.dt.minute
df['seconds'] = df.time.dt.second
df['time_interval_3hour'] = df.hour.apply(lambda x : math.floor(x/3)+1)
df['time_interval_6hour'] = df.hour.apply(lambda x : math.floor(x/6)+1)
df['time_interval_12hour'] = df.hour.apply(lambda x : math.floor(x/12)+1)
df['weekend']  = df.dayofweek.apply(lambda x:  x>4)

df['ceil_quarter_an_hour'] =df.time.apply(lambda x : ceil_dt(x))
df['ceil_half_an_hour'] =df.time.apply(lambda x : ceil_dt(x, num_seconds=1800))
df.head()
person atkawa7    schedule 10.04.2017
comment
Я ищу диапазоны, например, в тот же час, в тот же день, а затем сгруппируйте их в категорию. В основном способ категоризации на основе диапазонов - времени, чисел. - person Milee; 11.04.2017
comment
Спасибо. Идеально. - person Milee; 11.04.2017