「len」を含む日記 RSS

はてなキーワード: lenとは

2024-10-12

清原ネットキャッシュ比率決算短信からpython自動で求めるソフト

気が付くと朝4時になっていた。

なんか動くところまで出来たので貼っておく。

NYSLなので、バグがあったら治しといて。

import pdfplumber
import re

#クリーンアップ
def cleanuptext(text):
    #決算書の合計値を太字にしたことpdfplumberが暴走するケースへの対処
    #例 流動資産 -> 流流流流流動動動動動資資資資資産産産産産
    #誤爆が怖いので、これが起きている時だけ補正します
    if "流流流流流動動動動動資資資資資産産産産産" in text:
        text = re.sub(r'(.)92;1{4,}', r'92;1', text)

    #△をマイナスに。 数字中のカンマを消して結合する
    text = re.sub(r'△([0-9])', r'-92;1', text)
    text = re.sub(r'▲([0-9])', r'-92;1', text)
    text = re.sub(r'([0-9]),([0-9])', r'92;192;2', text)
    
    #たまに、煽り屋みたいに文字の後にスペースが入る嫌がらせ修正する
    #例: 投 資 有 価 証 券 -> 投資有価証券
    text = re.sub(r'(?<=[92;u4E00-92;u9FFF92;u3040-92;u30FF])92;s(?=[92;u4E00-92;u9FFF92;u3040-92;u30FF])', '', text)

    return text

#今期の勘定科目数字を取得
def get_AccountName(text, need):
    pattern = rf'^{need} -?[0-9]+ (-?[0-9]+)'
    r = re.search(pattern, text, re.MULTILINE)
    if r is not None:
        return float(r[1])

    return 0

#清原ネットキャッシュ計算する。
def calc_KiyoharaNetCash(text):
    total_current_assets = get_AccountName(text,'流動資産合計')
    if total_current_assets == 0:
        #要約財政状態計算書しか公開していない、楽天のような素敵な会社様への対処
        total_assets = get_AccountName(text,'資産合計')
        if total_assets != 0:
            #とりあえず、資産の部の6割を流動資産とみなす
            total_current_assets = total_assets * 0.6

        else:
            #流動資産合計ではなく、流動資産という単語を使っている我が道を行く東北電力への対処
            total_current_assets = get_AccountName(text,'流動資産')
            if total_current_assets == 0:
                raise Exception("流動資産合計の勘定科目が見つかりませんでした。"+text)


    total_liabilities = get_AccountName(text,'負債合計')
    if total_liabilities == 0:

        #負債合計ではなく、負債の部合計に拘るオムロンの嬉しい決算書への対策。なんでや・・・
        total_liabilities = get_AccountName(text,'負債の部合計')
        if total_liabilities == 0:
            raise Exception("負債合計の勘定科目が見つかりませんでした。"+text)

    #負債をご丁寧にマイナス表記で書いてくれる中外製薬の親切な決算書への対策。いい加減にしろ・・・
    if total_liabilities < 0:
        total_liabilities = total_liabilities * -1

    #投資有価証券はないこともあるので、0を容認する
    marketable_securities = get_AccountName(text,'投資有価証券')

    #print(total_current_assets,marketable_securities,total_liabilities)
    netcash = total_current_assets + (marketable_securities*0.7) - total_liabilities

    #たまに単位を1000円にしている銘柄があるので補正する
    if is_tanni_senyen(text):
        netcash = netcash / 1000
    return netcash

# "流動資産合計" と "負債合計" の間に "単位:千円" があるかをチェック
def is_tanni_senyen(text):
    if "単位:千円" in text:
        return True

    if "単位: 千円" in text:
        return True

    if "単位 : 千円" in text:
        return True

    if "単位 :千円" in text:
        return True

    return False

def pdf_to_kiyohara_netcash(pdfpath):
    with pdfplumber.open(pdfpath) as pdf:
        text = ''.join(page.extract_text() for page in pdf.pages)

    text = cleanuptext(text)
    #print(text)
    kiyohara_netcash = calc_KiyoharaNetCash(text)
    #print(kiyohara_netcash)
    return kiyohara_netcash

