くだすれPython(超初心者用) その46【Ruby禁止】

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2020/01/02(木) 15:56:54.08ID:ZUrZA+uS
当スレに★Python以外のプログラミング言語での回答類を書くべからず★
☆「Ruby では」「Rubyでは」をNGワード登録推奨

このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
へび使いが優しくコメントを返しますが、お礼は Python の布教と初心者の救済をお願いします。

★Pythonのソースコードはそのまま5ちゃんにコピペするとインデントが崩れるので
  ↓等のてきとうなソースコード用うpろだに貼ってきてください。
  スクショをImgur等にうp といった 手抜き(クソ行為)禁止。
ttp://ideone.com/      デフォ設定はC用のため言語選択ボタン押下がピコ手間かも。
ttp://codepad.org/      ほぼ直感的に使える。Run codeボタンあり。
ttp://pastebin.com/     まずまずシンプル。
ttp://dpaste.com/      とてもシンプル。消えるまでの日数は十分長ーく指定のこと。
ttps://jupyter.org/try    (旧try.jupyter.org)ちょっとめんどうそう

◆エラーを解決したい場合は、表示されてるエラー全文(勝手に省略禁止)と
  実行環境(Pythonのバージョン・OS名・IDEの種類とバージョン)をシッカリ書くこと。

◇Python公式サイト◇ http://www.python.org/
◇まとめwiki◇ ttp://python.rdy.jp/

〇前スレ〇
くだすれPython(超初心者用) その45【Ruby禁止】
https://mevius.5ch.net/test/read.cgi/tech/1571188632/
2020/01/07(火) 23:55:26.90ID:cN6CR2jQ
>>90
ありがとうございます。
2020/01/07(火) 23:57:52.11ID:cN6CR2jQ
https://ideone.com/Fl1R9z

40行目の

df.iloc[i][output_column] = 1

が怪しいとおもうのですが、取り込んだdfが整数だけのときは1が書き込めているのですが、
dfに小数が含まれているときは書き込めていないようです。
なぜなのでしょう・・・・・。
2020/01/08(水) 12:53:13.99ID:U2S7mQMy
>>92
↓この警告出てるよね? リンク先みて警告を消そう
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

とりあえず df.loc[i, output_column] = 1 にすれば動くけど
普通はenumerateとかせずにapply使う場面だと思う
df[output_column] = df[chk_column].apply(is_outlier)
94デフォルトの名無しさん
垢版 |
2020/01/08(水) 17:08:03.84ID:Sre2vN3k
df['price_edited'] = df['price'].apply(lambda a: int(a[1:]) if a.startswith('$') else 0)
2020/01/08(水) 18:24:29.64ID:xdUcjCBz
>>67
クリックできるようになるまで待つのをやめて、ボタンが現れるのに十分と思われる時間待った後で普通にクリックしてみる。
そうするとなんでクリックできないのか分かるかもしれない。
2020/01/08(水) 19:32:52.69ID:j91Gwtaz
map, filter, reduceとか色々あるけど、pythonでこの辺って使う機会ある?
2020/01/08(水) 19:59:10.33ID:NG22H+Rz
ほとんどない
リスト内包表記の方が可読性高いし、複雑な処理にはどうせpandasとか使うし
2020/01/08(水) 20:02:38.71ID:cyxQSndQ
pythonに限らずどの言語でも用意されてるがどの言語でも使わない
2020/01/08(水) 20:06:21.39ID:HaPwADKT
mapは、リスト中の数字と数値を数字に統一して、ソートできるように再マッピングするときに使うことはある
100デフォルトの名無しさん
垢版 |
2020/01/08(水) 20:07:25.06ID:cBWLj0dO
>>98
じゃあどうするの?
for文?
2020/01/08(水) 20:10:23.35ID:v4o4ZY0H
>>96
mapは内包表記を使うほどでもないとき
競技プログラミングとかで入力を全部int型のリストに置き換えるときとかに使うぞ

