Pythonのお勉強 Part73

レス数が1000を超えています。これ以上書き込みはできません。
1デフォルトの名無しさん (ワッチョイ f610-G7il)
垢版 |
2024/06/06(木) 08:48:10.07ID:DsazphEm0
!extend:default:vvvvv:1000:1024
!extend:default:vvvvv:1000:1024
↑スレ立てる毎に減るので、減ってたら3つに補充すること。

・当スレにRubyのソースコード類を書くことを禁ず
・Ruby等、Pythonではないプログラミング言語での回答類・質問を書くのも禁止
・「Ruby では」「Rubyでは」「Rails」正規表現→「^クソチョンw$」をNGワード登録推奨
・エラーを解決したいときは、かならず
エラー文(勝手に省略orスクショうp等の横着禁止)と
おま環(Pythonのバージョン番号+OS名とバージョン+IDE名)を書け。

※前スレ
Pythonのお勉強 Part72
https://mevius.5ch.net/test/read.cgi/tech/1703659345/
VIPQ2_EXTDAT: default:vvvvv:1000:512:: EXT was configured
933デフォルトの名無しさん (ワッチョイ f9bf-BHET)
垢版 |
2024/09/13(金) 23:50:13.06ID:3+j4DpP00
>>932
一般的には重い処理
とはいっても、小さな量だと問題にならない
例えば画像処理の分野で、HDや4Kサイズの画像を1000枚処理したいといった話だと、メモリを毎回確保するか一度だけ確保したものを使い回すかで処理時間はだいぶ変わる (体感できるくらいに)
2024/09/13(金) 23:57:27.00ID:jtrlU5c10
なるほどー
Cの時点でmallocが具体的に何してるか知らんしな
既に連続した空き容量があって割り当てるだけなら一瞬だろうけど、
いろいろ地上げしたり大変なんだろう
2024/09/14(土) 00:15:53.13ID:ed1VLorT0
まとまった容量ならsbrk()使えって言われなかった?
2024/09/14(土) 00:43:58.26ID:uwwiah/a0
メモリ確保はO(n)でソートは下手したらO(n^2)だから、
nが大きいほどトータル処理時間に占めるメモリ確保の割合はむしろ小さくなるのでは
2024/09/14(土) 02:05:41.53ID:xMffrK+40
>>936
その2つのnは全く別のものだろ
アホか
2024/09/14(土) 06:27:04.06ID:uwwiah/a0
nが小さい場合:
メモリ確保の比率は大きいけどどうせ一瞬だから気にしない
nが大きい場合:
メモリ確保にも時間かかるけど、ソート時間が圧倒的だから気にしない

結局、気分の問題だけど、
破壊的な操作が嫌とか言ったらappend()とかできないし、
ミュータブルはそういうものと思うしか
939デフォルトの名無しさん (ワッチョイ f99f-BHET)
垢版 |
2024/09/14(土) 07:44:59.11ID:c0KErmyP0
ソートのコストとメモリ確保のコストは別々にかかるものだし、減らせるなら減らした方が良いと思う
自分のプログラムが扱うデータが小さくてsortedでもほぼ変わらないなら、こちらでも良い
自分も書き方自体は sorted の方が好きだし小さいプログラムならこちらを使ってるけど、そこは好みの問題なのでお好みで
940デフォルトの名無しさん (アウアウエー Sa52-t/33)
垢版 |
2024/09/14(土) 13:33:03.30ID:o3f0Ddoea
l.sort() はみみっちい領域でやりくりする分アルゴリズムは遅くなりそう
l = sorted(l) あるいは k = sorted(l) が富豪的で結果的に速い可能性はある
2024/09/14(土) 14:16:06.35ID:tQni2TQM0
メモリ使いまくりはキャッシュ効率下がるから
一律に富豪が強いとは限らない
使うしかない時は強いけど
2024/09/14(土) 14:50:34.43ID:aiF3uBwH0
>>940
可能性無いよ
sorted()は内部でlist.sort()の実装を呼び出してる

ざっくり言えば
new_list = list(original_list)
new_list.sort()
return new_list
2024/09/14(土) 16:15:00.42ID:uwwiah/a0
for item in sorted(l):
とやるよりも
l.sort()
for item in l:
の方が速い、みたいな話