def mymain():
    import sys
    args = sys.argv
    argc = len(args)
    if argc <= 1:
       print('''
これは、清原達郎氏のネットキャッシュ比率(以下、清原ネットキャッシュ比率)を決算短信pdfから求めるソフトです。
清原ネットキャッシュ=流動資産合計+(投資有価証券*0.7)-負債合計
清原ネットキャッシュ比率=清原ネットキャッシュ/時価総額*100

遊び方

1. 決算短信pdfから清原ネットキャッシュを求める
python calc_kiyohara_netcash.py 140120240514594985.pdf

結果: 30757.0
決算書には、100万円単位数字が書かれているはずなので、この数字単位は100万円です。
つまり、3075700万円。

2. 時価総額を億円単位で追加することで、清原ネットキャッシュ比率を求める
時価総額が146億円なら146と書いてください。
python calc_kiyohara_netcash.py 140120240514594985.pdf 146

結果: 210.66%

このコードNYSLライセンスです。無保証自己責任ですが、ご自由に。
かぶ探とかとつなげるといいかもね。
       ''')
       return
    if argc <= 2:
       kiyohara_netcash = pdf_to_kiyohara_netcash(args[1])
       print(kiyohara_netcash)
       return
    if argc <= 3:
       market_cap=float(args[2])*100 #億円から百万円表記に
       kiyohara_netcash = pdf_to_kiyohara_netcash(args[1])
       ratio = round(kiyohara_netcash/market_cap*100,2)
       print(f"{ratio}%")
       return

if __name__ == '__main__':
    mymain()

2024-05-24

anond:20240523100428

ダブスタ検証用のスクリプト簡単に書いたよ(AIで)

import requests
import json
from urllib.parse import quote

def fetch_bookmarks(url):
    try:
        # URLエスケープ
        escaped_url = quote(url, safe="")
        api_url = f"https://b.hatena.ne.jp/entry/json/?url={escaped_url}"

        response = requests.get(api_url)
        response.raise_for_status()

        try:
            return response.json()
        except json.decoder.JSONDecodeError as e:
            print(f"Error decoding JSON from {api_url}: {e}")
            print("Response content:", response.text)
            return []
    except requests.exceptions.RequestException as e:
        print(f"Error fetching bookmarks from {api_url}: {e}")
        return []

def find_common_bookmarks(bookmarks1, bookmarks2, url1, url2):
    common_users = set(bm["user"] for bm in bookmarks1 if bm["comment"]) & set(bm["user"] for bm in bookmarks2 if bm["comment"])
    common_bookmarks = []
    for user in common_users:
        comments = []
        for bm in bookmarks1:
            if bm["user"] == user and bm["comment"]:
                comments.append({"url": url1, "comment": bm["comment"], "timestamp": bm["timestamp"]})
                break
        for bm in bookmarks2:
            if bm["user"] == user and bm["comment"]:
                comments.append({"url": url2, "comment": bm["comment"], "timestamp": bm["timestamp"]})
                break
        if len(comments) == 2:
            common_bookmarks.append({"user": user, "comments": comments})
    return common_bookmarks

if __name__ == "__main__":
    url1 = "https://news.yahoo.co.jp/articles/f9966c4ccc374fc88babbb50175a9ea844c99638"
    url2 = "https://www.asahi.com/articles/ASN6K7F64N6KUJHB00L.html"

    data1 = fetch_bookmarks(url1)
    data2 = fetch_bookmarks(url2)

    common_bookmarks = find_common_bookmarks(data1["bookmarks"], data2["bookmarks"], url1, url2)

    print(json.dumps(common_bookmarks, indent=2, ensure_ascii=False))

url1, url2のところを対象としたいものに変えれば使えるよ

抽出対象となるのは以下のユーザーだよ

バグあったら直して使ってね

※てかはてな匿名ってシンタックスハイライト記法使えないんだね、使って表示確認したら500エラーになったわ

2024-01-22

ブコメダブスタをチェックするためのスクリプト適当Pythonで書いた

エラーハンドリングは省略。標準ライブラリのみで動く。

import json
import urllib.request


# True にするとユーザー名を隠す
hide_user = False
# 以下を書き換える。sys.argv 使ってもいいんだけど
url1 = "https://www.cygames.co.jp/news/id-23172/"
url2 = "https://mtg60.com/archives/palworlddoujinsi.html"


def get_bookmarks(url: str):
    req = urllib.request.Request(f"https://b.hatena.ne.jp/entry/json/{url}")
    with urllib.request.urlopen(req) as res:
        dict = json.loads(res.read())

    user_comments = {}

    for bookmark in dict["bookmarks"]:
        if bookmark["comment"]:
            user_comments[bookmark["user"]] = bookmark["comment"]

    return user_comments


b1 = get_bookmarks(url1)
b2 = get_bookmarks(url2)

common = set(b1.keys()).intersection(b2.keys())

print(f"[1] {url1}")
print(f"[2] {url2}")
print()

for user in sorted(common):
    if hide_user:
        print(user[0] + "*" * (len(user) - 1))
    else:
        print(user)
    print(f"[1] {b1[user]}")
    print(f"[2] {b2[user]}")
    print()

2024-01-21

エクセルの桁そろえにREPT関数使ってた

=REPT("0",4-LEN(A4))&A4

みたいな感じにして、指定の桁数から文字数を引いて余りを追加するイメージ

例えば、4桁にそろえたくて1桁だとしたら4-1で3つ「0」を追加する

今日知ったのが以下の方法で、

=RIGHT(A1+10000, 4)

1万を足して右から4桁とるという方法

