удалить повторяющиеся строки из данных csv в tensorflow.js

Я пытаюсь использовать tenorflow.js - API, чтобы заставить работать модель, которую я создал на python. Прямо сейчас я застрял в той части, где я извлекаю свои данные из csv-файла. Я могу получить данные, но в python-Code я впоследствии изменил расположение моих данных. Я не могу найти пример того, как я бы успешно реализовал это в tensorflow.js Мой текущий макет данных:

hour----|quit----|mNumber-|sleepSum|difAge--|woman---|paytype-|sum1----|sum2----|sum3----|sum4----|sum5----|sum6----|sum7----|sum8
0-------|0-------|12345---|5-------|50------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0
1-------|0-------|12345---|5-------|50------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0
2-------|0-------|12345---|5-------|50------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0
3-------|0-------|12345---|5-------|50------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0
4-------|0-------|12345---|5-------|50------|0-------|0-------|1-------|0-------|0-------|0-------|0-------|0-------|0-------|0
5-------|0-------|12345---|5-------|50------|0-------|0-------|0-------|1-------|0-------|0-------|0-------|0-------|10------|5
6-------|0-------|12345---|5-------|50------|0-------|0-------|3-------|2-------|0-------|1-------|10------|7-------|9-------|4
7-------|0-------|12345---|5-------|50------|0-------|0-------|1-------|3-------|2-------|5-------|3-------|0-------|3-------|1
8-------|0-------|12345---|5-------|50------|0-------|0-------|1-------|0-------|0-------|1-------|0-------|0-------|0-------|0
9-------|0-------|12345---|5-------|50------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0
10------|0-------|12345---|5-------|50------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0
11------|0-------|12345---|5-------|50------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0
12------|0-------|12345---|5-------|50------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0
13------|0-------|12345---|5-------|50------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0
14------|0-------|12345---|5-------|50------|0-------|0-------|0-------|0-------|0-------|1-------|0-------|0-------|0-------|0
15------|0-------|12345---|5-------|50------|0-------|0-------|1-------|0-------|0-------|0-------|0-------|0-------|0-------|0
16------|0-------|12345---|5-------|50------|0-------|0-------|0-------|0-------|1-------|0-------|0-------|0-------|0-------|0
17------|0-------|12345---|5-------|50------|0-------|0-------|1-------|0-------|0-------|0-------|0-------|0-------|0-------|0
18------|0-------|12345---|5-------|50------|0-------|0-------|4-------|1-------|0-------|0-------|0-------|0-------|0-------|0
19------|0-------|12345---|5-------|50------|0-------|0-------|4-------|0-------|3-------|0-------|0-------|0-------|0-------|0
20------|0-------|12345---|5-------|50------|0-------|0-------|7-------|0-------|3-------|0-------|0-------|2-------|0-------|0
21------|0-------|12345---|5-------|50------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0
22------|0-------|12345---|5-------|50------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0
23------|0-------|12345---|5-------|50------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0
0-------|0-------|67890---|40------|37------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0
1-------|0-------|67890---|40------|37------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0
2-------|0-------|67890---|40------|37------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0
3-------|0-------|67890---|40------|37------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0
4-------|0-------|67890---|40------|37------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0
5-------|0-------|67890---|40------|37------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0
6-------|0-------|67890---|40------|37------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0
7-------|0-------|67890---|40------|37------|0-------|0-------|2-------|1-------|0-------|0-------|0-------|0-------|0-------|0
8-------|0-------|67890---|40------|37------|0-------|0-------|3-------|9-------|0-------|0-------|1-------|0-------|0-------|3
9-------|0-------|67890---|40------|37------|0-------|0-------|6-------|4-------|1-------|10------|4-------|0-------|0-------|5
10------|0-------|67890---|40------|37------|0-------|0-------|1-------|2-------|0-------|1-------|2-------|0-------|0-------|1
11------|0-------|67890---|40------|37------|0-------|0-------|1-------|0-------|0-------|0-------|0-------|0-------|0-------|0
12------|0-------|67890---|40------|37------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0
13------|0-------|67890---|40------|37------|0-------|0-------|1-------|0-------|0-------|0-------|0-------|0-------|0-------|0
14------|0-------|67890---|40------|37------|0-------|0-------|0-------|1-------|0-------|0-------|0-------|0-------|0-------|3
15------|0-------|67890---|40------|37------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|1-------|0-------|0
16------|0-------|67890---|40------|37------|0-------|0-------|1-------|0-------|0-------|0-------|0-------|0-------|0-------|0
17------|0-------|67890---|40------|37------|0-------|0-------|0-------|0-------|0-------|0-------|1-------|0-------|0-------|1
18------|0-------|67890---|40------|37------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|1
19------|0-------|67890---|40------|37------|0-------|0-------|0-------|0-------|0-------|0-------|1-------|0-------|0-------|0
20------|0-------|67890---|40------|37------|0-------|0-------|2-------|2-------|0-------|0-------|0-------|0-------|0-------|1
21------|0-------|67890---|40------|37------|0-------|0-------|3-------|4-------|0-------|0-------|0-------|0-------|0-------|0
22------|0-------|67890---|40------|37------|0-------|0-------|2-------|0-------|0-------|0-------|0-------|0-------|0-------|1
23------|0-------|67890---|40------|37------|0-------|0-------|6-------|1-------|0-------|0-------|0-------|0-------|0-------|1

