質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python

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

Q&A

解決済

2回答

1601閲覧

DataFrameを定期的に更新し、情報を蓄積したい。

mmtt

総合スコア23

Python

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

0グッド

0クリップ

投稿2019/05/17 11:53

編集2019/05/17 11:59

###プログラムの概要
スマホゲームのAPIを用いて、対戦成績に関するデータを収集し、dataframeに入れます。
※ここでは、定期的に自動でプログラムを実行する部分は未設計です。

具体的には
①空のデータフレームを作る
②必要な情報を取得する
③②を用いてSeriesにまとめる
④③を空のフレームに追加
を行おうとしています。

分からないこと

関数を定期的に実行し、DateFrameにデータを蓄積するコードの書き方。
特に、1度目実行したのち一定時間後再度実行した際に、またデータフレームが空の状態になってしまっているため、データが蓄積できていません。

※コードの書き方にエラーがでているわけではありません。

実際のコード

python3.72

1def selfdeck_list(name): 2 3 columns1=["type","my","opponent","result","time"] # ①の部分 4 df = pd.DataFrame(columns=columns1) 5 6 ba = battle_info(name) # ここから②の部分 7 datalist = [] 8 for newnum in range(0,25): 9 10 mydecklist = [ ba[decknum]["team"][0]["cards"][numindeck]["name"] for decknum in range(0,25) for numindeck in range(0,8) ] 11 opodecklist= [ ba[decknum]["opponent"][0]["cards"][numindeck]["name"] for decknum in range(0,25) for numindeck in range(0,8) ] 12 decktype = [ ba[decknum]["type"] for decknum in range(0,25)] 13 mycrowns = [ ba[decknum]["team"][0]["crowns"] for decknum in range(0,25)] 14 opocrowns= [ ba[decknum]["opponent"][0]["crowns"] for decknum in range(0,25)] 15 time = [ ba[decknum]["battleTime"] for decknum in range(0,25)] 16 17 a = decktype[int(newnum)] 18 b = tuple(mydecklist[int(newnum*8):int(newnum*8+8)]) 19 c = tuple(opodecklist[int(newnum*8):int(newnum*8+8)]) 20 if mycrowns[int(newnum)] > opocrowns[int(newnum)]: 21 winorlose = "win" 22 elif mycrowns[int(newnum)] < opocrowns[int(newnum)]: 23 winorlose = "lose" 24 else: 25 winorlose = "draw" 26 d = winorlose 27 e = time[int(newnum)][:15] 28 data = [a,b,c,d,e] 29 datalist.append(data) 30 record = pd.Series(datalist) # ③の部分 31 df = df.append(record, ignore_index=True) # ④の部分 32 33

コード全体

Python

1 2import json 3import requests 4import pandas as pd 5import numpy as np 6 7access_key = "" 8 9URL = 'https://api.clashroyale.com/v1' 10 11#選手名とパスを結合する辞書を作成 12dic={"みかん坊や":"%232VYJYJ09","天GOD":"%232G0QUGLU","kota":"%23889VQ8JP","RAD":"%238QRCJQ9Y","ライキジョーンズ":"%2398Q8LPQ9", 13 "Jack":"%23YRVL9U98","きたっしゃん":"%23P8RLYOV9","だに":"%238LJVVGJP","けんつめし":"%23PQRR0CG9", 14 "Rorapolon":"%239JPRJ9R","焼き鳥":"%232Y8GL0V2","ユイヒイロ":"%23R2GRQPCJ","Blossom":"%238Q20LRC8Y","kk19212":"%23RU2CC2LG", 15 "れいや":"%232LRVG0C8","HANE×HANE":"%238Y088VU8U","Lewis":"%238Q020U0U","ピラメキ":"%232YGQGY92V","天ぷら":"%238Q2V2CGR","Scott":"%232Q98GVP9V"} 16 17# 選手名を含むリストを作成 18list= ["みかん坊や","天GOD","kota","RAD","ライキジョーンズ", 19 "Jack","きたっしゃん","だに","けんつめし", 20 "Rorapolon","焼き鳥","ユイヒイロ","Blossom","kk19212", 21 "れいや","HANE×HANE","Lewis","ピラメキ","天ぷら","Scott"] 22 23 24def battle_info(name): 25 target_api = URL + "/players/" 26 playerTag = dic[name] 27 url = target_api+playerTag+"/battlelog" 28 headers = { 29 "content-type": "application/json; charset=utf-8", 30 "cache-control": "max-age=60", 31 "authorization": "Bearer %s" % access_key} 32 r = requests.get(url,headers=headers) 33 data = r.json() 34 return data 35 36__name__ == '__battle_info__' 37 38 39 40 41 42def selfdeck_list(name): 43 44 columns1=["type","my","opponent","result","time"] 45 df = pd.DataFrame(columns=columns1) 46 47 ba = battle_info(name) 48 datalist = [] 49 for newnum in range(0,25): 50 51 mydecklist = [ ba[decknum]["team"][0]["cards"][numindeck]["name"] for decknum in range(0,25) for numindeck in range(0,8) ] 52 opodecklist= [ ba[decknum]["opponent"][0]["cards"][numindeck]["name"] for decknum in range(0,25) for numindeck in range(0,8) ] 53 decktype = [ ba[decknum]["type"] for decknum in range(0,25)] 54 mycrowns = [ ba[decknum]["team"][0]["crowns"] for decknum in range(0,25)] 55 opocrowns= [ ba[decknum]["opponent"][0]["crowns"] for decknum in range(0,25)] 56 time = [ ba[decknum]["battleTime"] for decknum in range(0,25)] 57 58 a = decktype[int(newnum)] 59 b = tuple(mydecklist[int(newnum*8):int(newnum*8+8)]) 60 c = tuple(opodecklist[int(newnum*8):int(newnum*8+8)]) 61 if mycrowns[int(newnum)] > opocrowns[int(newnum)]: 62 winorlose = "win" 63 elif mycrowns[int(newnum)] < opocrowns[int(newnum)]: 64 winorlose = "lose" 65 else: 66 winorlose = "draw" 67 d = winorlose 68 e = time[int(newnum)][:15] 69 data = [a,b,c,d,e] 70 datalist.append(data) 71 record = pd.Series(datalist) 72 df = df.append(record, ignore_index=True) 73 74 print(df) 75 76 77__name__ == '__selfdeck_list__' 78 79selfdeck_list("Scott") 80

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

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

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

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

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

