#python #pandas #time-series
#python #pandas #временные ряды
Вопрос:
У меня такая проблема:
bitcoin = pd.read_csv('./Bitcoin/BTC-USD.csv')
bitcoin
И тогда у меня есть значения для биткойнов за каждый день… Но на самом деле мне нужно среднее значение за каждый месяц в 2018 и 2019 годах:
bitcoin['Date']=pd.to_datetime(bitcoin['Date'],format="%Y-%m-%d")
bitcoin = bitcoin[(bitcoin['Date']>'2018-01-01') amp; (bitcoin['Date']<'2020-01-01')]
bitcoin_mean =bitcoin['High'].groupby([bitcoin['Date'].dt.year,bitcoin['Date'].dt.month]).mean()
bitcoin_mean
Это нормально, но на самом деле я хочу, чтобы это было в 3 разных столбцах, потому что я хочу отобразить это, что-то вроде ‘Year’, ‘Day’ и ‘Averaged_price’ в целых числах, как я мог это сделать?
Заранее спасибо!
Комментарии:
1. вы могли бы попробовать
.transform('mean')
в конце вашей groupby вернуть только значения, которые вы можете присвоить как bitcoin [‘mean’] = bitcoin [‘High’].gropuby(……).transform(‘mean)2. используйте
stack(0)
, и годы станут столбцами
Ответ №1:
import pandas as pd
Загружайте BTC-USD.csv
отсюда, я также разместил это на Github Gists.
Чтение в dataframe:
df = pd.read_csv('BTC-USD.csv')
Тогда вы можете получить среднее значение за каждый месяц:
df.groupby(df['Date'].apply(lambda row: row.split('-')[1])).mean()
что даст вам:
(Первый столбец — это месяцы, 01 — январь, 02 — февраль и т.д. )
Почему это работает
df['Date'].apply(lambda row: row.split('-')[1])
является ли ряд:
0 08
1 08
2 08
3 08
4 08
..
362 08
363 08
364 08
365 08
366 08
Name: Date, Length: 367, dtype: object
Он берет дату из каждой строки, т. Е. 2019-08-24
, split()
разделяет ее на -
, так что получается список: [‘2019′,’08’,’24]. Он принимает 1-индексированный (т. Е. второй) элемент из этого списка, т. Е. месяц. Мы группируем эту переменную с помощью функции groupby() mean()
, а затем берем mean() для вычисления среднего значения групп (ищем здесь,,,).