[ZeroBase]テーブル列データ(Time Series Data)

27339 ワード

テーブル列データとは?

  • テーブル列データは、一定時間にわたって収集された一連の順序によって決定されたデータセットの集合である.
  • 表列データの特徴は,時間に関係し,連続観測値の間に相互関係があることである.
  • クロック列データ分析の目的:


    時計列の持つ規則性を発見し、それをモデル化し、推定したモデルを通じて未来の値を予測する!

    表列データの例:



    表列データ型(4種類):


    変動要因は一般に4種類と仮定し,変動要因を把握できる.
  • トレンド変動
  • 季節変動
  • サイクル変動
  • 不規則変動
  • トレンド変動

  • は、クロック列の長期的、漸進的、持続的な変化状態を表す
  • 時間、表熱データの上昇傾向または下降傾向を示す

    季節変動

  • で観測された時計列が1年単位以上の周期で記録されている場合、気候などの自然条件、社会習俗、制度などの影響を受けて季節的な違い、すなわち
  • が示されている.
  • のテーブル列データにおいて周期モードで繰り返される周期的変化
  • .
  • は、通常、四半期および毎月のデータに
  • を表示する.

    じゅんかんへんどう

  • 年以上の間隔、周期的な上昇と低下は、
  • を意味する.
  • 気候条件、社会習俗などの季節変動が説明できない長期周期変動
  • サイクル変動は季節変動と混同され得るが、これは季節変動で説明されない長期変動を意味する.
  • ランダム変動

  • 社はまったく予想できない特殊な事件による変動(地震、戦争、洪水、スト)
  • 不明確な要因による偶然変動
  • クロック列データ解析(feat.fbprofetを使用)


    1. 📋Fbprobet練習!


    データを作成したらfbe預言者を使ってみます
    # conda 가상환경에 datareader설치
    conda install pandas -datareader
    
    # terminal 혹은 conda환경에서 fbprophet 설치
    pip install fbprophet
    import fbprophet import Prophet
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    %matplotlib inline
    
    #시작 위치 및 간격 설졍
    time = np.linspace(0, 1, 365 *2)
    
    result = np.sin(2*np.pi * 12 * time)
    
    # 날짜 데이터 생성
    ds = pd.date_range("2018-01-01", periods=365*2, freq="D")
    
    df = pd.DataFrame({"ds" : ds, "y": result})
    # 년 단위로 학습, 하루 단위로 학습
    m = Prophet(yearly_seasonality=True, daily_seasonality=True)
    
    # 예측된 모델에 위에서 생성한 df 적용
    m.fit(df)
    
    # 앞으로의 30일 데이터 변동사항 예측
    future=m.make_future_dataframe(periods=30)
    forecast = m.predict(future)
    
    # 결과 확인
    m.plot(forecast)

    点と線で描かれたグラフは学習用のデータを表し、線で描かれたグラフは今後30日間を予測します.
    学習の結果から,従来の図案に類似した図案の図形が描かれていることが分かる.

    2. 📺クロック列データのリアルタイム使用


    (1). Web Traffice予測


  • 準備:
    import pandas as pd
    import pandas_datareader as web
    import numpy as np
    import matplotlib.pyplot as plt
    
    from fbprophet import Prophet
    from datetime import datetime
    
    %matplotlib inline
    
    pinkwink_web = pd.read_csv(
        "..웹 트래픽 정보가 있는 csv 파일", encoding="utf-8", thousands=",", names=["date", "hit"], index_col = 0
    )

  • データ情報の検証
    pinkwin_web.info()

  • Null値の処理
    pinkwink_web = pinkwink_web[pinkwink_web["hit"].notnull()]

  • データの描画
    pinkwink_web["hit"].plot(figsize=(12, 4), grid=True)


  • トレンド分析を可視化するためのx軸値の作成
    time = np.arange(0, len(pinkwink_web))
    traffic = pinkwin_web["hit"].values
    
    fx = np.linspace(0, time[-1], 1000)
    
    # 몇차원 그래프에서 가장 예측을 잘 하는지 1차, 2차, 3차, 15차, 20차원 그래프로 테스트
    fp1 = np.polyfit(time, traffic, 1)
    f1 = np.poly1d(fp1)
    
    fp2 = np.polyfit(time, traffic, 2)
    f2 = np.poly1d(fp2)
    
    fp3 = np.polyfit(time, traffic, 3)
    f3 = np.poly1d(fp3)
    
    fp15 = np.polyfit(time, traffic, 15)
    f15 = np.poly1d(fp15)
    
    fp20 = np.polyfit(time, traffic, 20)
    f20 = np.poly1d(fp20)

  • グラフィックの表示
    plt.figure(figsize=(12, 4))
    plt.scatter(time, traffic, s=10)
    plt.plot(fx, f1(fx), lw=4, label='f1')
    plt.plot(fx, f2(fx), lw=4, label='f2')
    plt.plot(fx, f3(fx), lw=4, label='f3')
    plt.plot(fx, f15(fx), lw=4, label='f15')
    plt.plot(fx, f20(fx), lw=4, label='f20')
    
    plt.grid(True, linestyle="-", color="0.75")
    plt.legend(loc=2)
    plt.show()

    20次元関数紫色の予測効果が最も良好であることが確認できた.

  • fbemoreを使用して将来を予測する
    m = Prophet(yearly_seasonality=True, daily_seasonality=True)
    
    # 새로운 DataFrame 생성
    df = pd.DataFrame({"ds":pinkwink_web.index, "y": pinkwink_web["hit"]})
    
    # 인덱스값 새로 설정한 후 저장
    df.reset_index(inplace=True)
    df["ds"] = pd.to_datetime(df["ds"], format="%y. %m. %d.")
    
    # 미래 예측 (60일)
    future = m.make_future_dataframe(periods=60)
    
    # 예측 결과는 상한/하한의 범위를 포함해서 얻어진다.
    forecast = m.predict(future)
    forecast[["ds", "yhat", "yhat_lower", "yhat_upper"]].tail()
    
    m.plot(forecast)
  • 結果確認

  • (2). 株式データ予測


    データソース:yahoo finance
    目的:株式データを使用して、プロジェクトの将来の価格を予測します.

  • データの読み込み
    # yahoo finance 설치
    !pip install finance
    
    # 기아 자동차의 종목코드를 가지고 기간을 입력한다.
    import yfinance as yf
    from pandas_datareader import data
    
    yf.pdr_override()
    
    start_date = "2010-03-01"
    end_date = "2018-02-28"
    KIA = data.get_data_yahoo("000270.KS", start_date, end_date)
    
    KIA.head()

  • データ検証
  •     KIA["Close"].plot(figsize=(12,10), grid=True)

  • 精度の確認
    インポートされたデータのほんの一部のみを使用して、最近のデータのトレンドを表示します.
    # ~ 2017-11-30일까지의 데이터만 불러오기
    KIA_trunc = KIA[:"2017-11-30"]
    KIA_trunc.tail()

  • 未来を予測する
    # forecast를 위한 준비
    df = pd.DataFrame({"ds": KIA_trunc.index, "y":KIA_trunc["Close"]})
    df.reset_index(inplace=True)
    
    # 필요없는 column 삭제 특성상 필요없기에 사
    del df["Date"]
    
    #
    m = Prophet(yearly_seasonality=True, daily_seasonality=True)
    
    # 향후 90일간의 데이터 예측
    future = m.make_future_dataframe(periods=90)
    forecast = m.predict(future)
    
    m.plot(forecast)

  • 予測結果の検証:
  • 검은 점들을 기본으로 하여 향후 90일을 예측한 결과이다. 실제 데이터인 파란색 선이 오차범위내에 포함되어 있는 것으로 보아 예측을 잘 한 것 같다.
  • m.plot_components(forecast):
  • KIA는 화요일과 수요일에 가장 높게 종목이 오르며, 여름 오기전인 월달에 가장 주가가 높다는 것을 알 수 있다. 시간 단위로 KIA 종목을 확인한다면, 오전 9시부터  장 마감 시간인 오후 3시 30분까지 일정한 패턴으로 요동치는 것을 확인할 수 있다.

    (3). 特殊な形式のテーブル列データ予測


  • データインポートとデータ検証
    df = pd.read_csv(".......", index_col = 0)
    df

    データをグラフィックス化すると、ログ関数の性質がわかります.

  • 予測
    m = Prophet(growth="logistic", daily_seasonality=True)

  • 予測結果の決定
    future = m.make_future_dataframe(periods=1826)
    future["cap"] = 8.5
    forecast = m.predict(future)
    m.plot(forecast)