a,b,c = map(int,input().split())って感じで
2020/01/08(水) 20:28:49.09ID:w1X5ZQ1+
なるほどlambda書かなくていいケースなら短いんだな
103デフォルトの名無しさん
垢版 |
2020/01/08(水) 20:31:21.99ID:rc02anx7
競プロで使うといえば、sys.stdinとcollections.dequeも
2020/01/08(水) 21:13:48.14ID:U2S7mQMy
>>96
個人用のコードの場合はcurryやpipeと合わせてそこそこ使うけど
他人が読み書きするコードの場合は基本的に内包表記に揃えてる

他の言語と違ってpythonの場合は
そのままだと処理つなげないからmap/filter/reduceだと簡潔に書けない
105デフォルトの名無しさん
垢版 |
2020/01/08(水) 21:16:10.78ID:cBWLj0dO
>>98
ねえねえ
106デフォルトの名無しさん
垢版 |
2020/01/08(水) 21:23:57.62ID:rc02anx7
むしろ、内包表記の方が使わんわ
2020/01/08(水) 21:28:12.52ID:cyxQSndQ
昔はシュワルツ変換とかあったが今のpythonじゃそんなの聞かないだろ?
2020/01/08(水) 21:28:32.46ID:j91Gwtaz
>>101
mapってこれa,b,cに直で突っ込めるん?
109デフォルトの名無しさん
垢版 |
2020/01/08(水) 21:48:20.80ID:rc02anx7
>>108
https://ideone.com/NPueLR

https://docs.python.org/ja/3/tutorial/datastructures.html#tuples-and-sequences
2020/01/09(木) 09:06:17.58ID:CHl595iH
>>106
競プロのことは知らないけど、内包表記の方が基本短くならない?なにか違う理由で使わないの?
2020/01/09(木) 10:22:53.25ID:CxgUH5at
バイト列に関して質問です。
文字タイプのバイト列情報の文字を、日本語に復元したいです。
例えば、
\x12\x34\x56\x78
という文字列があります。
これを
あいう
のような意味のわかる日本語にしたいです。
その場合、
print(b'\x12\x34\x56\x78'.decode('cp932'))
で復元できます。
そこで、復元したい文字列は複数あるので、
\x12\x34\x56\x78 を変数に代入してから、
for文で復元しようとしています。
しかし、変数に代入したら b をつけられません。
どうすればバイト列にしてから復元できるのでしょうか?
2020/01/09(木) 10:37:07.44ID:I9hACzJa
b'\x12\x34\x56\x78'を入れちゃだめなの?
2020/01/09(木) 11:18:23.26ID:nzRPJUvL
データフレームのラベルにlatency[msec]と単位をいれたいのですが、

lm_model = smf.ols(formula="latency[msec]~x", data=df).fit()

とすると
latency is not define
となります。
latency_msecとするとokなのですが[]や()を使うとダメ
[]、()をラベルに使ってはいけないのでしょうか?
2020/01/09(木) 11:29:08.27ID:m2IVdqCX
>>112
レスありがとうございます。
変数にb'\x12\x34\x56\x78'を入れるということでしょうか?
bと文字列 \x12\x34\x56\x78 を合体させる方法が分からないんですよね・・・
115デフォルトの名無しさん
垢版 |
2020/01/09(木) 12:33:47.44ID:0RBXSUPh
numpy とか pandas 使うとそっちで解決しちゃう
116デフォルトの名無しさん
垢版 |
2020/01/09(木) 12:39:08.38ID:j8mTnocC
>>110
それ答えてもいいけど、過去何度も何度も繰り返された議論が始まるだけだぞ
117デフォルトの名無しさん
垢版 |
2020/01/09(木) 12:45:59.86ID:81iybZRX
>>114
s = '\x12\x34\x56\x78'
b = s.encode('latin-1')
2020/01/09(木) 15:59:03.66ID:VxfXfT1S
>>111
string = '¥x82¥xa0¥x82¥xa2¥x82¥xa4'
hexstr = string.encode('unicode_escape').decode('utf-8').replace('¥¥x', '')
print(bytes.fromhex(hexstr).decode('cp932'))

https://www.onlinegdb.com/ByuRArNxI
2020/01/09(木) 16:52:22.09ID:OQFCwUQr
l = [[1,2,3],[4,5]]

