Как использовать панды DataFrame или Series с Seaborn в соответствии? - PullRequest
0 голосов
/ 30 октября 2019

Я импортирую этот набор данных и выбираю интервал с

data_frame = pd.read_csv('household_power_consumption.txt', 
                 sep=';', 
                 parse_dates={'dt' : ['Date', 'Time']}, 
                 infer_datetime_format=True, 
                 low_memory=False, 
                 na_values=['nan','?'], 
                 index_col='dt')
df_08_09 = data_frame.truncate(before='2008-01-01', after='2010-01-01')
df_08_09.info()

, чтобы получить

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 1052641 entries, 2008-01-01 00:00:00 to 2010-01-01 00:00:00
Data columns (total 7 columns):
Global_active_power      1052641 non-null float64
Global_reactive_power    1052641 non-null float64
Voltage                  1052641 non-null float64
Global_intensity         1052641 non-null float64
Sub_metering_1           1052641 non-null float64
Sub_metering_2           1052641 non-null float64
Sub_metering_3           1052641 non-null float64
dtypes: float64(7)
memory usage: 64.2 MB

Я просто хотел узнать, как я могу обработать DatetimeIndex dt в качестве столбца данных, чтобы использовать lmplot() или regplot(), например, для:

seaborn.regplot(x="dt", y="Global_active_power", data=df_08_09)

dt всегда создает проблемы, потому чтоSeaborn по какой-то причине не может получить к нему доступ. Я попытался получить доступ к DatetimeIndex , но я не нашел способа извлечь его и сделать из него столбец данных, потому что я не совсем привык к пандам.

Я ожидаю, что seaborn найдет в данных dt, но это не так и выдает ошибку соответственно. Для меня ясно видеть это, но я не знаю, как относиться к этому эффективным способом python / pandas / seaborn. Поэтому, пожалуйста, помогите мне! :)

... Кстати, другой вопрос ... Мне также интересно, почему df_08_09.Global_active_power.values возвращает массив np.array (n,), а не (n,1). Я всегда вынужден делать values = np.array([values]).transpose(), чтобы восстановить (n,1)

1 Ответ

0 голосов
/ 30 октября 2019

Вы можете использовать обходной путь и сначала преобразовать столбцы datetime в целое число, а затем заменить метки оси matplotlib значениями datetime, например,

import pandas as pd
import numpy as np
import seaborn
from datetime import datetime


data_frame = pd.read_csv('household_power_consumption.txt', 
                 sep=';', 
                 parse_dates={'dt' : ['Date', 'Time']}, 
                 infer_datetime_format=True, 
                 low_memory=False, 
                 na_values=['nan','?']) 
                 #index_col='dt') No need for this, as we are not working with indexes
df_08_09 = data_frame.truncate(before='2008-01-01', after='2010-01-01')

# Convert to integers
df_08_09['date_ordinal'] = pd.to_datetime(df_08_09['dt']).apply(lambda date: date.timestamp())

# Plotting as integers
ax = seaborn.regplot(data=df_08_09, x="date_ordinal", y="Global_active_power")

# Adjust axis
ax.set_xlim(df_08_09['date_ordinal'].min() - 1, df_08_09['date_ordinal'].max() + 1)
ax.set_ylim(0, df_08_09['Global_active_power'].max() + 1)

# Set x-axis-tick-labels to datetime
new_labels = [datetime.utcfromtimestamp(int(item)) for item in ax.get_xticks()]
ax.set_xticklabels(new_labels, rotation = 45)

Ссылка: Это так ответ водонепроницаемый

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