明示的にしろ暗黙にしろ、オブジェクトのコピーにいちいち気を使いたくない
コピーするだけで時間がかかるようなオブジェクトになりそうなら、
最初からそうならない実装にする
2024/09/14(土) 19:29:07.00ID:WN+ppFgMr
seleniumのxpathについて質問です
5chの書き込み欄のxpathを確認し、
driver.find_element(By.XPATH, '//*[@id="js-postform_message"]').click()
と書いたのですが、プログラムを実行するとxpathが存在しないパターンの動作をしてしまいます
ブラウザでF12キーを押し、書き込み欄をクリックしてxpathをコピーするというよくある方法を使っているのですが、これではダメなんですかね?
2024/09/14(土) 19:38:44.99ID:uwwiah/a0
driver.page_source を保存しておいて解析する
2024/09/14(土) 19:50:56.07ID:uwwiah/a0
書き込みボタンは
//*[@id="js-postform_submit"]
で、
//*[@id="js-postform_message"]
は書き込み欄なので、clickではなくsend_keys
2024/09/14(土) 20:01:37.67ID:reS5hF+Mr
ありがとうございます
send_keysは別の行にあります
一応clickの部分は行ごと消しましたがやはりダメですね…
2024/09/14(土) 20:51:28.72ID:reS5hF+Mr
エラーをちゃんと見られるようにしたら、
name 'By' is not defined
と出ました
また要素関係の書き方が変わったんですかね?
以前は上記の
driver.find_element(By.XPATH, '//*[@id="js-postform_message"]')
という書き方で動いていたのですが…
書き方変更などの情報はどこで入手するのか…
2024/09/14(土) 20:56:59.72ID:hpW9Sln40
from selenium.webdriver.common.by import By
2024/09/14(土) 20:58:25.69ID:reS5hF+Mr
>>949
ありがとうございます!解決しました!
それをコメントアウトしてしまっていました…
2024/09/16(月) 15:32:29.19ID:JFhhEPMwd
pandasやべえな
マジで融通効かねえ
おなえらよくこんなもん使ってるな
2024/09/16(月) 15:33:30.66ID:JFhhEPMwd
pandasに持っていくのは最終工程だな
2024/09/16(月) 15:45:45.85ID:5ZHFYrcP0
df.loc('name')
じゃなくて
df.loc['name']
なのが中身どうなってんのと思う

これはプロパティだからと言われてそんなもんかと思ってたけど、
別に角括弧はプロパティの特徴じゃないし
2024/09/16(月) 16:18:34.31ID:64X1rAF60
df.locが返すインスタンスに__getitem__が定義されてる
955デフォルトの名無しさん (ワッチョイ 57b4-18DD)
垢版 |
2024/09/16(月) 17:26:32.35ID:oHCpo/jD0
>>951
そう?
融通効かない処理は普通にリストとかに変換したり、iterrowsしたりすれば大体できて、
95%のやりたいことのほとんどはpandasで用意されてるメソッド・関数でできる気がするけど
2024/09/16(月) 18:17:47.48ID:qB1csSl90
pandas使う職業って何?
バックエンドエンジニアとか?
2024/09/16(月) 18:46:53.38ID:7NWwbbi+0
学生です
2024/09/16(月) 19:14:36.94ID:sHL0iTWh0
かぐる
とかデータサイエンス
2024/09/16(月) 19:40:30.88ID:5ZHFYrcP0
データ渡すと加工して文字列にしてくれる関数名
make, create, generate どれがいいだろう
2024/09/16(月) 19:52:09.23ID:7NWwbbi+0
それら候補でいうならどれでもよくって
どういう文字列を生成するか説明できる修飾が大事かな
2024/09/17(火) 09:30:50.73ID:mIyBA525d
同意
むしろ俺なら動詞なしで「どういった文字列か」を表す名詞だけにしたい
962デフォルトの名無しさん (アウアウエー Sadf-N1Zj)
垢版 |
2024/09/17(火) 10:19:17.42ID:TMGdiCOOa
>>959
convert
963デフォルトの名無しさん (アウアウエー Sadf-N1Zj)
垢版 |
2024/09/17(火) 10:20:30.50ID:TMGdiCOOa
>>951
Pandasは行指向じゃなくて列指向だと判ればあとは簡単
964デフォルトの名無しさん (アウアウエー Sadf-N1Zj)
垢版 |
2024/09/17(火) 10:23:43.89ID:TMGdiCOOa
>>943
>明示的にしろ暗黙にしろ、オブジェクトのコピーにいちいち気を使いたくない
>コピーするだけで時間がかかるようなオブジェクトになりそうなら、
>最初からそうならない実装にする

まあこれは真実で
それならオブジェクトを保持するためのオブジェクトと
ソートするためだけのインデックスを分けるかな
2024/09/17(火) 10:55:41.47ID:rwC9vNLN0
pandasはもう古いよ
polarsがついにv1公開されたからそれに移行した
loc["name"]みたいなのも消えてる
というよりインデックスというゴミが消えてる
966デフォルトの名無しさん (ワッチョイ ff32-uXkv)
垢版 |
2024/09/17(火) 10:56:23.24ID:bvtQXCJ00
複数のエクセルファイルから特定列のデータを抜き出して
新たにエクセルファイルにまとめて書き出すということをしたのですが、
複数ファイルには重複する行が含まれていて、
下記の2つを試したのですがどちらも欠損データが生じました。

