티스토리 뷰

승하차기록파일

 

metro.zip.001
4.02MB

 

 

 

 

1. 년월, 역이름 으로 필터

2. 필터된 승하차 총합을 구함

3. plotly 설치후 그래프로 표시

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

def read_file(path):
    with open(path, "r") as f:
        return f.readlines()


class Log:
    def __init__(self, date=None, line=None, station=None, in_outs=None):
        self.date = date
        self.line = line
        self.station = station
        self.in_outs = in_outs

    def __str__(self):
        return f"{self.__dict__}"

    @classmethod
    def line_to_list(cls, line):
        line = line.replace('"', "").replace("\n", "")
        line = line.split(",")
        return line

    @classmethod
    def __get_times(cls, times):
        in_outs = {}
        time_stamp = 4
        for i, in_out in enumerate(times):
            if i + 1 < len(times):
                key = f"{'0'+str(time_stamp) if time_stamp < 10 else time_stamp}" \
                      f"{'0'+str(time_stamp+1) if time_stamp+1 < 10 else time_stamp+1}"
                in_outs[key] = (times[i], times[i+1])
                time_stamp += 1
        return in_outs

    @classmethod
    def line_to_ins(cls, line):
        line = cls.line_to_list(line)
        params = list()
        params.append(line[0])
        params.append(line[1])
        params.append(line[2])
        params.append(cls.__get_times(line[3:]))
        return params


class LogManager:
    def __init__(self, path):
        self.lines = read_file(path)
        self.logs = list()

    def import_logs(self, start, stop):
        for line in self.lines[start:] if stop == -1 else self.lines[start:stop]:
            log = Log(*Log.line_to_ins(line))
            self.__add(log)

    def __add(self, item):
        self.logs.append(item)

    def get_logs(self):
        return self.logs

    @classmethod
    def __filter_station(cls, logs, station):
        return list(filter(lambda log: log.station == station, logs))

    @classmethod
    def __filter_date(cls, logs, date):
        return list(filter(lambda log: log.date == date, logs))

    @classmethod
    def __get_summary_in_outs(cls, logs):
        in_outs = [0, 0]
        for log in logs:
            for in_val, out_val in log.in_outs.values():
                in_outs[0] += int(in_val)
                in_outs[1] += int(out_val)
        return in_outs

    def __get_in_outs_from_date_station(self, station, date):
        logs = LogManager.__filter_station(self.logs, station)
        logs = LogManager.__filter_date(logs, date)
        for log in logs:
            print(log)
        return LogManager.__get_summary_in_outs(logs)

    def draw_in_outs_from_date_station(self, station, date):
        in_outs = self.__get_in_outs_from_date_station(station=station, date=date)
        print(in_outs)
        import plotly.express as px
        df = px.data.tips()
        fig = px.histogram(df, title=f"station={station} date={date}", x=["in", "out"], y=in_outs)
        fig.show()


if __name__ == '__main__':
    log_manager = LogManager("out/metro.csv")
    log_manager.import_logs(1, -1)
    print("파일 임포트 완료되었습니다.")
    while True:
        cmd = input("[역이름] [년월] 입력하세요\n").split(" ")
        if len(cmd) == 2:
            log_manager.draw_in_outs_from_date_station(*cmd)
        else:
            print("잘못된 명령어 입니다.")

 

 

 

'python lecture > project' 카테고리의 다른 글

[Python] Pillow 영상처리 이미지 회전  (0) 2020.10.14
[python] 은행프로그램  (0) 2020.07.02
[python] n 진수 바꾸기  (0) 2020.06.03
[python] 시간변환  (0) 2020.05.27
[python] 스테가노그래피  (0) 2020.05.25
댓글