例えば、A1に1があるとしたら10001になって右から4桁、100だとしたら10100になって右から4桁見たいか感じで揃えることができる。10000の部分は揃えたい桁に合わして変更する

2023-12-29

増田納め 2023年のマイ日記集計

こんます

2023年も残すところわずかとなりましたが、皆様方におかれましてはいかがお過ごしでしょうか。

一年間の振り返りなどはされましたでしょうか。

 

私、一年間に書いた増田を振り返ってみましたところ、

2423件の日記を綴っており、

頂いた総ブクマ数は1893、総トラバ数は1060となりました。

これもひとえに皆様方のご支援ご声援のおかげであります

本年も大変お世話になりました。

 

最期に、ポンコツの私がChatGPTの手となり足となり作成した増田集計コード掲載します。

日記URLタイトル投稿日時、文字数、被ブクマ数、被トラバ数を取得しCSVファイルに出力するものです。

お暇な方はお使いください。

 

それではよいお年をお迎えください。

import requests
from bs4 import BeautifulSoup
import time
import csv
import os
import re


# ログインURL
login_url = 'https://hatelabo.jp/login'

# ログイン情報
login_data = {
    'key': 'あなたユーザ名またはメールアドレス',
    'password': 'あなたパスワード',
    'mode': 'enter'
}

user_name = 'あなたユーザ名'

# User-Agent ヘッダー(例:Google Chrome)
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}

# セッションを開始
session = requests.Session()
# ログイン
response = session.post(login_url, data=login_data, headers=headers)
print('login',response.status_code)

# 集計データ
item = {
    'url': '', # URL
    'title': '', # タイトル
    'datetime': '', # 投稿日時
    'characters': '', # 文字数
    'bookmark': '', # 被ブクマ数
    'trackback': '', # 被トラバ数
}

# CSVファイル名
output_file = 'masuda_output.csv'
# CSVファイル存在しない場合はヘッダーを書き込む
if not os.path.exists(output_file):
    with open(output_file, 'w', newline='', encoding='utf-8') as file:
        writer = csv.DictWriter(file, fieldnames=item.keys())
        writer.writeheader()


# 集計
page_start = 1
page_end = 3
for i in range(page_start, page_end+1):
    
    # 待機
    time.sleep(3)

    # 増田一覧取得
    page = session.get(f'https://anond.hatelabo.jp/{user_name}/?page={i}')
    print(page.url)
    
    # 応答のHTMLをBeautifulSoupで解析
    soup = BeautifulSoup(page.content, 'html.parser')
    
    entries = soup.find_all('div', class_='section')
    for entry in entries:
        header = entry.find('h3')

        timestamp = header.find('a').get('href')[1:]
        item['url'] = 'https://anond.hatelabo.jp/'+timestamp
        item['title'] = header.get_text()[:-1]
        item['datetime'] = f"{timestamp[0:4]}/{timestamp[4:6]}/{timestamp[6:8]} {timestamp[8:10]}:{timestamp[10:12]}"

        footersection_text = entry.find_all('p')[-2].get_text()            
        item['characters'] = len(entry.find('p').get_text().strip(footersection_text))
        item['trackback'] = int(re.search(r'92;((.*?)92;)', footersection_text).group(1) if re.search(r'92;((.*?)92;)', footersection_text) else '')
        if item['title'] == '■':
            item['title'] = entry.find('p').get_text().strip(footersection_text)[:35]

        # 待機
        time.sleep(3)

        bookmark_page = session.get(f'https://b.hatena.ne.jp/entry/button/?url=https%3A%2F%2Fanond.hatelabo.jp%2F{timestamp}&layout=basic-label-counter&lang=ja')
        soup_b = BeautifulSoup(bookmark_page.content, 'html.parser')
        item['bookmark'] = int(soup_b.find('a', class_='count').get_text())

        # CSVファイル追記
        with open(output_file, 'a', newline='', encoding='utf-8') as file:
            writer = csv.DictWriter(file, fieldnames=item.keys())
            writer.writerow(item)

追記

わー。ごめんなさい。文字が何か所か変わっていました。

92; → \

& → アンドマーク(打てない←なんで~?)

2023-12-17

プログラミング初心者です。以下のコードの誤りはなんですか

僕はプログラミング歴2週間の初心者です。キーと値を入力できるデータベースを作っています

以下のコードを実行してデータを追加し続けると、一定サイズを超えるとエラーが出てしまうみたいです。

理想は、データが追加された後にサイズが足りなくなったら動的に自動拡大されることです。

もし詳しい人がいたらご教示お願い致します。

import sys
import os
import mmap
import hashlib

def h(x):
    return int(hashlib.sha512(x.encode()).hexdigest(), 16)

def create_db(filename):
    with open(filename, 'wb') as f:
        f.write(b'\0' * 1024 * 1024)  # 1MBの空ファイル作成