1.listに一旦全部入れて、最終的にsetに一旦変換してlistに戻す
2.1行ごとに最終的なリストに含まれていない要素をチェックしながら追加

データは5列で最終的に重複処理したもので300行程度、
重複処理前でも2000行余りぐらいのデータです。
最終的にpandasで全部一旦追加した後df.drop_duplicates()にて処理して問題なく処理されたのですが
下記の方法で欠損することとかあり得るのでしょうか?
2024/09/17(火) 12:11:47.72ID:rwC9vNLN0
>>959
data2str
2024/09/17(火) 12:16:27.92ID:rwC9vNLN0
>>966
各列をそれぞれlistにしてsetにしたのか?
それだと各列ごとに重複削除するから行レベルでは重複してないものも消えそうだが
969デフォルトの名無しさん (ワッチョイ ff32-uXkv)
垢版 |
2024/09/17(火) 13:30:30.55ID:bvtQXCJ00
>>968
1,2とも各行””.joiin(list)してから処理しています。
2024/09/17(火) 14:23:18.11ID:5SGUmRCR0
>>962
処理内容はconvertだけど、目的語が元データになってしまう
convert_to_newdata
にしないと、
convert_newdata
だと絶対間違う
2024/09/17(火) 14:53:19.06ID:ifJb33l00
>>969
["1", "", "2", "", "3"]と["1", "2", "3", "", ""]は重複?
とりあえずtuple(list)してから処理してみれば?
2024/09/17(火) 14:58:45.05ID:ifJb33l00
>>967
こういう命名をするとよくわかるように「データ渡すと加工して文字列にしてくれる関数名」というふわっとした問題設定がそもそも間違ってる可能性が高い
2024/09/17(火) 15:55:41.11ID:bvtQXCJ00
>>971
基本空白は入っていないので["1", "2", “3”]の形式になりますが
元がexcelなのでデータを見ると何かが混じっている可能性はありますね
少し余裕が出たら検証してみます
2024/09/17(火) 16:40:41.16ID:5SGUmRCR0
人間用excelを読み込むと全然ちゃんとしてないので、
全セルを配列に読み込んで、文字列検索でタイトル行を探して、
データ範囲らしき部分を割り出して、それでもエラーは出るのでいろんなケースに対応して、
みたいなひたすら泥臭いコードになる
取り消し線で削除するのやめて
975デフォルトの名無しさん (ワッチョイ ff32-uXkv)
垢版 |
2024/09/17(火) 18:07:41.72ID:bvtQXCJ00
上の方でpolarsを知ったので、ちょっと試してたのですがやり方がわかりません。
2つのDFを比較して、A,B列の値が共通の場合新しい方のDFの行を使ってDFを作成するということがやりたいです。

以下のpandasの処理をpolarsでやりたいときどのようにしたら良いんでしょう?

filtered_df = dfOLD[~(dfOLD[“A”].isin(dfNEW[“A”]) & dfOLD[“B”].isin(dfNEW[“B”]))]
concat_df = pd.concat([dfNEW, filtered_df], axis=0, ignore_index=True)
2024/09/17(火) 18:29:39.94ID:ifJb33l00
>>973
空白は一つの例だよ
他にもtuple(list)で比較するのと"".join(list)で比較するのでは結果が異なるケースあるでしょ

それに今現在処理してるデータにそういうケースが含まれてるかどうかを調べるよりも
まずは要求仕様として列を連結した文字列が同じなら重複としてみなすのかどうかが大事