から

[1,2,3,4,5]

に変形したいのですが、リスト内包表記だけでできますか?
2020/01/09(木) 17:49:39.42ID:CxgUH5at
>>117
すみません、
出来ませんでした

>>118
すみません、出来ませんでした
2020/01/09(木) 18:04:23.16ID:VxfXfT1S
>>119
できるけどやめれ

foo = [[1,2,3],[4,5]]
[x for inner in foo for x in inner]
#=> [1, 2, 3, 4, 5]
2020/01/09(木) 18:05:14.78ID:VxfXfT1S
>>120
↓これ動かないの?
https://www.onlinegdb.com/ByuRArNxI
2020/01/09(木) 18:11:11.27ID:CxgUH5at
>>122
全部見てませんでしたすみません

そちらは動きました。
自分のでも動くか試してみます
124デフォルトの名無しさん
垢版 |
2020/01/09(木) 18:53:25.08ID:KHoLcO1x
>>119
sum(l,[])
2020/01/09(木) 19:12:34.29ID:NaQHxKOV
>>124
はえ〜シンプル
一階層だけならこれでいいな
126119
垢版 |
2020/01/09(木) 19:42:16.05ID:DanfNow/
>>121 のやり方が3次元以上でも対応できるのでいいですね。
おっさんありがとう。
2020/01/09(木) 19:56:28.10ID:nuQhSBU1
map, reduce, filterと来れば次はflatten
でもpython標準にはない
128デフォルトの名無しさん
垢版 |
2020/01/09(木) 20:03:36.46ID:vYl+3riX
>>> np.array([[1,2,3],[4,5,6]]).flatten()
array([1, 2, 3, 4, 5, 6])
>>> np.array([[1,2,3],[4,5]]).flatten()
array([[1, 2, 3], [4, 5]], dtype=object)
めんどいな
129デフォルトの名無しさん
垢版 |
2020/01/09(木) 20:06:14.36ID:vYl+3riX
>>> pd.DataFrame([[1,2,3],[4,5]]).flatten()
AttributeError: 'DataFrame' object has no attribute 'flatten'
>>> pd.Series([[1,2,3],[4,5]]).flatten()
AttributeError: 'Series' object has no attribute 'flatten'
>>> list(int(_[1]) for _ in pd.concat(pd.Series(_[1:]) for _ in pd.DataFrame([[1,2,3],[4,5]]).itertuples()).iteritems() if not np.isnan(_[1]))
[1, 2, 3, 4, 5]
めんどい
2020/01/09(木) 20:41:39.72ID:ZiyVM7wM
df.query("tag.str.contains('log')")

だと、'LOG'や'Log'にマッチしないですが、queryを使った何か方法あります?
131デフォルトの名無しさん
垢版 |
2020/01/09(木) 20:49:32.76ID:vYl+3riX
df.query("tag.str.contains('log') or tag.str.contains('LOG') or tag.str.contains('Log')")
2020/01/09(木) 20:50:05.73ID:hJpPvhWv
dfにlower()を適用した行を追加する
133デフォルトの名無しさん
垢版 |
2020/01/09(木) 20:54:34.17ID:vYl+3riX
df.query("tag.str.contains('log', case=False)")
または
df.query("tag.str.contains('[lL][oO][gG]')")
134130
垢版 |
2020/01/09(木) 20:59:41.18ID:ZiyVM7wM
case=Falseでいいです。
おっさんありがとう。
135デフォルトの名無しさん
垢版 |
2020/01/09(木) 21:05:50.10ID:o7IUVb3B
あなたのハゲにサクセスしたい
2020/01/09(木) 22:29:38.19ID:rdMUJkc5
散布図書いて

凡例1:回帰直線あり
凡例2:回帰直線なし

としたいんですが
sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips, legend=False, fit_reg=False)