def set_key(filename, key, value):
    with open(filename, 'r+b') as f:
        mm = mmap.mmap(f.fileno(), 0)
        pos = h(key) % mm.size()
        while mm[pos:pos+1] != b'\0':
            pos = (pos + 1) % mm.size()
            if pos == h(key) % mm.size():
                f.seek(0, os.SEEK_END)
                f.write(b'\0' * mm.size())  # ファイルサイズを2倍にする
                mm = mmap.mmap(f.fileno(), f.tell())  # ファイルサイズを反映させる
                pos = h(key) % mm.size()  # ハッシュ値を再計算する
        data = key + '\0' + value + '\0'
        data = data.encode()
        mm[pos:pos+len(data)] = data
        mm.close()  # mmapオブジェクトを閉じる

def get_key(filename, key):
    with open(filename, 'r+b') as f:
        mm = mmap.mmap(f.fileno(), 0)
        pos = h(key) % mm.size()
        while mm[pos:pos+1] != b'\0':
            end = mm.find(b'\0', pos, mm.size())  # 第2引数と第3引数指定する
            if end == -1:
                end = mm.size()
            if mm[pos:end].decode() == key:
                pos = end + 1
                end = mm.find(b'\0', pos, mm.size())  # 第2引数と第3引数指定する
                if end == -1:
                    end = mm.size()
                value = mm[pos:end].decode()
                mm.close()  # mmapオブジェクトを閉じる
                return value
            pos = (pos + 1) % mm.size()
            if pos == h(key) % mm.size():
                break
        mm.close()  # mmapオブジェクトを閉じる
        return None

def main():
    cmd = sys.argv[1]
    if cmd == 'create':
        create_db(sys.argv[2])
    elif cmd == 'set':
        set_key(sys.argv[2], sys.argv[3], sys.argv[4])
    elif cmd == 'get':
        print(get_key(sys.argv[2], sys.argv[3]))

if __name__ == '__main__':
    main()
 

2023-08-25

test

https://chat.openai.com/share/c80d83ea-752b-4561-a162-7ea0bd116d56

CSVVBAエクセル

Option Explicit

Dim objExcel, objWorkbook, objWorksheet

Dim strFolderPath, strSourceFile, strTargetFile, strSearchString, strReplaceString

Dim intLastRow, intRow, intColumn

' Excelオブジェクト作成

Set objExcel = CreateObject("Excel.Application")

objExcel.Visible = True

' フォルダパスファイル名の設定

strFolderPath = ".\" ' スクリプトと同じフォルダにあることを仮定

strSourceFile = "変更一覧.xlsx"

strTargetFile = "変更一覧.xlsx"

' Excelファイルを開く

Set objWorkbook = objExcel.Workbooks.Open(strFolderPath & strSourceFile)

' シートのコピー名前の変更

objWorkbook.Sheets("1月").Copy , objWorkbook.Sheets("1月").Index

objWorkbook.Sheets("1月 (2)").Name = "2月"

' セルの値の置換

Set objWorksheet = objWorkbook.Sheets("2月")

objWorksheet.Cells(1, 1).Value = Replace(objWorksheet.Cells(1, 1).Value, "1月", "2月")

objWorksheet.Cells(2, 7).Value = Replace(objWorksheet.Cells(2, 7).Value, "2023/2/14", "2023/3/14")

' 最終行の取得

intLastRow = objWorksheet.Cells(objWorksheet.Rows.Count, 1).End(-4162).Row ' xlUp

' 値のクリア

For intRow = 8 To intLastRow

For intColumn = 1 To 6

objWorksheet.Cells(intRow, intColumn).ClearContents

Next

Next

' テキストファイルの読み込み

Dim objFSO, objTextFile, strContents, arrLines, arrFields, strNewContents

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objTextFile = objFSO.OpenTextFile(strFolderPath & "変更一覧.txt", 1)

strContents = objTextFile.ReadAll

objTextFile.Close

' フィールド区切り文字カンマに設定してデータを分割

arrLines = Split(strContents, vbNewLine)

For Each strContents In arrLines

arrFields = Split(strContents, ",")

For Each strContents In arrFields

If IsNumeric(strContents) Then

strNewContents = strNewContents & "'" & strContents & ","

Else

strNewContents = strNewContents & strContents & ","

End If

Next

strNewContents = Left(strNewContents, Len(strNewContents) - 1) & vbNewLine

Next

' データをシートに貼り付け

Set objWorksheet = objWorkbook.Sheets("2月")

objWorksheet.Cells(1, 8).Value = strNewContents

' セルの値の置換

objWorksheet.Cells(123, 1).Value = Replace(objWorksheet.Cells(123, 1).Value, "F", "FH")

' Excelファイルを保存して閉じる

objWorkbook.Save

objWorkbook.Close

objExcel.Quit

' オブジェクト解放

Set objWorksheet = Nothing