みなす仕様ならdf.drop_duplicates()を使うのは間違ってる
みなさない仕様なら"".join(list)で比較するのは間違ってる
2024/09/18(水) 05:40:32.41ID:X/am8lpR0
>>956
飼育員とか
2024/09/18(水) 10:09:46.84ID:cY7mpOqC0
自己レスです。意外とあっさり出来ました。> 975
import polars as pl
df1 = pl.DataFrame({"a": ['A1','A2','A3','A4'], "b": ['B1', 'B2', 'B3', 'B4'], "c": ['100', '200', '300', '400']})
df2 = pl.DataFrame({"a": ['A1','A2','A3'], "b": ['B1', 'B2', 'B3'], "c": ['150', '250', '350']})
filterDF = df1.join(df2, on=['a','b'], how="anti")
concatDF = pl.concat([df2, filterDF])
print(filterDF,concatDF)
2024/09/18(水) 19:08:32.27ID:6/+t/jhb0
単位の数Uがあって、nとUに対して
int(n/U)*U
を返す関数はどういう名前がいいだろう
2024/09/18(水) 20:05:30.82ID:EisHWYAH0
floor/round_down/align + (to +) unit/multiple
2024/09/18(水) 20:09:46.82ID:pnKtz9DD0
discretizeとか?
2024/09/18(水) 21:47:38.42ID:pnKtz9DD0
音楽ソフトなんかでは
拍子の位置に揃えるのを
quantizeって言うな
2024/09/18(水) 22:23:17.78ID:9wk3LXWe0
n//U*Uと(n+U-1)//U*Uが区別できる命名にしたいね
984デフォルトの名無しさん (ワッチョイ 577c-18DD)
垢版 |
2024/09/19(木) 18:45:28.76ID:WvuWfkM50
>>979
普通はtruncateじゃない?SQLにTRUNC関数がある
2024/09/19(木) 19:05:10.19ID:Cti+u+u60
MATLABのfloor(x, unit)と同じだからfloorだろう
2024/09/19(木) 19:26:31.64ID:dEupb3oa0
floorか
整数へのfloorはunit=1の特殊ケース
2024/09/19(木) 19:34:49.21ID:bCkvflxL0
整数化のfloorが有名過ぎて
混同の可能性ない?
2024/09/19(木) 23:17:36.39ID:Fum1rv8F0
関数の命名は内部実装がどうなってるかではなく
どういう意図でその関数を呼ぶのかという観点を第一とすべき

そのための第一歩は自然言語で意図を記述すること
それができてないうちは適切な命名とか無理
2024/09/20(金) 11:26:49.09ID:ZOd0SPdka
appendとかaddとかpushとか滅茶苦茶
2024/09/20(金) 11:52:25.51ID:L1lWeffx0
strだとreplaceでreだとsubなのやめて欲しい
2024/09/20(金) 11:58:37.64ID:kOrYHKy20
>>988
趣味でやってる人は仕様とかテストに縁がないからそういう感覚がたぶん分からないんだよ
992デフォルトの名無しさん (ワッチョイ 577c-18DD)
垢版 |
2024/09/20(金) 13:09:25.28ID:60VyqBLX0
>>985-987
数学的には、floorとかceilとかはunit=1のことしか指さない関数(というか、ℝ→ℤでそもそも定義域と値域の集合が異なるともいえる)なんだよねえ。この辺をどう見るか。
Python風に言えば、int(float_val)と、math.floor(float_val)は型が違うでしょう?という

ただ、>>988 のいっているように、これらは、絶対に考慮しなければならないことではなく、文脈依存だと思う。

https://ja.m.wikipedia.org/wiki/床関数と天井関数
2024/09/20(金) 13:16:40.50ID:opX5hmp20
>>979
単位変換くん2
2024/09/20(金) 13:19:35.67ID:L1lWeffx0
return int(n/unit)*unit
とすると、unitをintで与えるとintで返って、
floatで与えるとfloatで返る

直線を階段状に変換する図としては相似で、
階段の高さが1なのかそれ以外なのか
1以外だとして整数である必要もなく、有理数への自然な拡張に見える
995デフォルトの名無しさん (アウアウエー Sadf-N1Zj)
垢版 |
2024/09/20(金) 14:17:35.31ID:ZOd0SPdka
>>994
>return int(n/unit)*unit
>とすると、unitをintで与えるとintで返って、
>floatで与えるとfloatで返る

return int(float(n)/unit)*unit
って描いた方が良いよ
2024/09/20(金) 15:38:24.41ID:FmKVvlRa0
pandasのto_excelってopenpyxlを使ってるんだな
2024/09/20(金) 15:58:36.50ID:L1lWeffx0
openpyxlの遅さは実用にならないレベル
テスト用の小さいファイルでも普通に遅い
本番の大きなファイルだと数時間単位かかる
2024/09/20(金) 16:09:16.36ID:O/CsEend0
大きなファイルって何万行ぐらいあんの?
2024/09/21(土) 06:41:17.65ID:webYnJz00
エクセル作業の自動化でpythonでプログラム書いて完成はしたんだけど、書き込みが遅すぎる。
普通に手動でエクセル開いて書き込んで閉じた方が早いレベル。
マクロ含んでるからopenpyxlを使わないとダメだし、調べたらwrite_onlyモードにすると早いってあったけど、あれって新規でブック作る為のやつだよね。
何かいいのないのかしら。
2024/09/21(土) 08:47:29.73ID:yFilHDZF0
Excelのない環境で動作させんじゃなきゃ
ネイティブのスクリプト(TypeScript)使うのが素直
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 106日 23時間 59分 20秒
レス数が1000を超えています。これ以上書き込みはできません。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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