首页 > 解决方案 > Pandas - 根据逻辑语句定位值

问题描述

我正在将此数据集用于项目。 我试图找到数据集 34 天持续时间内每个逆变器的总产量(基本上使用每个逆变器可用的最终值和初始值)。我已经能够获得使用的逆变器列表pd.unique()(每个太阳能发电厂有 22 个逆变器。

我无法查询total_yield每个逆变器的数据。这是我尝试过的:

def get_yields(arr: np.ndarray, df:pd.core.frame.DataFrame) -> np.ndarray:
    delta = np.zeros(len(arr))
    index =0
    for i in arr:
        initial = df.loc[df["DATE_TIME"]=="15-05-2020 02:00"]
        initial = initial.loc[initial["INVERTER_ID"]==i]
        initial.reset_index(inplace=True,drop=True)
        initial = initial.at[0,"TOTAL_YIELD"]
        final = df.loc[(df["DATE_TIME"]=="17-06-2020 23:45")]
        final = final.loc[final["INVERTER_ID"]==i]
        final.reset_index(inplace=True, drop=True)
        final = final.at[0,"TOTAL_YIELD"]

        delta[index] = final - initial
        index = index + 1
    return delta

参考:arr是逆变器阵列,如下所列。df是每个植物的生成数据框。
问题是并非每个逆变器都有每个间隔的数据点。这使得此功能仅适用于第一个工厂的逆变器,而不适用于第二个工厂。

我的第二种方法是先通过逆变器进行过滤,然后获取第一个和最后一个数据点。但是我收到一个错误'Series' objects are mutable, thus they cannot be hashed -到目前为止,这是代码:

def get_yields2(arr: np.ndarray, df: pd.core.frame.DataFrame) -> np.ndarry:
    delta = np.zeros(len(arr))
    index = 0
    for i in arr:
        initial = df.loc(df["INVERTER_ID"] == i)
        index += 1
        break
    return delta

1厂逆变器列表供参考(标记为SOURCE_KEY):

['1BY6WEcLGh8j5v7' '1IF53ai7Xc0U56Y' '3PZuoBAID5Wc2HD' '7JYdWkrLSPkdwr4'
 'McdE0feGgRqW7Ca' 'VHMLBKoKgIrUVDU' 'WRmjgnKYAwPKWDb' 'ZnxXDlPa8U1GXgE'
 'ZoEaEvLYb1n2sOq' 'adLQvlD726eNBSB' 'bvBOhCH3iADSZry' 'iCRJl6heRkivqQ3'
 'ih0vzX44oOqAx2f' 'pkci93gMrogZuBj' 'rGa61gmuvPhdLxV' 'sjndEbLyjtCKgGv'
 'uHbuxQJl8lW7ozc' 'wCURE6d3bPkepu2' 'z9Y9gH1T5YWrNuG' 'zBIq5rxdHJRwDNY'
 'zVJPv84UY57bAof' 'YxYtjZvoooNbGkE']

2厂逆变器列表:

['4UPUqMRk7TRMgml' '81aHJ1q11NBPMrL' '9kRcWv60rDACzjR' 'Et9kgGMDl729KT4'
 'IQ2d7wF4YD8zU1Q' 'LYwnQax7tkwH5Cb' 'LlT2YUhhzqhg5Sw' 'Mx2yZCDsyf6DPfv'
 'NgDl19wMapZy17u' 'PeE6FRyGXUgsRhN' 'Qf4GUc1pJu5T6c6' 'Quc1TzYxW2pYoWX'
 'V94E5Ben1TlhnDV' 'WcxssY2VbP4hApt' 'mqwcsP2rE7J0TFp' 'oZ35aAeoifZaQzV'
 'oZZkBaNadn6DNKz' 'q49J1IKaHRwDQnt' 'rrq4fwE8jgrTyWY' 'vOuJvMaM2sgwLmb'
 'xMbIugepa2P7lBB' 'xoJJ8DcxJEcupym']

非常感谢。

标签: pythonpandasnumpy

解决方案


我无法下载数据集来测试这一点。收到“To May Requests”错误。

但是,您应该能够使用groupby.

import pandas as pd
result = df.groupby('INVERTER_ID')['TOTAL_YIELD'].agg(['max','min'])
result['delta'] = result['max']-result['min']
print(result[['delta']])  

推荐阅读