とfit_regを使うと凡例1、2とも回帰直線あり、なしで統一されますよね。
凡例ごとに回帰直線あり、なしを設定する方法ないでしょうか?
2020/01/09(木) 22:30:27.61ID:rdMUJkc5
もしくはlmplotで凡例1の回帰直線を書いて、
その後に凡例にの散布図を重ねるとかできるといいのですが・・・。
138デフォルトの名無しさん
垢版 |
2020/01/10(金) 08:58:33.71ID:rEsoa4AS
pywinautoをインストールし、以下を実行するとエラーが出ます。
Python 3.7.6 (tags/v3.7.6:43364a7ae0, Dec 19 2019, 00:42:30) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from pywinauto.application import Application
---中略----
TypeError: item 2 in _argtypes_ passes a union by value, which is unsupported.
>>>
何かご存じの方いらっしゃいませんか?
2020/01/10(金) 17:45:23.17ID:DFPKFrGt
win32apiは用意されてるのかな
140デフォルトの名無しさん
垢版 |
2020/01/10(金) 18:01:26.41ID:rEsoa4AS
>>139
pywin32 221はインストールしてあります。
import win32api
と入力しても何も言われないので、インポートできてると思われます。
2020/01/10(金) 18:33:13.96ID:ygDjj+Gv
>>138
これかもね
https://github.com/pywinauto/pywinauto/issues/868
142デフォルトの名無しさん
垢版 |
2020/01/10(金) 19:11:57.27ID:rEsoa4AS
>>141
python3.7.4に下げたところ、うまく動きました!!
大変助かりました。ありがとうございました!
143デフォルトの名無しさん
垢版 |
2020/01/11(土) 12:56:53.77ID:+sNn4E0T
Webサイトの動的なパラメータを取得し、
PythonでCSVに保存したいのですが、
requestsでのJSの動的なパラメーターの操作・取得方法が分かりません。

どのようにしたらいいでしょうか?


具体的には"https://fast.com/ja/";で通信速度を定期的に
測りたいです。
144デフォルトの名無しさん
垢版 |
2020/01/11(土) 13:14:12.97ID:I3GzSO2X
api直で叩けるならrequestsでいいけど、
普通はseleniumの出番じゃないかな。
結果表示のelementが表示されるまで待って、そのあとselectorを使って読み取る。
145デフォルトの名無しさん
垢版 |
2020/01/11(土) 18:57:41.73ID:8SjMRVd0
wxpythonのcomboboxを連携させる場合ってどうやればいいんですかね?
gyou = ('あ行','か行','さ行')
a = ('あたい,'いか','うなぎ','えのぐ,'おもいで')
k = ('かみなり','きなこ','くまで','けむし','こたつ')
s = ('さしみ','しらす','するめ','めまい','もも')
のリストを作り、
combobox_1 = wx.Combobox(panel1, -1, choices = '行',style=wx.CB_DROPDOWN, pos=(0, 390),size=(150, 20))
で選択された値をcombobox_2に反映させたいのですが、うまくいきません
146デフォルトの名無しさん
垢版 |
2020/01/11(土) 19:07:58.90ID:l/QLWHKH
http://wxpython-users.1045709.n5.nabble.com/Updating-a-wx-ComboBox-list-s-contents-td2347790.html
147デフォルトの名無しさん
垢版 |
2020/01/11(土) 19:12:33.28ID:l/QLWHKH
https://www.python-izm.com/gui/wxpython/wxpython_combobox/
148デフォルトの名無しさん
垢版 |
2020/01/11(土) 21:39:28.93ID:8SjMRVd0
>>146
>>147
ありがとうございます。
理解できるようがんばります。
149デフォルトの名無しさん
垢版 |
2020/01/11(土) 22:10:14.08ID:mXX0vnIh
全体の質問スレがなかったのでここに質問します
私はWebサービス作れたら面白いな程度に考えています。そこで質問があります。いきなりPythonで大丈夫でしょうか?基盤となる他の言語があるのでしょうか?また、Webサービスを作れるものなのでしょうか?具体例ではTwitterなど超有名なものが出されるので…
2020/01/11(土) 22:18:24.21ID:IeHCZeyd
型ヒントつけまくったら速度って向上すんのかな
あくまで可読性の問題?
151デフォルトの名無しさん
垢版 |
2020/01/11(土) 22:20:37.40ID:mXX0vnIh
これくだすれってコードすれですかね?
でしたら上のやつ無視してくださいすみません
152デフォルトの名無しさん
垢版 |
2020/01/11(土) 22:31:40.00ID:tdQ2h9sk
くだすれって何なの?
意味がわからん
2020/01/11(土) 22:56:40.09ID:cnAODivo
>>150
type hintは基本的に3rd partyのtype checker用なので
何もせずに速度が向上したりはしない

