やりたい事
Pythonでスケジュールにそって実行される複数の処理(ネット上からスクレイピングしてデータを読み込む)で、
元になるデータフレームに書き込んで1つのデータフレームにしたいのですが、うまくいきません。
質問用の簡易コード
次に示すコードは、スクレイピング部分を省略して各データフレームからベースに書き込むようにしたものですが
基本的にやりたいことは以下の通りです。
import time import sched import pandas as pd from datetime import datetime import concurrent.futures # 時間表示フォーマット datetime.now().strftime("%Y/%m/%d %H:%M:%S") # スケジューラー scheduler = sched.scheduler(time.time, time.sleep) Start_t = '2020/02/12 18:00:00' df = pd.DataFrame({'ID': ['A01', 'A02', 'A03', 'A04', 'A05', 'B01', 'B02', 'B03', 'B04', 'B05', 'C01', 'C02', 'C03', 'C04', 'C05'], 'A': ['', '', '', '', '', '', '', '', '', '', '', '', '', '', ''], 'B': ['', '', '', '', '', '', '', '', '', '', '', '', '', '', ''], 'C': ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '']}) df.set_index('ID', inplace=True) def test_1(): id_no = ['A01', 'A02', 'A03', 'A04', 'A05'] for j in id_no: df0 = pd.DataFrame({'ID': ['A01', 'A02', 'A03', 'A04', 'A05'], 'A': [1, 2, 3, 4, 5], 'B': [1, 2, 3, 4, 5], 'C': [1, 2, 3, 4, 5]}) df0.set_index('ID', inplace=True) df.loc[j] = df0.loc[j] time.sleep(60) # 実際には1分ごとのスクレイピングのイメージ def test_2(): id_no = ['B01', 'B02', 'B03', 'B04', 'B05'] for j in id_no: df1 = pd.DataFrame({'ID': ['B01', 'B02', 'B03', 'B04', 'B05'], 'A': [11, 12, 13, 14, 15], 'B': [11, 12, 13, 14, 15], 'C': [11, 12, 13, 14, 15]}) df1.set_index('ID', inplace=True) df.loc[j] = df1.loc[j] time.sleep(60) # 実際には1分ごとのスクレイピングのイメージ def test_3(): id_no = ['C01', 'C02', 'C03', 'C04', 'C05'] for j in id_no: df2 = pd.DataFrame({'ID': ['C01', 'C02', 'C03', 'C04', 'C05'], 'A': [21, 22, 23, 24, 25], 'B': [21, 22, 23, 24, 25], 'C': [21, 22, 23, 24, 25]}) df2.set_index('ID', inplace=True) df.loc[j] = df2.loc[j] time.sleep(60) # 実際には1分ごとのスクレイピングのイメージ def test(): executor = concurrent.futures.ProcessPoolExecutor(max_workers=3) executor.submit(test_1) executor.submit(test_2) executor.submit(test_3) if __name__ == "__main__": Start_time1 = Start_t run1 = datetime.strptime(Start_time1, '%Y/%m/%d %H:%M:%S') run1 = int(time.mktime(run1.utctimetuple())) scheduler.enterabs(run1, 1, test) scheduler.run()
補足
このままでも、3つの関数それぞれの保存するデータフレームの名前を変えれば3つのデータフレームとして保存は可能です。また、def test(): の部分を
def test(): test_1() test_2() test_3()
こんな感じで順番で処理をすれば、望むデータフレームにはなりますが、
本来は、決められたスケジュールでスクレイピングが始まり、
それぞれが決められた時間ごとに同時にデータを読みに行く処理をしています。
そして、1つの元になるデータフレームの指定のIDの場所に書き込み1つのデータフレームにしたいのですが、
思うように書き込めません。
やりたい書き込んでいる途中経過としては、こんな感じです。
df =
ID A B C
A01 1 1 1
A02 2 2 2
A03
A04
A05
B01 11 11 11
B02 12 12 12
B03
B04
B05
C01 21 21 21
C02 22 22 22
C03
C04
C05
また、それぞれ読み込んだ後に3つのデータフレームを1つのまとめるのではだめで、
読み込んだデータは時間経過でリアルタイムグラフを考えています。
質問、説明があまり上手ではないかもしれませんが
何卒宜しくお願い致します。
回答4件
あなたの回答
tips
プレビュー