guest

回答2

0

ベストアンサー

以下のようなコードで実行毎に行を追加できます。

Python

1import pandas as pd 2import os 3from datetime import datetime 4 5path = 'ret.csv' 6if os.path.isfile(path): 7 df = pd.read_csv(path) # 既存ファイルがあれば読み込む 8else: 9 df = pd.DataFrame({'no':[],'dt':[]}) # なければ雛型を作成 10 11# 'no'列に連番をいれるテスト 12no = 1 13if len(df) > 0: 14 no = df.tail(1).iat[0,0] + 1 15 print(no) 16 17# 実行毎に行を追加 18df = df.append({'no':no,'dt':datetime.now()},ignore_index=True) 19 20df.to_csv(path,index=False)

投稿2019/05/18 01:49

can110

総合スコア38233

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

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

mmtt

2019/05/18 12:12 編集

ありがとうございます。教えていただいた通り修正したところ、定期的に実行毎に行追加できました。 しかし、重複する行を削除できなくなってしまいました。何か改善策はありますでしょうか? 修正後のコード↓ def selfdeck_list(name): columns1=["type","my","opponent","result","time"] ba = battle_info(name) datalist = [] path = filedic[name] if os.path.isfile(path): df = pd.read_csv(path) # 既存ファイルがあれば読み込む else: df = pd.DataFrame(columns=columns1)# なければ雛型を作成 for newnum in range(0,25): mydecklist = [ ba[decknum]["team"][0]["cards"][numindeck]["name"] for decknum in range(0,25) for numindeck in range(0,8) ] opodecklist= [ ba[decknum]["opponent"][0]["cards"][numindeck]["name"] for decknum in range(0,25) for numindeck in range(0,8) ] decktype = [ ba[decknum]["type"] for decknum in range(0,25)] mycrowns = [ ba[decknum]["team"][0]["crowns"] for decknum in range(0,25)] opocrowns= [ ba[decknum]["opponent"][0]["crowns"] for decknum in range(0,25)] time = [ ba[decknum]["battleTime"] for decknum in range(0,25)] a = decktype[int(newnum)] b = tuple(mydecklist[int(newnum*8):int(newnum*8+8)]) c = tuple(opodecklist[int(newnum*8):int(newnum*8+8)]) if mycrowns[int(newnum)] > opocrowns[int(newnum)]: winorlose = "win" elif mycrowns[int(newnum)] < opocrowns[int(newnum)]: winorlose = "lose" else: winorlose = "draw" d = winorlose e = time[int(newnum)][:15] data = [a,b,c,d,e] datalist.append(data) df = df.append(datalist,ignore_index=True).drop_duplicates().reset_index(drop=True) df.to_csv(path,index=False) __name__ == '__selfdeck_list__' selfdeck_list("Scott")
can110

2019/05/18 12:18

for newnum in range(0,25):以降の処理詳細を把握していないため何とも云えませんが、まずは どの行とどの行(既ファイル保存行と?)が重複しているのか? その原因は何か?を確認、特定することから進めることがよろしいかと思います。
mmtt

2019/05/18 12:33

恐らく、定期的に実行した際に返ってくる値(datalist)に重複した部分があり、それを処理するdrop_duplicates()がうまく機能していないのかなと思います。 ありがとうございます。もう少し試してみます。
guest

0

シリアライズすれば永続化できます。

pandas シリアライズで調べると参考になるサイトがたくさん出てくると思います。

投稿2019/05/17 12:27

waku_nagoya

総合スコア200

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

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

mmtt

2019/05/18 00:20

ありがとうございます。検索してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問