型をチェックして適切な実装を選択することで実行速度が変わるようなロジックを自分で作ったり
そういうライブラリを使えばhint無しよりは速度が向上する可能性はなきにしもあらず

3.7より前のバージョンはtype hintをコードの読み込み時に評価するので
評価コストの分だけtype hintがあると読み込みが遅い(らしいが、気にしたことはない)
154デフォルトの名無しさん
垢版 |
2020/01/11(土) 22:57:26.01ID:/PybViq/
>>149
WebサービスはWebの知識があればPythonとPythonのフレームワークで構築できます
155デフォルトの名無しさん
垢版 |
2020/01/11(土) 23:10:13.39ID:mXX0vnIh
>>154
ありがとうございます!Webの知識もないプログラム初心者なのでHTML・CSSを学んでから、または学びつつPythonを勉強しようと思います!
2020/01/11(土) 23:16:15.67ID:cnAODivo
Webの知識にはHTML/CSSだでなく
HTTP, JavaScript(初級)/DOM, 各種ブラウザの開発ツール使い方
くらいは含まれてると思われる

サーバーサイドはパフォーマンス気にしなければPythonだけでほぼなんでもできるが
モバイルアプリやリッチなWebクライアントはPythonだけでは作れない
157デフォルトの名無しさん
垢版 |
2020/01/11(土) 23:22:24.84ID:mXX0vnIh
>>156
私にはまだ早い領域のようですね…
教えて下さった言語含めもうちょっと調べてみます
ありがとうございます!
2020/01/11(土) 23:32:59.83ID:IeHCZeyd
>>153
やっぱそうなんだ
コンパイルしてるわけじゃないしな
2020/01/12(日) 01:21:03.35ID:PW2KE/yt
>>143-144
Ruby, selenium webdriver, headless モードで、38 Mbps

sleep 45 が無いと、すぐに、0 が取得されてしまう!
つまり、このdiv が、最初から存在していて、0になっているのだろう。
<div class="speed-results-container succeeded" id="speed-value">0</div>

理想的には、結果が出たときに現れる、要素を待つのが良い。
その方が、sleep で時間指定しないで済むから

require "selenium-webdriver"

options = Selenium::WebDriver::Chrome::Options.new

options.add_argument('--headless')
options.add_argument('--disable-gpu')

driver = Selenium::WebDriver.for :chrome, options: options
driver.manage.timeouts.implicit_wait = 60 # 要素の検索の timeout

driver.navigate.to "https://fast.com/ja/";

sleep 45

puts driver.find_element( :id, "speed-value" ).text

driver.quit
2020/01/12(日) 03:20:28.12ID:M8sF3s6B
>>159
capybara使えよ
implicit_wait=60とかsleep 45とかありえんてぃ
先週のWebDriverWaitを10回くらい繰り返してるクソコードよりもひどいぞ

>>143
fast.com cliでググれ
2020/01/12(日) 03:26:40.80ID:8P2rssJG
次のプロジェクトを何の言語でやるか、検討した結果PHP派とPython派に分かれた。
Rubyはみんな嫌がった。
162デフォルトの名無しさん
垢版 |
2020/01/12(日) 03:27:02.71ID:aGAZplX2
>>143
ありがとうございます。
Python通ってないので参考になります。

>>159

>>160
cliあったんですね!
Macのcrontabだとスリープ時に実行できないので
サーバー化してるRaspberryでcrontab回そうと思います。
助かりました。
ありがとうございます。
2020/01/12(日) 10:35:42.78ID:eDYJZWaK
データフレームで
target shape
1 0
0 1
1 1

