выполнение расчетов на подмножествах нескольких панд DF без слияния - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь выполнить расчеты сразу по нескольким фреймам и вывести результаты на новый фрейм. Самая медленная часть - это операция слияния, результат которой я использую для вычисления чего-либо для выходного кадра данных. Мне интересно использовать что-то вроде карты, которая группируется по одному столбцу и выполняет вычисления с использованием другого. Я смотрел на группу, но не могу извлечь данные из последующих групп, не просматривая их.

Я агностик по поводу подхода, пока он быстрый. Я думаю, что если бы я мог сгруппировать sitename в «weather_weights_df» и каким-то образом объединить каждую группу с текущей погодой, а также сделать это для каждого «актива» одновременно, то это было бы очень быстро! В то время как в данный момент я использую медленные итерационные методы.

Любая помощь будет очень признательна! Вот мои данные:

station_weights_df

форма 6148,3 тахеометры 28

station sitename    weightStation2Site
EGJJ    Forss   0.001371715
EGJJ    Forss   0.001371795
EGJJ    Findhorn Ecovillage 0.001398113
EGJJ    Burradale   0.001412482
EGJJ    Crystal Rig 0.001429332
EGJJ    Boyndie Airfield    0.001433208
EGJJ    Crystal Rig 0.001437219
EGJJ    Beinn Tharsuinn 0.001462698
EGJJ    Millennium Wind Farm    0.001706282
EGJJ    Ben Aketil  0.001907344
EGJJ    Ben Aketil  0.001910112
EGDR    Burradale   0.001930678
EGDR    Crystal Rig 0.001974192
EGDR    Crystal Rig 0.001978165
EGDR    Boyndie Airfield    0.002042599
EGDR    Forss   0.002098689
EGDR    Forss   0.002098831
EGDR    Findhorn Ecovillage 0.002124658
EGJJ    Dun Law 0.002197881
EGJJ    Black Law Wind Farm 0.002259689

todays_weather_data

DateTime    wind_speed_ms   station
2017-01-01 00:00:00+00:00   2   EGPH
2017-01-01 00:00:00+00:00   5   EGDM
2017-01-01 00:00:00+00:00   5   EGPD
2017-01-01 00:00:00+00:00   5   EGOM
2017-01-01 00:00:00+00:00   5   EGNM
2017-01-01 00:00:00+00:00   6   EGNS
2017-01-01 00:00:00+00:00   3   EGLL
2017-01-01 00:00:00+00:00   6   EGMD
2017-01-01 00:00:00+00:00   4   EGGP
2017-01-01 00:00:00+00:00   8   EGDR
2017-01-01 00:00:00+00:00   4   EGCC
2017-01-01 00:00:00+00:00   5   EGYM
2017-01-01 00:00:00+00:00   5   EGXW
2017-01-01 00:00:00+00:00   4   EGBB
2017-01-01 00:00:00+00:00   5   EGXE
2017-01-01 00:00:00+00:00   5   EGVO
2017-01-01 00:00:00+00:00   4   EGVN
2017-01-01 00:00:00+00:00   5   EGUW
2017-01-01 00:00:00+00:00   4   EGQL
2017-01-01 00:00:00+00:00   4   EGUB
2017-01-01 00:00:00+00:00   6   EGPN
2017-01-01 00:00:00+00:00   3   EGPF
2017-01-01 00:00:00+00:00   5   EGOS
2017-01-01 00:00:00+00:00   4   EGNT
2017-01-01 00:00:00+00:00   6   EGJJ
2017-01-01 00:00:00+00:00   6   EGDX
2017-01-01 00:00:00+00:00   8   EGQK
2017-01-01 00:00:00+00:00   3   EGWU

asset_capacity_clean

форма 234,

sitename                capacity    2015 asset capacity fraction    2016 asset capacity fraction    2017 asset capacity fraction    2018 asset capacity fraction    2019 asset capacity fraction
Findhorn Ecovillage     0.75        5.81E-05                        5.53E-05                        4.80E-05                        4.12E-05                        3.41E-05
Delabole wind farm      9.2         0.000713178                     0.000677816                     0.000588951                     0.000505078                     0.000417859
Llandinam P&L           30.9        0.002395349                     0.002276579                     0.001978106                     0.001696404                     0.001403461
Rhyd-y-Groes            7.2         0.00055814                      0.000530465                     0.000460918                     0.000395279                     0.00032702
Blood Hill wind farm    2.25        0.000174419                     0.00016577                      0.000144037                     0.000123525                     0.000102194
Haverigg                1.1         8.53E-05                        8.10E-05                        7.04E-05                        6.04E-05                        5.00E-05
Carland Cross           20          0.001550388                     0.001473514                     0.001280328                     0.001097996                     0.000908389
Chelker Reservoir       1.2         9.30E-05                        8.84E-05                        7.68E-05                        6.59E-05                        5.45E-05
Coal Clough Wind Farm   9.6         0.000744186                     0.000707287                     0.000614557                     0.000527038                     0.000436027
Taff Ely                9           0.000697674                     0.000663081                     0.000576147                     0.000494098                     0.000408775
Cold Northcott          6.8         0.000527132                     0.000500995                     0.000435311                     0.000373319                     0.000308852

Чтобы получить простую рабочую версию, я перебираю набор данных 'asset_capacity_clean', затем объединяю todays_weather_data с 'station_weights_df' и вычисляю новый столбец на основе объединенных данных. Это работает, но на самом деле слишком медленно, чтобы быть полезным. Было бы хорошо, если бы я делал это за несколько недель данных, но у меня есть 10 лет, поэтому разный df для 'todays_weather_data' для каждого дня в 10 лет! Вот код:

df = all_asset_heuristics_df.copy()
for i, asset in asset_capacity_clean.iterrows():
    temp = pd.DataFrame()
    temp = pd.merge(todays_weather_data[['wind_speed_ms', 'station']], station_weights_df[station_weights_df['sitename'] == asset['sitename']],  how='left', left_on=['station'], right_on = ['station'])
    temp['weighted wind'] = temp['wind_speed_ms'] * temp['weightStation2Site']

    year_colname = str(asset_fraction_per_year_dict[cur_date.year])      # gets the current year
    asset_heuristic = sum(temp['weighted wind']) * asset[year_colname]   # calculates heuristic based on which year it is

    if np.isfinite(asset_heuristic):
        line = {}
        line['DateTime'] = cur_date
        line['sitename'] = asset['sitename']
        line['asset_heuristic'] = asset_heuristic
        df = df.append(line, ignore_index=True)


    return df

Мой желаемый вывод - это фрейм данных, который содержит 'asset_heuristic', который рассчитывается в коде и показан ниже для первых нескольких 'sitename's, таких как:

    DateTime  asset_heuristic              sitename
0 2017-01-01         0.000439   Findhorn Ecovillage
1 2017-01-01         0.010087    Delabole wind farm
2 2017-01-01         0.032209         Llandinam P&L
3 2017-01-01         0.007630          Rhyd-y-Groes
4 2017-01-01         0.002362  Blood Hill wind farm
...