Выполните вычисления для столбца данных на основе значения индекса - PullRequest
1 голос
/ 25 июня 2019

Мне нужно ежемесячно нормализовать значения одного столбца данных Allocation.

data=
                     Allocation  Temperature  Precipitation  Radiation
Date_From                                                             
2018-11-01 00:00:00    0.001905         9.55            0.0        0.0
2018-11-01 00:15:00    0.001794         9.55            0.0        0.0
2018-11-01 00:30:00    0.001700         9.55            0.0        0.0
2018-11-01 00:45:00    0.001607         9.55            0.0        0.0

Это означает, что если у нас есть 2018-11, разделите Allocation на 11,116, в то время как в 2018-12, разделите Allocation на 2473,65 и так далее ... (Эти значения получены изсписок Volume, где Volume[0] соответствует 2018-11 до Volume[7] соответствует 2019-06).

Date_From - это индекс и отметка времени.

data_normalized=
                     Allocation  Temperature  Precipitation  Radiation
Date_From                                                             
2018-11-01 00:00:00    0.000171         9.55            0.0        0.0
2018-11-01 00:15:00    0.000097         9.55            0.0        0.0
...

Мой подход заключался в использовании itertuples:

for row in data.itertuples(index=True,name='index'):
    if row.index =='2018-11':
        data['Allocation']/Volume[0]

Здесь оператор if никогда не бывает верным ...

Другой подход был if ((row.index >='2018-11-01 00:00:00') & (row.index<='2018-11-31 23:45:00')): Однако здесь я получаю ошибку TypeError: '>=' not supported between instances of 'builtin_function_or_method' and 'str'

Могу ли я решить мою проблему с помощью этого подхода или я должен использовать другой подход?Я рад любой помощи

Ура!

1 Ответ

1 голос
/ 25 июня 2019

Может быть, вы можете поместить свой список Volume в фрейм данных, где дата (или индекс) - первый день каждого месяца.

import pandas as pd
import numpy as np

N = 16
date = pd.date_range(start='2018-01-01', periods=N, freq="15d")
df = pd.DataFrame({"date":date, "Allocation":np.random.randn(N)})

# A dataframe where at every month associate a volume
df_vol = pd.DataFrame({"month":pd.date_range(start="2018-01-01", periods=8, freq="MS"),
                       "Volume": np.arange(8)+1})

# convert every date with the beginning of the month
df["month"] = df["date"].astype("datetime64[M]")

# merge
df1 = pd.merge(df,df_vol, on="month", how="left")

# divide allocation by Volume. 
# Now it's vectorial as to every date we merged the right volume.
df1["norm"] = df1["Allocation"]/df1["Volume"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...