Корректные значения на основе справочных данных в Python - PullRequest
0 голосов
/ 27 апреля 2019

Существует набор данных датчика, и значения в столбце значений необходимо скорректировать на основе одного конкретного датчика R в данных.Значения указываются в градусах (круг 360 градусов).Метод корректировки приведен ниже по формуле: для каждого отдельного датчика i рассчитайте сумму разностей синус / косинус относительно эталонного датчика и получите скорректированные градусы, рассчитав artanh.Тогда минус это от первоначальных значений.Vi (т) является значение датчика в момент времени я т и ВР (т) является значение опорного датчика R в момент времени т.a busy cat

date  sensor  value tag
0  2000-01-01       1    200   a
1  2000-01-02       1    200   a
''''''''''''''''''''''''''''''''
7  2000-01-08       1    300   b
8  2000-01-02       2    202   c
9  2000-01-03       2    204   c
10 2000-01-04       2    206   c

Я пробовал несколько, но немного запутался, как выполнить этот запрос в цикле for.

  1. Метки времени для датчиков не совпадают.Отдельный датчик может иметь больше или меньше временных отметок, чем эталонный датчик.
  2. Я хочу добавить дополнительный столбец для хранения исправленных значений.

Ниже приведен пример набора данных Iсделал.Если выбрать датчик 2 в качестве эталонного датчика для коррекции других значений датчика, как я могу выполнить его в цикле питона?Заранее спасибо!

import pandas as pd
sensor1 = pd.DataFrame({"date": pd.date_range('1/1/2000', periods=8),"sensor":[1,1,1,1,1,1,1,1],"value":[200,200,200,200,200,300,300,300],"tag":pd.Series(['a','b']).repeat(4)})
sensor2 = pd.DataFrame({"date": pd.date_range('1/2/2000', periods=10),"sensor":[2,2,2,2,2,2,2,2,2,2],"value":[202,204,206,208,220,250,300,320,280,260],"tag":pd.Series(['c','d']).repeat(5)})
sensor3 = pd.DataFrame({"date": pd.date_range('1/3/2000', periods=10),"sensor":[3,3,3,3,3,3,3,3,3,3],"value":[265,222,232,220,260,300,250,200,190,223],"tag":pd.Series(['e','f']).repeat(5)})
sensor4 = pd.DataFrame({"date": pd.date_range('1/1/2000', periods=11),"sensor":[4,4,4,4,4,4,4,4,4,4,4],"value":[206,203,210,253,237,282,320,232,255,225,262],"tag":pd.Series(['c']).repeat(11)})
sensordata = sensor1.append([sensor2,sensor3,sensor4]).reset_index(drop = True)

1 Ответ

0 голосов
/ 27 апреля 2019

Вот не элегантное решение, использующее циклы и множественные слияния.В качестве примера я использую sensor4 для исправления оставшихся датчиков.Формула коррекции не была мне понятна на 100%, поэтому я интерпретировал ее как сложение синуса и косинуса.

def data_correction(vi, vr):
    return vi - np.arctan(np.sum(np.sin(vi-vr) + np.cos(vi-vr), axis=0)) # i assume sin and cosine are summed?

sensors = [sensor1, sensor2, sensor3] # assuming you want to correct with sensor 4
sensorR = sensor4.copy()    

for i in range(len(sensors)):
    # create temp dataframe, with merge on date, so that measurements line up
    temp = pd.merge(sensors[i], sensorR, how='inner', left_on='date', right_on='date')

    # do correction and assign to new column
    temp['value_corrected'] = data_correction(temp['value_x'], temp['value_y'])

    # add this column to the original sensor data
    sensors[i] = sensors[i].merge(temp[['date', 'value_corrected']], how='inner', left_on='date', right_on='date')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...