если оператор не перебирает все данные? - PullRequest
0 голосов
/ 29 октября 2019

У меня есть данные CSV, которые я пишу на Python. Я уже выполнил Jupyter Notebook в качестве прототипа. Похоже, цикл заканчивается в первом ряду данных. Что это за исправление?

import numpy as np
import matplotlib.pyplot as plt 
import datetime 


data = pd.read_csv("logrecords.csv")
vehicle = 'NM52'
df = data[data['VEHICLE'] == vehicle]

degree_change = 0.000011 
speed_change = 0 
time_change = datetime.timedelta(seconds=150)

def conditionA(df, degree_change):
    lat = df['lat']
    df['lat_rolled'] = np.roll(lat, 1) 
    df['lat_difference'] = df['lat'] - df['lat_rolled']
    lat_conditionA =  df['lat_difference'] < degree_change
    lon = df['lon']
    df['lon_rolled'] = np.roll(lon, 1)
    df['lon_difference'] = df['lon'] - df['lon_rolled'] 
    lon_conditionA = df['lon_difference'] < degree_change 

    if lat_conditionA + lon_conditionA == True: 
        print(True)
    else: 
        print(False) 


def conditionB(df, speed_change):
    speed = df['speed']
    speed_rolled = np.roll(speed,1)
    df['speed_difference'] = df['speed'] - df['speed_rolled']
    speed_change_conditionB = (df['speed_difference'] == speed_change)

    if speed_change_conditionB == True:
        print(True) 
    else: 
        print(False)


def conditionC(df, time_change):
    time = df['time']
    df['time'] = pd.to_datetime(df.time)
    time_rolled = np.roll(time,1)
    df['time_rolled'] = pd.to_datetime(df.time_rolled)
    df['time_difference'] = df['time'] - df['time_rolled']
    time_conditionC = (df['time_difference'] > time_change)

    if time_conditionC == True:
        print(True) 
    else:
        print(False)


def trip_validation(conditionA, conditionB,conditionC):
    if (conditionA and conditionB and conditionC) == True: 
        print(True)
    else: 
        print(False)

    return;

trip_validation(conditionA, conditionB, conditionC)

Мой единственный вывод - False, что является правильным ответом для первой строки данных.

1 Ответ

1 голос
/ 29 октября 2019

У вас две большие проблемы.

(1) Ваша программа не просматривает все данные, потому что у вас нет цикла. Вы работаете со столбцами фреймов данных в целом, а затем волшебным образом ожидаете, что они будут каким-то волшебным образом вести себя как скалярные значения.

Я предлагаю вам внимательно изучить руководства по фреймам данных. print ваши результаты после каждого утверждения, чтобы убедиться, что вы получаете то, что ожидаете.

(2) Вам пока не знакомы с логическими операциями.

Непосредственная проблема в вашем утверждении:

if (conditionA and conditionB and conditionC) == True: 
    print(True)
else: 
    print(False)

Три операнда condition являются функциональными объектами. Вы никогда не вызываете функции, поэтому практически ни один из предыдущих кодов никогда не выполняется. Этот оператор проверяет, определены ли все три объекта (т.е. не None). Поскольку вы правильно определили все три функции, это True, что дает вам одну строку вывода. Это не имеет никакого отношения к вашему фрейму данных.

Вызов функций не решит проблему, поскольку все три функции возвращают значение по умолчанию None, и в результате вы получите вывод False,Проработайте ваши материалы снова;вам нужно return значения, а не print их.


Прямой способ получить вывод в вашей основной программе будет что-то вроде

print( conditionA(df, change) and
       conditionB(df, change) and
       conditionC(df, change)   )

Этокак я могу сказать, что вы не знакомы с логическими значениями.

if condition == True:

является избыточным;if автоматически проверяет значение истинности.

if expr:
    print(True)
else:
    print(False)

также является избыточным. Просто print(expr), как с любой другой переменной.

...