としたときtarget==shapeのデータをスライスとして取り出したいのですが、
同一データフレーム内のデータを比較してスライスするにはどうすれば良いのでしょう?
164デフォルトの名無しさん
垢版 |
2020/01/12(日) 11:16:34.31ID:/bwylFW9
df[df[‘target’]==df[‘shape’]]
または
df.query(‘target==shape’)
2020/01/12(日) 12:31:28.08ID:eDYJZWaK
>>164
ありがとうございます。
Pandasのスライスの表記難しい・・・。
使いこなせる自身がないんですが、やってるうちになれてくるものなのか・・・。
2020/01/12(日) 12:34:18.40ID:eDYJZWaK
a=Fale, b=True
だけをスライスしたいのですが、

df_correct = df[df['a'] == False & (df['b']==True)]

とすると

a==False

の条件でスライスされ

b==True

が無視されます。
なぜなんでしょう?
2020/01/12(日) 12:35:45.17ID:eDYJZWaK
>>166
失礼しました。
自分の投稿みて気づきました。
前の条件を()でくくっていなかったですね。
orz
2020/01/12(日) 13:20:04.86ID:eDYJZWaK
>>164
queryなんてあったんですね
昔accessやってたものとしてはquery使ったほうが可読性高いな。
2020/01/12(日) 13:20:54.36ID:eDYJZWaK
>>164
python的には内包表記とqueryではどちらが推奨なんでしょうか?
2020/01/12(日) 13:48:50.66ID:AzrAZmp9
python 3 で16進数文字列をutf-8文字列に変えたいんですが、簡単な方法ないですか?
2020/01/12(日) 14:24:18.86ID:M8sF3s6B
>>170

>>111と同じなのか違うのか?
違うのなら簡単な方法じゃなくめんどくさい方法でどうやってるのかをまず書いて
2020/01/12(日) 15:47:52.03ID:iU1LDXiT
いつのまにかインデントが崩れて正常に動作しなくなってた
でも中括弧がないので元の状態が分からない
元に戻せない
173デフォルトの名無しさん
垢版 |
2020/01/12(日) 19:12:52.42ID:N3Z2zUK8
import binascii
print('あ'.encode('utf-8'))
print(binascii.a2b_hex('e38182'))
print(binascii.a2b_hex('e38182').decode('utf-8'))
174デフォルトの名無しさん
垢版 |
2020/01/12(日) 20:02:34.80ID:7XI25yF1
>>172
ワロタwwwwww
175159
垢版 |
2020/01/12(日) 20:18:51.94ID:PW2KE/yt
>>160
<div class="speed-results-container succeeded" id="speed-value">0</div>

この要素は、sleep 45 が無いと、すぐに、0 が取得されてしまう!
つまり、このdiv が、最初から存在していて、0になっているのだろう

このサイトを1分ぐらい見てると、数値が動くだろ

たぶん、1分ぐらい掛けて、何回も非同期処理で、この値を書き換えている。
だから、1分近く待たないと、速度が安定しない
176デフォルトの名無しさん
垢版 |
2020/01/12(日) 20:56:59.94ID:UO120eKA
お金を計算するわけでもないのですが
小数点の計算に全部decimalつけるの面倒なんですけど
何とかならないですか?
2020/01/12(日) 21:09:49.97ID:M8sF3s6B
>>175
「0 が取得されてしまう!」じゃねーよ
もうちょっと頭つかってくれ

速度が安定するまで待ちたいなら
「wait until 速度が安定?」みたいなコードを書けばいいだけだろ

測定完了を示す状態変化があるのに
わざわざ速度が安定したかどうかで判定する必要もないんだけどさ
178159
垢版 |
2020/01/12(日) 21:32:01.79ID:PW2KE/yt
他人のサイトをデバッグ・解析して、測定完了を示す状態を見つけるとか、それは大変!

仕様書もないのに、できない。
そういう解析を仕事としては色々やってきたけど、面倒
2020/01/12(日) 21:59:15.48ID:LmjMg5d7
rubyくん
ID変え忘れてるよ
2020/01/12(日) 23:01:37.62ID:aXgbqZV+
こんにちは質問させてください。