Set objWorkbook = Nothing

Set objExcel = Nothing

Set objFSO = Nothing

Set objTextFile = Nothing

WScript.Echo "スクリプトの実行が完了しました。"

2023-04-26

メモ

Sub CheckForGarbledCharacters()

Dim ws As Worksheet

Dim rng As Range

Dim cell As Range

Dim char As String

Dim i As Integer

Dim garbledFound As Boolean

Dim unicodeVal As Long

garbledFound = False

' すべてのワークシートをチェックします。

For Each ws In ThisWorkbook.Worksheets

Set rng = ws.UsedRange

' 各セルスキャンして文字化けがないかチェックします。

For Each cell In rng

For i = 1 To Len(cell.Value)

char = Mid(cell.Value, i, 1)

unicodeVal = AscW(char)

' ASCII範囲日本語範囲を除外

If Not ((32 <= unicodeVal And unicodeVal <= 126) Or (12353 <= unicodeVal And unicodeVal <= 12447) Or (12448 <= unicodeVal And unicodeVal <= 12543) Or (65382 <= unicodeVal And unicodeVal <= 65439) Or (19968 <= unicodeVal And unicodeVal <= 40959)) Then

MsgBox "文字化けが見つかりました: " & vbCrLf & _

"ワークシート: " & ws.Name & vbCrLf & _

"セル: " & cell.Address & vbCrLf & _

"セルの値: " & cell.Value & vbCrLf & _

"文字化けしている文字: " & char, vbExclamation

garbledFound = True

Exit For

End If

Next i

' 文字化けが見つかった場合、次のワークシートへ移動します。

If garbledFound Then Exit For

Next cell

If garbledFound Then Exit For

Next ws

If Not garbledFound Then

MsgBox "文字化けが見つかりませんでした。", vbInformation

End If

End Sub

2023-04-19

anond:20230419115036

ちなみにジョジョ三部最終話とき掲載順位

1 ろくでなしBLUES 巻頭カラー VOL.191 SHE SMILED SWEETLY

2 電影少女 VIDEO-GIRL-LEN 新連載 カラー CHAPTER1(青天のへきれき)

3 DRAGON BALL 其之三百六十九 人造人間セル

4 SLAM DUNK #77 ROOKIE SENSATION

5 DRAGON QUEST ダイの大冒険123話 閃光の大逆襲!!!の巻

6 幽☆遊☆白書 呪氷使い・凍矢!!の巻

7 モンモンモン 楽しい給食の巻

8 新ジャングルの王者ターちゃん♡ No.204 ダン王国の正体!?の巻

9 チェンジUP!! 第8投 愛する資格

10 爆発!宇宙クマさん タータ・ベア&菊千代くん 第3話 宿命ライバルと減点パパの巻

11 柳生烈風剣連也 斬乃六 その頃ペルシャでは・・・

12 ペナントレース やまだたいちの奇蹟 第44回 スワローズ戦⑤・ただいま三冠王!

13 超機動暴発蹴球野郎 リベロ武田 その55 サッカー成金になりたい!!の巻

14 まじかる☆タルるートくん タルるート人生最良の日!?の巻

15 こちら葛飾区亀有公園前派出所 暴走!一寸法師の巻

16 ジョジョの奇妙な冒険 100年間の貸しの巻

17 魔神冒険譚-アラビアン-ランプ・ランプ 第18夜 捨て去った感情

18 花の慶次 -雲のかなたに- 熱風!小田原陣の章 巻十八、拳の熱さ

19 アウターゾーン 第19話 妖精を見た!(前編)

かに黄金期だしDB幽白スラダン三本柱もあるとはいえここまで低いか?とはなるよ。

2022-12-24

誰も予測できない投稿

匿名ダイアリーに書きたいな〜と思ったときに、どんなカテゴリーで書くか悩んだときに決める方法

import requests

topics = """カテゴリーの一覧を改行して書く""".split("\n")

i = int(requests.get("https://qrng.anu.edu.au/wp-content/plugins/colours-plugin/get_one_hex.php").text, 16) % len(topics)

print(topics[i])

2022-08-24

anond:20220824182342

これ優秀やね。元増田のやつよりお手軽。

あとせっかくだからサムネイルを並べて表示するコードを紹介しとこう。

import matplotlib.pyplot as plt

num_inference_steps = 10            # Number of denoising steps
guidance_scale = 7.5                # Scale for classifier-free guidance
batch_size = 1

def show_images(images, figsize=(20,10), columns = 5):
  plt.figure(figsize=figsize)
  for i, image in enumerate(images):
      plt.subplot(len(images) / columns + 1, columns, i + 1)
      plt.imshow(image)

#入力文字 ここに好きな禁則文字をいれてください
prompt = ["hatena anonymous diary"]

# 画像サイズ
height = 512                        # default height of Stable Diffusion
width = 512                         # default width of Stable Diffusion

