🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1681閲覧

ループ処理の高速化と最適化

atom813

総合スコア5

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/12/12 09:12

編集2019/12/13 09:24

前提・実現したいこと

2016年の約1500軒の建物のエネルギー消費データがあり、そこから2017年と2018年の消費エネルギー予測をする問題です。まず初めに、2016年のデータをそのまま2017年と2018年にコピーしたいと考えました。具体的にtrain_5とtest_1のカラムの内、"building_id","meter","timestamp.1"の値がおお互いに全て一致していれば、train_5の"meter_reading"値をそのままtest_1の"meter_reading"に入れて欲しいという関数を書いています。しかし私が書いたコードはかなり実行が遅く、終了するのに1か月掛かる見込みとなりました。どうにか高速化できないでしょうか。よろしくお願いいたします。
![イメージ説明]

イメージ説明

該当のソースコード

➀train_5_np=np.array(train_5)

➁test_1_np=np.array(test_1)

➂from tqdm import tqdm

➃@jit
def function():

 for i in tqdm(range(len(test_1_np))):  for j in (range(len(train_5_np))):  if test_1_np[i,4] == train_5_np[j,4]:   if test_1_np[i,1]== train_5_np[j,0] and test_1_np[i,2]== train_5_np[j,1]: test_1_np[i,5]=train_5_np[j,3] break else : continue

試したこと

計算が遅すぎるため断念しました。
何か高速化する方法はないでしょうか。

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2019/12/12 11:47

pandas.DataFrameで処理した方が良いような気がします。(可能な限りforループは使わずに列で処理します) また、環境が不明ですがデータ数が多い場合には複数コアで処理すると速くなります。
atom813

2019/12/12 12:00

興味を持っていただきありがとうございます! DataFrameの型で行うと、処理が遅いと耳にしていたため、Numpyを使用しておりました。 当方pythonの知識が浅いため、大変恐縮ですがどのようにforループを使わずに列で処理するのか、一例を教えていただけますと幸いです。
bsdfan

2019/12/12 13:29

building_idでソートされているなら、内側のループで毎回全部走査する必要はないのでは。
atom813

2019/12/13 07:22

ご回答ありがとうございます! 私自身も内側のループで毎回全部走査する必要がないと思いましたが、どのように部分的だけに走査してもらえるコードを書けばよいのかわからず、断念しました。もしよろしければ、具体的なコードを教えていただけませんでしょうか。よろしくお願いいたします。
kabayan55

2019/12/13 09:11

質問内容とは関係なくて恐縮なのですが、kaggleの現行コンペのcodeシェアは原則禁止されています。ASHRAEコンペのRulesの "No private sharing outside teams" の箇所が該当部分です。コンペ終了前は、コンペのコードであることは伏せておいた方が良いかと思われますので、質問修正した方がいいかと思います。
atom813

2019/12/13 09:19

教えていただき、ありがとうございます! すぐ修正したいと思います。
guest

回答1

0

ベストアンサー

簡単な例です。
df1、df2はpandas.DataFrameです。

Python

1print(df1) 2# c1 c2 c3 c4 3#0 a b c 100 4#1 d e f 200 5#2 g h i 300 6 7print(df2) 8# c1 c2 c3 9#0 a b c 10#1 d e f 11#2 g h j 12 13df2.loc[(df1['c1']==df2['c1']) & (df1['c2']==df2['c2']) & (df1['c3']==df2['c3']) , 'c4'] = \ 14df1[(df1['c1']==df2['c1']) & (df1['c2']==df2['c2']) & (df1['c3']==df2['c3'])]['c4'] 15 16# c1 c2 c3 c4 17#0 a b c 100.0 18#1 d e f 200.0 19#2 g h j NaN

投稿2019/12/13 11:07

meg_

総合スコア10739

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問