2013-07-04 4 views
1
def dailyTimeDistributionFeatures (dailyCallDistribution_dictionary, missingValue = -999, lowSampleValue = -666, numberOfFeatures = 14, sampleSizeThreshold = 3):  
    featureSelection = {} 
    for date in dailyCallDistribution_dictionary: 
      date_timestruct = datetime.datetime.fromtimestamp(time.mktime(time.strptime(date, "%Y-%m-%d"))) 
      timeSample = dailyCallDistribution_dictionary[ date ] 
      if len(timeSample) <= sampleSizeThreshold : 
      if len(timeSample) == 0 : 
       featureSelection[ date ] = [ date_timestruct.timetuple().tm_wday 
              , int(date_timestruct.strftime('%W')) 
              , date_timestruct.month ] + [missingValue] * (numberOfFeatures - 3) 
      else : 
       featureSelection[ date ] = [ date_timestruct.timetuple().tm_wday 
              , int(date_timestruct.strftime('%W')) 
              , date_timestruct.month ] + [lowSampleValue] * (numberOfFeatures - 3) 
      else :  
       featureSelection[ date ] = [ date_timestruct.timetuple().tm_wday 
              , int(date_timestruct.strftime('%W')) 
              , date_timestruct.month 
              , len(timeSample) 
              # counts how many late night activities. 
              , sum(Pandas.Series(timeSample).apply(lambda x: (x>0) & (x <= 4)).tolist()) 
              , Pandas.Series(timeSample).mean() 
              , Pandas.Series(timeSample).median() 
              , Pandas.Series(timeSample).std() 
              , Pandas.Series(timeSample).min() 
              , Pandas.Series(timeSample).max() 
              , Pandas.Series(timeSample).mad() 
              , Pandas.Series(timeSample).quantile(0.75) - Pandas.Series(timeSample).quantile(0.25) 
              , Pandas.Series(timeSample).kurt() 
              , Pandas.Series(timeSample).skew() 
              ] 
    return Pandas.DataFrame(featureSelection, index = ['dayOfWeek', 'WeekOfYear', 'MonthOfYear', 
                 'Number of Calls', 'Number of Late Night Activities', 
                 'Average Time', 'Median of Time', 
                 'Standard Deviation', 'Earliest Call', 
                 'Latest Call', 'Mean Absolute Deviation', 
                 'Interquartile Range', 'Kurtosis', 
                 'Skewness']).T 

Когда я писал выше функции питона, который выводит кадр данных и попытаться добавить еще один столбец в кадр данных в пределах указанных выше функций:Ошибка Python: объект «» numpy.bool_ не Iterable

featureTime['Whether Staying Late'] = featureTime['Number of Late Night Activities'].apply(lambda x: x > 0).apply(lambda x: sum(x)) 

я получил ошибку:

TypeError         Traceback (most recent call last) 
/home/aaa/Enthought/Canopy_64bit/System/lib/python2.7/site- packages/IPython/utils/py3compat.pyc in execfile(fname, *where) 
181    else: 
182     filename = fname 
--> 183    __builtin__.execfile(filename, *where) 

/home/aaa/pyRepo/feature_selection_v15.py in <module>() 
352 featureTime.to_csv('time.csv') 
353 
--> 354 featureTime['Whether Staying Late'] = featureTime['Number of Late Night Activities'].apply(lambda x: x > 0).apply(lambda x: sum(x)) 
355 
356 

/home/aaa/Enthought/Canopy_64bit/User/lib/python2.7/site- packages/pandas/core/series.pyc in apply(self, func, convert_dtype, args, **kwds) 
2445    values = lib.map_infer(values, lib.Timestamp) 
2446 
-> 2447   mapped = lib.map_infer(values, f, convert=convert_dtype) 
2448   if isinstance(mapped[0], Series): 
2449    from pandas.core.frame import DataFrame 

/home/aaa/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/pandas/lib.so in pandas.lib.map_infer (pandas/lib.c:41822)() 

/home/aaa/pyRepo/feature_selection_v15.py in <lambda>(x) 
352 featureTime.to_csv('time.csv') 
353 
--> 354 featureTime['Whether Staying Late'] = featureTime['Number of Late Night Activities'].apply(lambda x: x > 0).apply(lambda x: sum(x)) 
355 
356 

TypeError: 'numpy.bool_' object is not iterable 

, который не существует, если добавить его вручную, поговорив с консоли.

Я решил проблему, работая с встроенными типами данных python и циклом for. Что делает меня любопытно, почему я получаю вид ошибки выше ... Хотите знать, откуда приходит ...

+0

Вы можете отправить полную статистику стека? –

ответ

1

Предполагая, что sequence.apply применяет лямбда к каждому элементу в последовательности, sequence.apply(lambda x: x > 0) дает последовательность булевых значений , и sequence.apply(lambda x: x > 0).apply(lambda x: sum(x)) пытается суммировать каждое булево значение, в результате чего возникает ошибка 'bool' object is not iterable -kinda. Вы получаете такую ​​же ошибку от:

>>> sum(True) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'bool' object is not iterable 
+0

Хм очень странно, сумма (правда) на самом деле работает для меня (не сумма ([True]), однако оба работают на моем компьютере). И что беспокоит далее: использование одного и того же кода, в одном случае, я помещал его в .py-файл, и он не работает; в другой, я набрал его в консоль и хорошо работает ... Может быть, это моя версия python/linux. – user2551507

+0

Я использовал другую IDE, сумма (True) теперь возвращает ошибку. Я думаю, что навес делает для меня «коррекцию». Может быть, другие странные вещи исходят от этой IDE тоже ... Большое спасибо за помощь! – user2551507

Смежные вопросы