# SEED値、ここをかえると 同じ入力文字でも別の画像がでます
seedId = 1

images = []
for i in range(5):
  generator = torch.manual_seed(seedId + i)
  print(seedId + i)
  image = run(prompt,generator,height,width,num_inference_steps,guidance_scale,batch_size)
  images.append(image)

show_images(images)

2022-03-23

Powershell

Convert-Stringってコマンドコマンドレット)がある。

使い方は、例を見てもらったほうが速いので、以下。

入力

("Hatsune Miku","Kagamine Rin","Kagamine Len") | Convert-String -Example "Kasane Teto=K. Teto"

出力

H. Miku
K. Rin
K. Len

やれることはわかった。

ただ、大文字/小文字判断や順番が入れ替わると対応できず、柔軟性はそれほどない。

これ、どういうときに使うと便利なやつ?

2021-12-10

Excel文字数を数えるLEN関数ってのがあるんだけど、

CSVデータをあげるときに厳密にバイトで数えたいのに全角は2文字分と数えてくれない。

結局1行1行テキストエディタに貼り付けて文字数が、例えば255バイトに収まるように数えているんだけど、なんかこれってアホらしくない?

21世紀になってセル文字数も数えられないとか、

意外と不便なところがあって、なんとかして欲しい。

それか何か良い方法があればよいが。

2021-07-19

https://anond.hatelabo.jp/20210719192035

もう対抗馬さんは出てこなくなっちゃったのかね。

さみしいので俺が書いとくわ。

2021/07/20(火) の予測値 1,084 (95%予測区間 902 ~ 1,258)
2021/07/21(水) の予測値 1,350 (95%予測区間 1,177 ~ 1,534)
2021/07/22(木) の予測値 1,611 (95%予測区間 1,437 ~ 1,782)
2021/07/23(金) の予測値 1,555 (95%予測区間 1,384 ~ 1,757)
2021/07/24(土) の予測値 1,612 (95%予測区間 1,436 ~ 1,796)
2021/07/25(日) の予測値 1,273 (95%予測区間 1,088 ~ 1,452)

2021/07/26(月) の予測966 (95%予測区間 783 ~ 1,145)
2021/07/27(火) の予測値 1,332 (95%予測区間 1,134 ~ 1,519)
2021/07/28(水) の予測値 1,649 (95%予測区間 1,429 ~ 1,854)
2021/07/29(木) の予測値 1,957 (95%予測区間 1,722 ~ 2,205)
2021/07/30(金) の予測値 1,879 (95%予測区間 1,617 ~ 2,128)
2021/07/31(土) の予測値 1,938 (95%予測区間 1,675 ~ 2,220)
2021/08/01(日) の予測値 1,523 (95%予測区間 1,290 ~ 1,771)

2021/08/02(月) の予測値 1,151 (95%予測区間 949 ~ 1,378)
2021/08/03(火) の予測値 1,579 (95%予測区間 1,296 ~ 1,852)
2021/08/04(水) の予測値 1,948 (95%予測区間 1,615 ~ 2,267)
2021/08/05(木) の予測値 2,302 (95%予測区間 1,959 ~ 2,715)
2021/08/06(金) の予測値 2,203 (95%予測区間 1,768 ~ 2,611)
2021/08/07(土) の予測値 2,264 (95%予測区間 1,851 ~ 2,739)
2021/08/08(日) の予測値 1,773 (95%予測区間 1,391 ~ 2,155)

2021/08/09(月) の予測値 1,336 (95%予測区間 1,035 ~ 1,668)
2021/08/10(火) の予測値 1,827 (95%予測区間 1,425 ~ 2,258)
2021/08/11(水) の予測値 2,247 (95%予測区間 1,728 ~ 2,794)
2021/08/12(木) の予測値 2,648 (95%予測区間 2,054 ~ 3,296)
2021/08/13(金) の予測値 2,526 (95%予測区間 1,876 ~ 3,184)
2021/08/14(土) の予測値 2,590 (95%予測区間 1,918 ~ 3,317)
2021/08/15(日) の予測値 2,023 (95%予測区間 1,482 ~ 2,618)

2021/08/16(月) の予測値 1,520 (95%予測区間 1,060 ~ 1,983)
2021/08/17(火) の予測値 2,075 (95%予測区間 1,440 ~ 2,719)
2021/08/18(水) の予測値 2,545 (95%予測区間 1,766 ~ 3,377)
2021/08/19(木) の予測値 2,994 (95%予測区間 2,065 ~ 4,002)
2021/08/20(金) の予測値 2,850 (95%予測区間 1,946 ~ 3,818)
2021/08/21(土) の予測値 2,916 (95%予測区間 2,006 ~ 3,900)
2021/08/22(日) の予測値 2,273 (95%予測区間 1,443 ~ 3,069)

