Как разделить данные в серии Python по неделям, чтобы отобразить их в циклическом графике? - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть пятинедельные сезонные данные в одной серии с датой и временем, как я могу разделить их на основе недельных, например, неделя 1, неделя 2 ... неделя 5, чтобы я мог отобразить все данные за неделю на одном графике.

Я попытался повторно выбрать данные по дням, найдя среднее значение. но данные все еще в одной серии. я просто хочу разделить данные, основанные на неделях, например, с 2019-04-02 по 2019-04-08 в другом фрейме данных, с 2019-04-08 по 2019-04-16 в отдельном df

df.open.resample('M').mean()
date    pageload  day
0     2019-04-02 10:48:00  -79.002023  Tue
1     2019-04-02 10:49:00   33.563679  Tue
2     2019-04-02 10:50:00  -76.448319  Tue
3     2019-04-02 10:51:00   30.974816  Tue
4     2019-04-02 10:52:00  -68.789962  Tue
5     2019-04-02 10:53:00   30.593374  Tue
21    2019-04-16 11:34:00   40.333445  Fri

фрейм данных, разделенный на неделю. Чтобы отобразить все данные за неделю на одном графике.

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

Я не думаю , что вы хотите сделать повторную выборку, как показывает Шиджит. Я думаю, что вы хотите разные кадры для каждой недели. ИМО, вы хотите использовать для этого groupby ( doc ). Функцию Pandas Groupby можно использовать для разделения данных в кадре данных по столбцам или индексам. Метод возвращает объект groupby для панд, который можно использовать для выполнения операций над группами перед их объединением.

Во фрагменте кода я сначала создаю столбец для группировки данных (то есть столбец «недели»). Чем я группирую данные по столбцу недель. Это создает объект groupby, который, помимо прочего, состоит из словаря, который имеет уникальные значения столбца «недели» в качестве ключей, и списка индексов информационного кадра, которые имеют то же значение для столбца «недели», что и значения. Это можно увидеть, набрав print(grps.groups) в консоли. Затем я перебираю ключи групп и добавляю каждый фрейм данных недели в словарь, вызывая метод get_group для объекта groupby.

import pandas as pd

# Make sample data
index=pd.date_range(start='2014-01-01', end='2014-1-31',freq='D')
df = pd.DataFrame({"vals":np.random.randint(-5,5,len(index))}, index=index)
df["csum"] = df.vals.cumsum()
# Add a column for weeks to enable grouping
df["weeks"] = df.index.week

# Group the data
grps = df.groupby("weeks")

# split the group into separate dataframes
df_dict = {}
for gi in grps.groups:
    df_dict[gi] = grps.get_group(gi)

Я начинаю с чего-то вроде этого:

            vals  csum  weeks
2014-01-01     4     4      1
2014-01-02    -5    -1      1
...
2014-01-30    -2    -9      5
2014-01-31    -5   -14      5

и в итоге получим фрейм данных, подобный следующему

1
            vals  csum  weeks
2014-01-01     4     4      1
2014-01-02    -5    -1      1
2014-01-03    -4    -5      1
2014-01-04     4    -1      1
2014-01-05    -5    -6      1
2
            vals  csum  weeks
2014-01-06    -5   -11      2
2014-01-07     2    -9      2
2014-01-08     4    -5      2
2014-01-09    -1    -6      2
2014-01-10    -1    -7      2
2014-01-11    -3   -10      2
2014-01-12    -2   -12      2
0 голосов
/ 16 апреля 2019

Если ваш фрейм данных df проиндексирован на дату

   print(df)
                 High         Low        Open       Close    Volume   Adj Close
Date                                                                            
2019-04-01  191.679993  188.380005  191.639999  191.240005  27862000  191.240005
2019-04-02  194.460007  191.050003  191.089996  194.020004  22765700  194.020004
2019-04-03  196.500000  193.149994  193.250000  195.350006  23271800  195.350006
2019-04-04  196.369995  193.139999  194.789993  195.690002  19114300  195.690002
2019-04-05  197.100006  195.929993  196.449997  197.000000  18526600  197.000000
2019-04-08  200.229996  196.339996  196.419998  200.100006  25881700  200.100006
2019-04-09  202.850006  199.229996  200.320007  199.500000  35768200  199.500000
2019-04-10  200.740005  198.179993  198.679993  200.619995  21695300  200.619995
2019-04-11  201.000000  198.440002  200.850006  198.949997  20900800  198.949997
2019-04-12  200.139999  196.210007  199.199997  198.869995  27760700  198.869995

do,

weekly_summary = pd.DataFrame()
weekly_summary['Open'] = df.open.resample('W').first()
print(weekly_summary)  

                  Open
Date                  
2019-04-07  191.639999
2019-04-14  196.419998

, если не проиндексирован на дату, do,

df['Date'] = pd.to_datetime(df['Date'])
df.set_index('Date', inplace=True)
df.sort_index(inplace=True)

weekly_summary = pd.DataFrame()
weekly_summary['Open'] = df.open.resample('W').first()  

для указанного выше кадра данных кода будет проиндексирован по «воскресеньям», если вы хотите, чтобы он был проиндексирован по «понедельникам» (т. Е. В начальный день недели), выполните следующие действия.

weekly_summary = pd.DataFrame()
weekly_summary['Open'] = df.open.resample('W',loffset=pd.offsets.timedelta(days=-6)).first()
print(weekly_summary)  

                  Open
Date                  
2019-04-01  191.639999
2019-04-08  196.419998
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...