Как я хочу, чтобы это было:

hour----|quit----|mNumber-|sleepSum|difAge--|woman---|paytype-|sum1----|sum2----|sum3----|sum4----|sum5----|sum6----|sum7----|sum8----|sum9----|sum10----|...|sum191--|sum192
0-------|0-------|12345---|5-------|50------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0--------|...|0-------|0
0-------|0-------|67890---|40------|37------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0-------|0--------|...|0-------|1

Итак, у меня есть избыточные данные (первые 7 столбцов одинаковы для каждой из 24-часовых строк. Я хочу прикрепить данные к следу, поэтому я получаю 2 строки с моими 192 суммами для каждого из отдельных лиц.

Мне было интересно, есть ли функция для перегруппировки данных в tensorflow.js, или вы посоветуете сделать это вручную в цикле for после загрузки данных из csv?

Прямо сейчас я получаю такие данные:

const csvDataset = tf.data.csv(
  csvUrl,
  {
    hasHeader:false,
    delimiter:';',
    columnNames:['hour','quit','mNumber','sleepSum','difAge','woman','paytype','sum1','sum2','sum3','sum4','sum5','sum6','sum7','sum8']
  });

Вот как я это сделал на питоне

data = np.genfromtxt("01TendencyDouble.csv",delimiter=';',dtype=np.dtype(np.int32))
HourData = data[:,7:15]
m = HourData.shape[0]//24
TendencyFull = np.zeros((m,24*8), dtype=int)
MetaData = np.zeros((m,6), dtype=int)    
#Rearrange the Data. Stick all 24 hour-Records of the first 3 Months in a row then those of the sedond 3 months...
for i in range(m):
    Tendency = HourData[i*24:i*24+24,:] 
    TendencyFull[i,:] = Tendency.flatten('F')   
    MetaData[i,0] = data[i*24,1] #MetaData[2,0] is Quit of Record 3
    MetaData[i,1] = data[i*24,2] #MetaData[2,1] is MNumber for Record 3   
    MetaData[i,2] = data[i*24,3] #MetaData[2,2] is Sleep for Record 3           
    MetaData[i,3] = data[i*24,4] #MetaData[2,3] is DifAge for Record 3   
    MetaData[i,4] = data[i*24,5] #MetaData[2,4] is Woman for Record 3   
    MetaData[i,5] = data[i*24,6] #MetaData[2,5] is Paycash for Record 3   

person hoglimo    schedule 11.05.2020    source источник


Ответы (1)


tf.data.csv возвращает данные в виде потока с использованием скрытого генератора. Сам поток не отслеживает уже возвращенные данные. Чтобы отслеживать это, все данные должны храниться в переменной.

Общее решение - отфильтровать, если строка идентична предыдущей. Для фильтрации есть условный оператор, позволяющий отличить случай, когда есть признаки, помечает данные от случая, когда их нет (isLabel не задано)

  let latestRow = []
  compareRows = (r1,r2) => {
    const bool = r1.some((x, i) => x !== r2[i])
    console.log(bool)
    return bool
  }

  const flattenedDataset =
    csvDataset
    .filter(r => {
      r = [...(r.ys ? [...Object.values(r.xs), ...Object.values(r.ys)] : Object.values(r))]
      const bool = compareRows(r, latestRow)
      latestRow = r
      return bool
    })

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

person edkeveked    schedule 12.05.2020
comment
Большое спасибо за ответ. Я решил проблему, выполнив сценарий python, упомянутый в моем вопросе, для преобразования данных в желаемый формат. после этого я загружаю csv-файл, как указано в моем вопросе. - person hoglimo; 13.05.2020