ついでにソースも公開しとくわ。Google Colaboratory に貼ればそのまま動く。

見ての通り、単に過去感染者数を Facebook Prophet に放り込んだだけの単純なモノ。人流も変異株もワクチンも全く考慮ナシ。

適当に改良よろ。

!pip install -q fbprophet
from fbprophet import Prophet
import pandas as pd
!wget --no-check-certificate --output-document=covid19_tokyo.json 'https://raw.githubusercontent.com/tokyo-metropolitan-gov/covid19/development/data/data.json'
data = pd.read_json('covid19_tokyo.json')
date_data = []
posi_data = []
for i in range(len(data['patients_summary']['data'])):
    date_data.append(data['patients_summary']['data'][i]['日付'])
    posi_data.append(data['patients_summary']['data'][i]['小計'])
data=pd.DataFrame({'ds': date_data, 'y': posi_data})
data['ds'] = data['ds'].astype('datetime64')
model = Prophet(interval_width=0.95, changepoint_range=1.0, changepoint_prior_scale=0.5, seasonality_prior_scale=10.0, seasonality_mode='multiplicative',  n_changepoints=50)
model.fit(data)
future = model.make_future_dataframe(periods=35, freq='D')
forecast = model.predict(future)
model.plot(forecast);

2020-10-15

poetry cache clearの仕様おかし

% poetry cache clear --help
USAGE
  poetry cache clear [--all] <cache>

ARGUMENTS
  <cache>                The name of the cache to clear.

OPTIONS
  --all                  Clear all entries in the cache.

GLOBAL OPTIONS
  -h (--help)            Display this help message
  -q (--quiet)           Do not output any message
  -v (--verbose)         Increase the verbosity of messages: "-v" for normal output, "-vv" for more verbose output and "-vvv" for debug
  -V (--version)         Display this application version
  --ansi                 Force ANSI output
  --no-ansi              Disable ANSI output
  -n (--no-interaction)  Do not ask any interactive question

これ見ると

poetry cache clear pypi

で動きそうじゃん?

% poetry cache clear pypi

  RuntimeError

  Add the --all option if you want to clear all pypi caches

  at /usr/local/lib/python3.8/site-packages/poetry/console/commands/cache/clear.py:44 in handle
      40│         )
      41│ 
      42│         if len(parts) == 1:
      43│             if not self.option("all"):
    → 44│                 raise RuntimeError(
      45│                     "Add the --all option if you want to clear all "
      46│                     "{} caches".format(parts[0])
      47│                 )
      48│ 

ブブー

動きません

正しくはこう

poetry cache clear pypi --all

オプションって何だよ哲学か?

直感的には--allをついてたら全てのキャッシュを消すべきだと思うが

% poetry cache clear --all 
Not enough arguments (missing: "cache").

ブブー

動きません

