Как я могу очистить свои данные лучше? Спрашивать друга - PullRequest
1 голос
/ 22 апреля 2020

Я только начинаю, поэтому я стараюсь сначала создать вещи, которые будут работать, а затем подумать, как мне улучшить код.

Я работал с API CoinGecko для вывода данных, таких как цены. Первая проблема, которую я получил, заключается в том, что запрос возвращает список списков. Каждая запись содержит отметку времени UNIX и значение.

API GET request returns a dictionary that contains 3 lists of lists

Сначала я использовал pandas, чтобы поместить эти данные в DataFrame.

data = cg.get_coin_market_chart_by_id('bitcoin', 'USD', 'max')
df = pd.DataFrame(data)

Он возвращал DataFrame с каждой ячейкой, содержащей список с отметкой времени UNIX и значением.

Dictionary to DataFrame

Очевидно, я не был доволен каждой ячейкой, содержащей UNIX метка времени. Итак, я сделал 3 DataFrames из каждой серии. Я также отформатировал UNIX отметок времени в новых индексах для даты и времени в каждом.

price = df['prices'].apply(pd.Series)
price.columns = ['date', 'price']
price = price.set_index(['date'])
price.index = pd.to_datetime(price.index, unit = 'ms')
price.columns = ['price']
market_cap = pd.DataFrame(df.market_caps.values.tolist(), index = df.index)
market_cap = market_cap.set_index(0)
market_cap.index = pd.to_datetime(market_cap.index, unit = 'ms')
market_cap.index.names = ['date']
market_cap.columns = ['market_cap']
volume = pd.DataFrame(df.total_volumes.values.tolist(), index = df.index)
volume = volume.set_index(0)
volume.index = pd.to_datetime(volume.index, unit = 'ms')
volume.index.names = ['date']
volume.columns = ['volume']

Наконец, я объединил все 3.

dfs = [price, market_cap, volume]
conc = pd.concat(dfs, axis = 1, sort = False)

Final result

I Я не парень CS или что-то еще, но я хочу научиться хорошо манипулировать данными. Я позволю вам, мастера StackOverflow, использовать любые неприятные слова при описании моего кода, если это помогает мне совершенствоваться. Спасибо.

1 Ответ

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

В данном конкретном случае pd.DataFrame принимает словарь, подобный следующему:

{column0:{index0:value0, index1: value1, ...}, ...}

Итак, просто преобразуйте свои входные данные, сделав из внутренних списков диктовку:

In [22]: import pandas as pd

In [23]: data ={
    ...:     'prices': [[1367107200000, 135.3], [1367193600000, 141.96]],
    ...:     'market_caps': [[1367107200000, 1500517590], [1367193600000, 1575032004.0]],
    ...:     'total_volumes': [[1367107200000, 0], [1367193600000, 0.0]]
    ...: }
    ...:

In [24]: pd.DataFrame({k:dict(v) for k,v in data.items()})
Out[24]:
               prices   market_caps  total_volumes
1367107200000  135.30  1.500518e+09            0.0
1367193600000  141.96  1.575032e+09            0.0

И чтобы получить фактический индекс даты и времени, используйте:

In [26]: df.set_index(pd.to_datetime(df.index,unit='ms'))
Out[26]:
            prices   market_caps  total_volumes
2013-04-28  135.30  1.500518e+09            0.0
2013-04-29  141.96  1.575032e+09            0.0

или даже один, упал, sw oop:

In [28]: from datetime import datetime
    ...: pd.DataFrame({
    ...:     k:{datetime.fromtimestamp(x/1000): y for x,y in v}
    ...:     for k,v in data.items()
    ...: })
Out[28]:
                     prices   market_caps  total_volumes
2013-04-27 17:00:00  135.30  1.500518e+09            0.0
2013-04-28 17:00:00  141.96  1.575032e+09            0.0

Хотя это немного уродливо, IMO .

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