Объединение временных рядов по общей дате в Python (датафреймы и серии / вопрос списка) - PullRequest
0 голосов
/ 11 апреля 2020

Нуб здесь. ПОЖАЛУЙСТА, ПРОЧИТЕ ФОРМАТИРОВАНИЕ АБСМАЛЬНОГО, поскольку я все еще учусь. Я пытаюсь создать временной ряд (блок данных, я думаю?), Который состоит из трех столбцов. Один - столбец даты, следующий - столбец инвентаря, а последний - столбец цены.

Я вытащил две отдельные серии (дата и инвентарь; дата и цена) и хочу объединить две серии так что я могу видеть три столбца вместо двух наборов из двух. Это мой код.

import json
import numpy as np
import pandas as pd
from urllib.error import URLError, HTTPError
from urllib.request import urlopen

class EIAgov(object):
    def __init__(self, token, series):
        '''
        Purpose:
        Initialise the EIAgov class by requesting:
        - EIA token
        - id code(s) of the series to be downloaded

        Parameters:
        - token: string
        - series: string or list of strings
        '''
        self.token = token
        self.series = series


    def __repr__(self):
        return str(self.series)


    def Raw(self, ser):
        # Construct url
        url = 'http://api.eia.gov/series/?api_key=' + self.token + '&series_id=' + ser.upper()

        try:
            # URL request, URL opener, read content
            response = urlopen(url);
            raw_byte = response.read()
            raw_string = str(raw_byte, 'utf-8-sig')
            jso = json.loads(raw_string)
            return jso

        except HTTPError as e:
            print('HTTP error type.')
            print('Error code: ', e.code)

        except URLError as e:
            print('URL type error.')
            print('Reason: ', e.reason)

    def GetData(self):
        # Deal with the date series                       
        date_ = self.Raw(self.series[0])        
        date_series = date_['series'][0]['data']
        endi = len(date_series) # or len(date_['series'][0]['data'])
        date = []
        for i in range (endi):
            date.append(date_series[i][0])

        # Create dataframe
        df = pd.DataFrame(data=date)
        df.columns = ['Date']

        # Deal with data
        lenj = len(self.series)
        for j in range (lenj):
            data_ = self.Raw(self.series[j])
            data_series = data_['series'][0]['data']
            data = []
            endk = len(date_series)         
            for k in range (endk):
                data.append(data_series[k][1])
            df[self.series[j]] = data

        return df

if __name__ == '__main__':
    tok = 'mytoken'

    # Natural Gas - Weekly Storage
    #     
    ngstor = ['NG.NW2_EPG0_SWO_R48_BCF.W']  # w/ several series at a time ['ELEC.REV.AL-ALL.M', 'ELEC.REV.AK-ALL.M', 'ELEC.REV.CA-ALL.M']
    stordata = EIAgov(tok, ngstor)
    print(stordata.GetData())

    # Natural Gas - Weekly Prices
    #     
    ngpx = ['NG.RNGC1.W']  # w/ several series at a time ['ELEC.REV.AL-ALL.M', 'ELEC.REV.AK-ALL.M', 'ELEC.REV.CA-ALL.M']
    pxdata = EIAgov(tok, ngpx)
    print(pxdata.GetData())

Обратите внимание, что «mytoken» должен быть заменен ключом API eia.gov. Я могу получить это, чтобы успешно создать вывод из двух списков ... но затем, чтобы объединить списки, я попытался добавить это в конце:

joined_frame = pd.concat([ngstor, ngpx], axis = 1, sort=False)

print(joined_frame.GetData())

Но я получаю ошибку

 ("TypeError: cannot concatenate object of type '<class 'list'>'; only Series and DataFrame objs are valid")

потому что, очевидно, я не знаю разницы между списком и серией.

Как объединить эти списки по столбцу даты? Большое спасибо за любую помощь. (Также не стесняйтесь сообщать, почему я ужасен в правильном форматировании кода в этом посте.)

1 Ответ

1 голос
/ 11 апреля 2020

Если вы хотите манипулировать ими как DataFrames в остальной части вашего кода, вы можете преобразовать ngstor и ngpx в DataFrames следующим образом:

import pandas as pd
# I create two lists that look like yours
ngstor = [[1,2], ["2020-04-03", "2020-05-07"]]
ngpx = [[3,4] , ["2020-04-03", "2020-05-07"]]
# I transform them to DataFrames
ngstor = pd.DataFrame({"value1": ngstor[0],
                       "date_col": ngstor[1]})
ngpx = pd.DataFrame({"value2": ngpx[0],
                       "date_col": ngpx[1]})

Затем вы можете использовать pandas.merge или pandas.concat:

# merge option
joined_framed = pd.merge(ngstor, ngpx, on="date_col",
                          how="outer")
# concat option
ngstor = ngstor.set_index("date_col")
ngpx = ngpx.set_index("date_col")
joined_framed = pd.concat([ngstor, ngpx], axis=1,
                          join="outer").reset_index()

Результат будет:

    date_col  value1  value2
0  2020-04-03       1       3
1  2020-05-07       2       4

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...