`--allって何だよ哲学か?

意味不明に思ったのは俺だけではないらしくIssueが出ている

https://github.com/python-poetry/poetry/issues/521

opened this issue on 19 Oct 2018 · 18 comments

2年前ですよ2年前!

Issue700個も溜まってます

ちゃんメンテしてるぅ?

pipenvもアレだったけどpoetryもアレだな

もう少しマシな奴が欲しい

2020-06-12

anond:20200612120752

以下のソースが何をやっているか答えてみせろ

def myfunc(arr):
    if len(arr) <= 1:
        return arr

    left = []
    right = []

    ref = arr[0]
    ref_count = 0

    for e in arr:
        if e < ref:
            left.append(e)
        elif e > ref:
            right.append(e)
        else:
            ref_count += 1

    left = myfunc(left)
    right = myfunc(right)

    return left + [ref] * ref_count + right

2019-03-12

Ruby経験者がPythonlenを見て「一貫性が無い」って文句言う率は9割を超えると言われている(誰に?)

2019-01-01

Graphviz を使って Python抽象構文木を生成する。



1. こんな感じで使います


1.1. スクリプトとして使用する。

$ python parser.py sample.py


1.2. モジュールとして使用する。

import parser
code = '''
a  = 1 + 1
print(a)
'''
graph = parser.create_graph(code)
graph.render("sample")


2. ソースコード parser.py はこんな感じです。

import ast
import sys
import graphviz


def create_graph(lines):
    graph = graphviz.Graph(format='png')
    root = ast.parse(lines)
    node_list = [root]
    _setup(graph, node_list)
    return graph


def _setup(graph, node_list):
    # node
    node = node_list[-1]
    node_identity = str(len(node_list))
    node_name = type(node).__name__
    graph.node(node_identity, node_name)

    # children
    for child in ast.iter_child_nodes(node):
        node_list.append(child)
        child_identity = str(len(node_list))
        graph.edge(node_identity, child_identity)
        _setup(graph, node_list)


if __name__ == '__main__':
    file_name = sys.argv[1]
    with open(file_name) as file:
        lines = file.read()
    graph = create_graph(lines)
    graph.render(file_name)

2018-12-23

anond:20181223184745

この辺になってくると初心者の人は面倒かな?

解説をつければかなりわかりやす

基本的な書き方


class mystring
{
public:
	char *buffer;
	mystring() 
	{
		buffer = (char*)"";
	}

	void operator = (const char*t)
	{
		int len = strlen(t);
		buffer = new char[len + 47];
		strcpy(buffer, t);
	}

	void operator = (const mystring&src)
	{
		int len = strlen(src.buffer);
		buffer = new char[len + 47];
		strcpy(buffer, src.buffer);
	}

	mystring& operator + (const char*t)
	{
		int len = strlen(buffer);
		int len2 = strlen(t);
		char *buffer2 = new char[len + len2 + 47];
		strcpy(buffer2, buffer);
		strcpy(buffer2+len, t);
		buffer = buffer2;
		return *this;
	}
	mystring&  operator + (const mystring&src)
	{
		return ((*this) + src.buffer);
	}

};


STL化したもの

class mystringV
{
public:
	std::vector<char> buffer;
	mystringV()
	{
		buffer.resize(2);
		buffer[0] = ' ';
		buffer[1] = NULL;
	}

	void operator = (const char*t)
	{
		int len = strlen(t);
		buffer.resize(len+1);
		strcpy(&buffer.at(0), t);
	}

	void operator = (const mystringV&src)
	{
		buffer = src.buffer;
	}

	mystringV& operator + (const char*t)
	{
		int len = strlen(&buffer.at(0));
		int len2 = strlen(t);

		buffer.resize(len + len2 + 47);

		strcpy(&buffer.at(0) + len, t);

		return *this;
	}
	mystringV&  operator + (const mystringV&src)
	{
		return ((*this) + &src.buffer.at(0));
	}

};

考察

様々な話はあるものSTLの方を使えば

いろんな事をプログラマにかわってライブラリがやってしまうということ

どうなんだろうね。

この辺は あまりしっかり おしえてもらえないところではある。

でも プロならみんな 知っている

anond:20181223183225

初心者

class mystring
{
public:
	char *buffer;
	mystring() 
	{
		buffer = (char*)"";
	}

	void operator = (const char*t)
	{
		int len = strlen(t);
		buffer = new char[len + 47];
		strcpy(buffer, t);
	}

	void operator = (const mystring&src)
	{
		int len = strlen(src.buffer);
		buffer = new char[len + 47];
		strcpy(buffer, src.buffer);
	}

	mystring& operator + (const char*t)
	{
		int len = strlen(buffer);
		int len2 = strlen(t);
		char *buffer2 = new char[len + len2 + 47];
		strcpy(buffer2, buffer);
		strcpy(buffer2+len, t);
		buffer = buffer2;
		return *this;
	}
	mystring&  operator + (const mystring&src)
	{
		return ((*this) + src.buffer);
	}

};

	mystring my_space_org;
	for (int i = 0; i < 8; i++) {
		mystring space;
		space = my_space_org + " ";
		printf("%sHello world\n", space.buffer);
		my_space_org = space;
	}

2018-06-29

while True:
    num = input()
    '数値ではありません' if not num.isdigit() else '4桁ではありません' if len(num) != 4 else [i for i in num]

from typing import Sequence


class ReverseSequence(object):
    def __init__(self, sequence: Sequence):
        self.sequence = sequence  # reference to container
        self.index = len(sequence)  # current index

    # Step 1. define __iter__ method whitch returns self.
    def __iter__(self):
        return self

    # Step 2. define __next__ method
    #             rasing StopIteration at the end of iteration.
    def __next__(self):
        if self.index > 0:
            self.index = self.index - 1  # next index
            return self.sequence[self.index]
        else:
            raise StopIteration


class ReverseSequenceGenerator(object):
    def __init__(self, sequence: Sequence):
        self.sequence = sequence
        self.index = len(sequence)

    def __iter__(self):
        while self.index > 0:
            self.index = self.index - 1
            yield self.sequence[self.index]
        raise StopIteration


assert list.__eq__(
    [element for element in ReverseSequence('spam')],
    [element for element in ReverseSequenceGenerator('spam')]
)

class Reverse:
    def __init__(self, data):
        self.data = data
        self.index = len(data)

    def __iter__(self):
        return self

    def __next__(self):
        if self.index == 0:
            raise StopIteration
        self.index = self.index - 1
        return self.data[self.index]


class ReverseGenerator:
    def __init__(self, data):
        self.data = data
        self.index = len(data)

    def __iter__(self):
        while True:
            if self.index == 0:
                raise StopIteration
            self.index = self.index - 1
            yield self.data[self.index]


assert [s for s in Reverse('spam')] == [s for s in ReverseGenerator('spam')]
ログイン ユーザー登録
ようこそ ゲスト さん