20190112, A, 91
20190112, B, 82
20190111, A, 93

という感じで[日付,名前, 得点]の3カラムのデータがあり、各行の日付段階での、
その人の過去30日平均得点(人別の得点の移動平均)をできるだけ高速に計算したいのですが、
どのようにすればよいでしょうか?
なお、今はsqliteで、以下のような原始的なプログラムを書いてみましたが、遅くて困っております。

# date, nameの組み合わせを抜き出し
list = cur.execute('select date, name from table').fetchall

# listすべてにfor文で処理
for i in range(len(list)):
date = list[i][0]
name = list[i][1]

# dateから30日前の日付を計算
date30before (計算略)

# nameが一致しているそのデータから過去30日分のスコアを抜き出し
scoreList = cur.execute('select score from table where name == ? and ? < date < ?',(date30before, date)).fetchall

# 抜き出した30日分のスコアを平均
scoreListAve(計算略)

# 元のテーブルのdate, nameが一致する行に書き込み
cur.execute('update table set score30Ave = ? where date = ? and name == ?'),(scoreListAve, date, name))

con.commit() # for後、コミット
2020/01/12(日) 23:44:09.77ID:8exfRg1S
少なくともSELECT文はfor文で回す必要がないように見える
ウィンドウ関数とか使って、1回のSELECT文けで、その後のUPDATE文の条件として使いたいscoreListAve, date, nameを抽出出来るはず
182180
垢版 |
2020/01/12(日) 23:53:05.86ID:aXgbqZV+
>181
ウインドウ関数を知らないので調べてみます。
ありがとうございます。
2020/01/13(月) 01:51:12.33ID:6QaMEdT1
where の条件に、日付・名前があって、
それらに索引インデックスが付いていないのなら、絞り込めず、全探索になるから!

例えば、100万レコードあれば、それらをすべて検索してから、チェックするから!

基本的には、検索条件に索引インデックスが付いていないものは、全探索になるから検索しない!

情報処理資格のデータベーススペシャリストの教科書で、
データベースの設計を勉強すべし!
184180
垢版 |
2020/01/13(月) 02:43:19.89ID:wBE7Qmaa
>183
助言ありがとうございます。
書き忘れましたがname, dateのIndexはすでに作ってます。

cur.execute('create index dateIndex on table(date)')

Indexでだいぶましになったのですが、それでも現状、
forが100進むのに1秒くらいなので、20万レコードで30分くらいかかります。
2020/01/13(月) 04:48:03.15ID:nfiKoGl1
歯抜け無しならWindow関数で
歯抜け有りなら相関サブクエリで

― Window関数 ―
SELECT date, name, score, avg(score) OVER (
PARTITION BY name ORDER BY date ROWS BETWEEN 29 PRECEDING AND CURRENT ROW
) AS moving_avg
FROM score_table
ORDER BY name;
2020/01/13(月) 04:59:38.72ID:nfiKoGl1
相関サブクエリのほうはブロックされたからここに貼っとく
https://ideone.com/73jaTZ
187180
垢版 |
2020/01/13(月) 05:49:10.94ID:wBE7Qmaa
>185
大変ありがとうございます。
歯抜け有りなので相関サブクエリの方をまず試してみます。
ここまで見本のコードを書いていただければ自分のレベルでも
なんとか取り入れられそうです。
2020/01/13(月) 09:52:19.26ID:kwqyPibM
>>187
歯抜けありでもwidow関数で書けるぞ。
相関サブクエリなんて過去の技術を使うな。
2020/01/13(月) 09:57:49.58ID:Co2mHaqk
>>180のコードでメモリが足りているならsqlをどうこうする必要はないと思うが。
2020/01/13(月) 10:30:58.73ID:BvowWoiX
1回のクエリで行けるところを、わざわざループでクエリ投げまくる意味はないでしょ
2020/01/13(月) 10:58:18.23ID:bfpXOE5X
クエリが苦手でPythoに慣れているなら意味はある
クエリは言語としては非常に特殊だからね
常用しない人にはとっつきづらい
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況