ãChatGPTÃPythonãð± å®¶åºèåã¢ããªãçžè«ããããåããããã¿ã€ãã宿ããŠããŸã£ã話
ð° ãŸãã¯è»œãçžè«ã®ã€ãããâŠ
Python ã®å匷ããŠããæ¥æ¬ã§æ œå¹å¯èœãªéèãšæç©ã®è²ãŠæ¹ã¢ããªããäœãããã«çžè«ããããš ChatGPT 5ïŒAutoïŒããã«ã以äžå 容ã®ãã£ãããæãããšãããå ·äœçã«ã©ãããŸããïŒãªã©èãããããšããªãããããã¿ã€ãã®ã¢ããªãäœã£ã¡ãã£ãŠããŸããã

â ChatGPT ãããæžããŠããã Python ã³ãŒãïŒé·ãã®ã§é£ã°ããŠOKïŒ
# -*- coding: utf-8 -*-
"""
æ¥æ¬ã§æ œå¹å¯èœãªäž»èŠãªéèã»ææš¹ã®è²ãŠæ¹ã¬ã€ãïŒæå°å®çšãããã¿ã€ãïŒ
- Streamlit åäžãã¡ã€ã«çïŒåŸã§ JSON/CSV ã«åé¢ããããèšèšïŒ
- ãªãã©ã€ã³ã§ã䜿ããããã«ããŒã¿ã¯ã³ãŒãå
ã«ããŒãã³ãŒãïŒãã¢çšïŒ
- å°åå¥ïŒåæµ·é/æ±å/颿±/äžéš/è¿ç¿/äžåœ/ååœ/ä¹å·/æ²çžïŒã§æçš®ã»åç©«ææãåå²
- ç®çïŒåå¿è
ãäžäººã§è²ãŠãããã¬ãã«ã®æé ãšæ³šæç¹ãæŒããªã確èªã§ããããš
â
ä»åŸã®æ¡åŒµãã€ã³ãïŒäžã« TODO ããŒã¯ããïŒ
- ããŒã¿ã JSON ã«åé¢ïŒcrops_ja.json ãªã©ïŒ
- ç»åïŒæçš®ã®æ·±ããæ ªéãèã®å®æ€æ·±ããªã©ïŒãæ·»ä»
- ãæããšã®äœæ¥ã«ã¬ã³ããŒãèªåçæïŒçŸåšã¯çžå¯Ÿé± + ããããæè¡šç€ºïŒ
- ç
害è«ã®åçèŠæ¬ã倿ãããŒãã£ãŒãã远å
- ãŠãŒã¶ãŒã®æ œå¹èšé²ïŒæç𮿥ããã§ãã¯ãªã¹ã鲿ïŒãä¿åïŒst.session_state â CSV åºåïŒ
"""
import json
from datetime import date, datetime, timedelta
from typing import List, Dict, Any
import pandas as pd
import streamlit as st
# ------------------------------------------------------------
# ãŠãŒãã£ãªãã£
# ------------------------------------------------------------
REGIONS = [
"åæµ·é", "æ±å", "颿±", "äžéš", "è¿ç¿", "äžåœ", "ååœ", "ä¹å·", "æ²çž"
]
MONTHS = [f"{m}æ" for m in range(1, 13)]
SEED_SOURCES_HINT = [
"åèžåºã»ããŒã ã»ã³ã¿ãŒã®çš®èã³ãŒããŒ",
"å°åã® JAã»çŽå£²æïŒåšæ¥çš®ã»åºå®çš®ãèŠã€ããããšãïŒ",
"ãªã³ã©ã€ã³çš®èåºïŒäŸïŒåœå
倧æçš®èäŒç€Ÿã®å
¬åŒé販ãåšæ¥åºå®çš®å°éåºãªã©ïŒ",
]
SOIL_TYPES = {
"å£å": "æ œå¹ããããæšæºçãªåãä¿æ°Žã»ææ°Žã»ä¿è¥ã®ãã©ã³ã¹ãè¯ãã",
"ç å£å": "ææ°Žè¯å¥œã也ããããã®ã§å
è¥ã»è¿œè¥ãšæ·ãèãªã©ã®ãã«ãã§ä¿æ°Žãã",
"ç²å質": "ä¿æ°Žã»ä¿è¥ã¯è¯ããéæ¹¿ã«æ³šæãé«çã»ææ©ç©ïŒè
èåïŒã§å£ç²æ§é åã",
}
# æéïŒâæãâæïŒãæ±ãç°¡æé¢æ°
# ex. [3,4,5] â "3ã5æ"
def months_to_label(month_list: List[int]) -> str:
if not month_list:
return "â"
m = sorted(month_list)
# é£ç¶ãããã¯ã«ãŸãšãã
blocks = []
start = m[0]
prev = m[0]
for x in m[1:]:
if x == prev + 1:
prev = x
else:
blocks.append((start, prev))
start = x
prev = x
blocks.append((start, prev))
return ", ".join([f"{a}ã{b}æ" if a != b else f"{a}æ" for a, b in blocks])
# ã¿ã¹ã¯ â DataFrame 倿ïŒããŠã³ããŒãçšïŒ
def tasks_to_df(tasks: List[Dict[str, Any]]) -> pd.DataFrame:
rows = []
for t in tasks:
rows.append({
"é åº": t.get("order"),
"äœæ¥å": t.get("title"),
"ç®å®": t.get("when"),
"æé ": t.get("steps"),
"泚æ": t.get("notes", "")
})
return pd.DataFrame(rows)
# ------------------------------------------------------------
# ãã¢çšããŒã¿ããŒã¹ïŒæå°äŸïŒ
# â» æ°å€ãæã¯äžè¬çãªç®å®ãå®éã®åçš®ã»å°åå·®ã«ããååŸããŸãã
# å®å
šæ§éèŠã®ãããååŠè¬å€åã®å奿šå¥šã¯é¿ããç©çã»æ œå¹ç®¡çäžå¿ã®å©èšã«çµ±äžã
# ------------------------------------------------------------
CROPS: List[Dict[str, Any]] = [
{
"name": "ãããïŒãã/äžç/倧çïŒ",
"type": "éè",
"regions": REGIONS,
"soil": {
"ph": "6.0ã6.5ïŒããé
žæ§ãäžæ§å¯ãïŒ",
"type": "å£åïŒææ°Žè¯å¥œã»é湿ã¯å³çŠïŒ",
"preparation": [
"å幎ç§ãå¬ã«èŠåç³ç°ã§é
žåºŠèª¿æŽïŒ1ã¡ããã100ã150gç®å®ïŒ",
"å®çããè¥ã1ã¡ããã2ã3kgãã蟌ã",
"å
è¥ã¯æ§ããïŒãããœéå€ã¯ã€ããã±ïŒ",
"é«çïŒé»ãã«ãã§å°æž©ç¢ºä¿ãšæ³¥ã¯ã鲿¢"
]
},
"seed_sources": SEED_SOURCES_HINT,
"sowing": {
"method": "è²èâ宿€ïŒçŽæã¯éæšå¥šïŒ",
"by_region": {
"åæµ·é": {"sow": [4], "transplant": [5,6]},
"æ±å": {"sow": [3,4], "transplant": [5]},
"颿±": {"sow": [2,3], "transplant": [4,5]},
"äžéš": {"sow": [2,3], "transplant": [4,5]},
"è¿ç¿": {"sow": [2,3], "transplant": [4,5]},
"äžåœ": {"sow": [2,3], "transplant": [4,5]},
"ååœ": {"sow": [2,3], "transplant": [4,5]},
"ä¹å·": {"sow": [2,3], "transplant": [4]},
"æ²çž": {"sow": [12,1,2], "transplant": [2,3]}
},
"steps": [
"æž
æœãªè²èãã¬ãŒã«æçš®ãèŠå5mmã25âååŸã§çºèœ",
"æ¬è2ã3æã§9cmãããã«ä»®æ€ãåŸé·é²æ¢ã®ããååãªå
",
"宿€å1é±éã¯å€æ°ã«ãªããïŒé åïŒ",
"æ¯æ±ã»èªåŒã®æºåãæ ªé45ã50cmãæ¡é60ã80cm"
]
},
"tasks": [
{"order": 1, "title": "æçš®", "when": "æšå¥šæçš®æã«å®æœ", "steps": "æž
æœãªçšåã«ç¹æãèãèŠåãçºèœãŸã§ã¯ä¹Ÿç¥ãããªãã"},
{"order": 2, "title": "è²è管ç", "when": "çºèœãæ¬è2ã3æ", "steps": "åŸé·é²æ¢ã«æ¥åœãã確ä¿ãæ°Žããã¯æãè¥æã¯èãã®æ¶²è¥ãé±1ã"},
{"order": 3, "title": "宿€", "when": "å°æž©15âç®å®ã»é
éåŸ", "steps": "æ·±æ€ããéããªããæ€ç©Žã«æ°Žãã¯ã£ãп޻çãä¿ããæ¯æ±èšçœ®ã"},
{"order": 4, "title": "æŽæã»èªåŒã»èœãã", "when": "宿€åŸãåç©«æ", "steps": "äž»æ1ã2æ¬ä»ç«ãŠãèèœã¯æ©ãã«é€å»ã颚éãã確ä¿ã"},
{"order": 5, "title": "远è¥ã»æœ
æ°Ž", "when": "éè±ãåç©«æ", "steps": "çæãèŠãŠæ§ããã«è¿œè¥ãéæ¹¿ã¯è£æã®åå ãä¹Ÿæ¹¿å·®ãæžããã"},
{"order": 6, "title": "åç©«", "when": "æè²ãååã«çè²ããã", "steps": "æã®æ¶Œããæéã«ããã¿ãå·ããªãããã«ããµãã§åç©«ã"}
],
"pests": [
{"name": "ãã©ããç
", "symptoms": "èã«çœãç²ç¶æç¹", "control": "éå¯ãé¿ã颚éããåæã«ç
èé€å»ãäºé²ã¯èè£ãŸã§æ°Žããããªãã"},
{"name": "ç°è²ãã³ç
", "symptoms": "è±ã幌æãè¶è²ãè
æ", "control": "éšããã»ãã«ãã§æ³¥ã¯ã鲿¢ãè±ããé€å»ãéæ¹¿åé¿ã"},
{"name": "ã¢ãã©ã ã·", "symptoms": "æ°èœã«çŸ€çã»èã®çž®ã", "control": "èŠã€ã次第ã§ç©çé€å»ãããŒãã§ãã¿åããå€©æµæž©åãç²çãã©ããã"},
],
"harvest": {
"by_region": {
"åæµ·é": [8,9],
"æ±å": [7,8,9],
"颿±": [6,7,8,9],
"äžéš": [6,7,8,9],
"è¿ç¿": [6,7,8,9],
"äžåœ": [6,7,8,9],
"ååœ": [6,7,8,9],
"ä¹å·": [6,7,8],
"æ²çž": [5,6,7]
},
"steps": [
"æç®å
šäœãåçš®åºæã®è²ã«çè²ããŠããåç©«",
"æ¿ã©ãã¯ä¿åæ§åäžãåæã©ãã¯é£å³éèŠ",
]
},
"notes": [
"éšããæ œå¹ïŒç°¡æãããŒã«ïŒã§ç
害ã»è£æã倧ãã軜æž",
"é£äœã¯é¿ããå°ãªããšã2ã3幎ããã",
]
},
{
"name": "ãžã£ã¬ã€ã¢",
"type": "éè",
"regions": REGIONS,
"soil": {
"ph": "5.0ã6.0ïŒããé
žæ§ïŒ",
"type": "ç å£åãå£åïŒææ°Žè¯å¥œïŒ",
"preparation": [
"æªçããè¥ã¯é¿ããïŒãããç
å©é·ïŒ",
"çãé«ãããŠé湿ãé¿ãã",
]
},
"seed_sources": [
"çš®ããïŒæ€æ»æžã®çš®ããã賌å
¥ïŒ",
*SEED_SOURCES_HINT
],
"sowing": {
"method": "çš®ããæ€ãä»ãïŒåæã¯åãå£ã«èæšç°ïŒ",
"by_region": {
"åæµ·é": {"plant": [4,5]},
"æ±å": {"plant": [3,4]},
"颿±": {"plant": [2,3], "autumn": [9]},
"äžéš": {"plant": [2,3], "autumn": [9]},
"è¿ç¿": {"plant": [2,3], "autumn": [9]},
"äžåœ": {"plant": [2,3], "autumn": [9]},
"ååœ": {"plant": [2,3], "autumn": [9]},
"ä¹å·": {"plant": [2,3], "autumn": [9]},
"æ²çž": {"plant": [1,2], "autumn": [10]}
},
"steps": [
"30ã40g/åçãèœã®å€ãæ¹ã§åãâåãå£ã«èæšç°",
"æ·±ã5ã8cmãæ ªé25ã30cmãæ¡é60ã70cm",
"èœããïŒå¢ãã®è¯ãèœã2æ¬ã»ã©æ®ã",
]
},
"tasks": [
{"order": 1, "title": "æ€ãä»ã", "when": "å°æž©ã10âçšåºŠ", "steps": "åçãåãå£äžåãã§æµ
æ€ããéäºå ±ãªãäžç¹åžã§ä¿æž©ã"},
{"order": 2, "title": "èœããã»åå¯ã", "when": "èèœåŸ2ã3é±é", "steps": "æ¬æ°æŽçâ远è¥å°éâåå¯ãã§éå€ã»ç·åã鲿¢ã"},
{"order": 3, "title": "ç
害è«ã»é湿察ç", "when": "çè²æãéããŠ", "steps": "é·éšã¯çéã®æ°Žã¯ã確ä¿ãç«ç
ã¯äžèã®é¢šéãæ¹åã"},
{"order": 4, "title": "åç©«ã»ä¹Ÿç¥", "when": "èèãé»å€ã»åäŒåŸ", "steps": "æãäžãâçŽå°æ¥å
ãé¿ããŠé°å¹²ãâåã€ãä¿åã"}
],
"pests": [
{"name": "ãããç
", "symptoms": "ããã®è¡šé¢ã«ããã¶ãç¶ç
æ", "control": "ã¢ã«ã«ãªåãé¿ããã»æªçææ©ç©ãé¿ããã»èŒªäœåŸ¹åºã"},
{"name": "ç«ç
", "symptoms": "èãè€å€ã»èãé»å€", "control": "倿¹¿ãé¿ããã»äžèæŽçã»éšããã»å¥å
šçš®ãã䜿çšã"},
],
"harvest": {
"by_region": {
"åæµ·é": [7,8,9],
"æ±å": [6,7],
"颿±": [6,7,11],
"äžéš": [6,7,11],
"è¿ç¿": [6,7,11],
"äžåœ": [6,7,11],
"ååœ": [6,7,11],
"ä¹å·": [6,7,11],
"æ²çž": [5,6,12]
},
"steps": [
"æŽå€©ç¶ãã®åŸã«æããšæ³¥ã¯ããè¯ãä¿ååã",
"ç·åããã¯é£çšäžå¯ïŒãœã©ãã³çïŒâå
ãé¿ããŠä¿å"
]
},
"notes": [
"é£äœãé¿ããïŒãã¹ç§ã¯2ã3幎ãããïŒ",
]
},
{
"name": "ã€ããŽïŒå®¶åºèååãïŒ",
"type": "æç©",
"regions": REGIONS,
"soil": {
"ph": "5.5ã6.5",
"type": "å£åïŒé«çã»ãã«ãã§é湿åé¿ïŒ",
"preparation": [
"å®çããè¥ã»ãªã³é
žãããå€ãã«",
"èŠªæ ªããã©ã³ããŒèã確ä¿ããããèã賌å
¥"
]
},
"seed_sources": [
"èã®è³Œå
¥ïŒåå£ãªã/äžå£ãªãïŒ",
*SEED_SOURCES_HINT
],
"sowing": {
"method": "è宿€ïŒç§æ€ãïŒ",
"by_region": {
"åæµ·é": {"transplant": [9]},
"æ±å": {"transplant": [9,10]},
"颿±": {"transplant": [9,10]},
"äžéš": {"transplant": [9,10]},
"è¿ç¿": {"transplant": [9,10]},
"äžåœ": {"transplant": [9,10]},
"ååœ": {"transplant": [9,10]},
"ä¹å·": {"transplant": [10]},
"æ²çž": {"transplant": [11]}
},
"steps": [
"ã¯ã©ãŠã³ïŒæ ªå
ïŒãåãŸããªãé«ãã§å®æ€",
"æ ªé25ã30cmããã«ãã§æž
æœã»ç°è²ãã³ç
äºé²",
"ã©ã³ããŒã¯è²èçšã®ã¿æ®ããçµå®æã¯æ©ãã«é€å»"
]
},
"tasks": [
{"order": 1, "title": "çç«ãŠã»ãã«ã", "when": "宿€1ã2é±éå", "steps": "ããè¥ã»å
è¥ãå
¥ããŠé«çã«ãé»ãŸãã¯éæãã«ãã"},
{"order": 2, "title": "宿€", "when": "å°åã®æšå¥šæã«", "steps": "æµ
æ€ãã§ã¯ã©ãŠã³ãåããªããæŽ»çãŸã§ä¹Ÿç¥æ³šæã"},
{"order": 3, "title": "è±èœåå管ç", "when": "ç§ãåå¬", "steps": "éç¹èã«æ³šæãèãããè¡ã颚éãã確ä¿ã"},
{"order": 4, "title": "åç²ã»æ·ããã", "when": "éè±æ", "steps": "æè«ä»»ãïŒãã£ãšè£å©ããã«ããèã§æå®ã®æ±ã鲿¢ã"},
{"order": 5, "title": "åç©«", "when": "æè²ãååã«èµ€ããªã£ãã", "steps": "æã©ãã§éŠãããããã¿ããšåªããåç©«ã"}
],
"pests": [
{"name": "ç°è²ãã³ç
", "symptoms": "æå®ã«ç°è²ã«ã", "control": "éæ¹¿ãé¿ãããå€èã»è±ããé€å»ããã«ãã§æ³¥ã¯ã鲿¢ã"},
{"name": "ããã", "symptoms": "èè£ãçœã£ãœãã«ã¹ãªç¶", "control": "æ°Žã§èè£ãæŽæµãå€©æµæž©åã也ç¥ãé¿ããã"}
],
"harvest": {
"by_region": {
"åæµ·é": [6,7],
"æ±å": [5,6],
"颿±": [4,5],
"äžéš": [4,5],
"è¿ç¿": [4,5],
"äžåœ": [4,5],
"ååœ": [4,5],
"ä¹å·": [3,4,5],
"æ²çž": [2,3]
},
"steps": [
"å®çããã»ã©çããæ¥æã¡ã¯çãâå·èµã§æ©ãã«é£ã¹ã",
]
},
"notes": [
"å€ã¯èŠªæ ªããã©ã³ããŒèãè²ãŠãп޿°ïŒé£äœé害åé¿ã«ãïŒ",
]
},
{
"name": "æž©å·ãã«ã³ïŒé¢/å°æ€ãã®å®¶åºåãïŒ",
"type": "æç©",
"regions": ["颿±", "äžéš", "è¿ç¿", "äžåœ", "ååœ", "ä¹å·", "æ²çž"],
"soil": {
"ph": "5.5ã6.5",
"type": "æ°Žã¯ãã®è¯ãæé¢ã»ç å£åãçæ³",
"preparation": [
"æ€ã穎ã«ããè¥ã»è
èåã»ç·©å¹æ§è¥æãæ··å",
"å¯å·å°ã§ã¯é¢æ€ãã§é²å¯ç§»åã§ããããã«ãã"
]
},
"seed_sources": [
"èæšïŒæ¥ãæšèïŒã賌å
¥",
*SEED_SOURCES_HINT
],
"sowing": {
"method": "èæšå®æ€",
"by_region": {
"颿±": {"transplant": [3,4,10,11]},
"äžéš": {"transplant": [3,4,10,11]},
"è¿ç¿": {"transplant": [3,4,10,11]},
"äžåœ": {"transplant": [3,4,10,11]},
"ååœ": {"transplant": [3,4,10,11]},
"ä¹å·": {"transplant": [3,4,10,11]},
"æ²çž": {"transplant": [2,3,11,12]}
},
"steps": [
"æ¯æ±ãæ·»ããŠé¢šå¯Ÿçãæ¥ãå£ãåã«åããªãã",
"é¢ã¯å€§ããïŒ10ã15å·ïŒãããæ ¹è©°ãŸãåã«æ€æ¿ãã"
]
},
"tasks": [
{"order": 1, "title": "宿€ã»æ¯æ±", "when": "å°åæšå¥šæã«", "steps": "æ¥ãå£ãå°éããäžã«ä¿ã€ãæ¯æ±åºå®ã"},
{"order": 2, "title": "æ°Žããã»æœè¥", "when": "çè²æïŒæ¥ãç§ïŒ", "steps": "衚åã也ãããé¢åºããæµãããŸã§ãæ¥ã»åå€ã»å€åŸã«åæœã"},
{"order": 3, "title": "ææã»åªå®", "when": "6ã7æ/å¬å£", "steps": "çæéå€ã¯æå®è¥å€§ãæªãâé©åã«ææãåŸé·æã¯åªå®ã"},
{"order": 4, "title": "åç©«ã»è²¯èµ", "when": "æç®ãçè²ãç³åºŠãã®ã£ãã", "steps": "æŽå€©æã«ææãæ®ããŠåç©«ãæ°æ¥äºæªã§é
žãæãã"}
],
"pests": [
{"name": "ã«ã€ã¬ã©ã ã·", "symptoms": "æã«çœ/è¶ã®æ®»ç¶è«", "control": "æ¯ãã©ã·çã§ãããèœãšãã颚éãæ¹åã"},
{"name": "ãã«ã³ãã¢ã°ãªã¬", "symptoms": "èã«çœãã¹ãžç¶é£å®³", "control": "被害èãæ©ãã«é€å»ãæ°æ¢¢æã®èŠåã匷åã"}
],
"harvest": {
"by_region": {
"颿±": [11,12],
"äžéš": [11,12],
"è¿ç¿": [11,12],
"äžåœ": [11,12],
"ååœ": [11,12],
"ä¹å·": [10,11,12],
"æ²çž": [9,10,11]
},
"steps": [
"æç®ãæ©è²ã«ãªããå³èŠããŠé
žãæããã¿ã€ãã³ã°ã§åç©«",
]
},
"notes": [
"å¯é¢šã»åçµã«åŒ±ãâé²é¢šããããæ·ãèãé¢ã¯è»äžãžç§»å",
]
}
]
# ------------------------------------------------------------
# UI æ§ç¯
# ------------------------------------------------------------
st.set_page_config(page_title="æ¥æ¬ã®æ œå¹ã¬ã€ãïŒæå°çïŒ", page_icon="ð±", layout="wide")
st.title("ð± æ¥æ¬ã®æ œå¹ã¬ã€ãïŒæå°ãããã¿ã€ãïŒ")
st.caption("åå¿è
ãäžäººã§è²ãŠãããããšãç®æšã«ãå°åå¥ã®æçš®ã»åç©«ææãæé ãç
害è«ãšæ³šæç¹ããŸãšããŸãããããŒã¿ã¯ç®å®ã§ããåçš®ã»å¹Žæ¬¡ã®æ°è±¡ã§ååŸããŸãã")
# ãµã€ãããŒ
with st.sidebar:
st.header("äœç©æ€çŽ¢")
q = st.text_input("ããŒã¯ãŒãïŒäœç©åã»äœæ¥ãªã©ïŒ", "")
region = st.selectbox("ãäœãŸãã®å°å", REGIONS, index=2) # ããã©ã«ã颿±
ctype = st.multiselect("çš®é¡", ["éè", "æç©"], default=["éè", "æç©"])
# æ€çŽ¢ãã£ã«ã¿
filtered = []
q_lower = q.strip().lower()
for c in CROPS:
if c["type"] not in ctype:
continue
if region not in c["regions"]:
continue
if q_lower:
haystack = json.dumps(c, ensure_ascii=False).lower()
if q_lower not in haystack:
continue
filtered.append(c)
st.subheader("æ€çŽ¢çµæ")
st.write(f"{len(filtered)} ä»¶ãããïŒå°å: {region}ïŒ")
if not filtered:
st.info("æ€çŽ¢æ¡ä»¶ã«äžèŽããäœç©ããããŸãããããŒã¯ãŒããçš®é¡ã調æŽããŠãã ããã")
for crop in filtered:
with st.expander(f"{crop['name']} ã{crop['type']}ã", expanded=False):
colA, colB = st.columns([1, 1])
# åºæ¬æ
å ±
with colA:
st.markdown("### 𧪠åå£ãšæºå")
st.write(f"**pH**: {crop['soil']['ph']}")
st.write(f"**å質**: {crop['soil']['type']}")
if crop['soil'].get('preparation'):
st.write("**æºå**:")
st.markdown("\n".join([f"- {x}" for x in crop['soil']['preparation']]))
st.markdown("### ð çš®ã»èã®å
¥æå
")
st.markdown("\n".join([f"- {x}" for x in crop["seed_sources"]]))
with colB:
st.markdown("### ð€ïž æçš®ã»å®æ€ã®ç®å®ïŒå°åå¥ïŒ")
sow = crop.get("sowing", {})
method = sow.get("method", "")
st.write(f"**æ¹æ³**: {method}")
by_region = sow.get("by_region", {}).get(region, {})
lines = []
for key, months in by_region.items():
label = months_to_label(months)
jp = {
"sow": "æçš®",
"transplant": "宿€",
"plant": "æ€ãä»ãïŒçš®ãã/èïŒ",
"autumn": "ç§æ€ãïŒæå°ïŒ",
}.get(key, key)
lines.append(f"- **{jp}**: {label}")
st.markdown("\n".join(lines) if lines else "â")
if sow.get("steps"):
st.markdown("**æé **:")
st.markdown("\n".join([f"- {x}" for x in sow["steps"]]))
# äœæ¥ãã§ãã¯ãªã¹ã
st.markdown("### ð§ åç©«ãŸã§ã®äœæ¥ãã§ãã¯ãªã¹ã")
if "checkstate" not in st.session_state:
st.session_state.checkstate = {}
key_prefix = f"{crop['name']}|{region}"
tasks = crop.get("tasks", [])
for t in tasks:
key = f"{key_prefix}|{t['order']}"
cur = st.session_state.checkstate.get(key, False)
checked = st.checkbox(
f"{t['order']}. {t['title']}ïŒç®å®: {t['when']}ïŒ\nãæé : {t['steps']}",
value=cur, key=key
)
st.session_state.checkstate[key] = checked
# ç
害è«
st.markdown("### ð¡ïž ç
æ°ã»å®³è«ã»ãã®ä»æ³šæ")
pest_cols = st.columns(2)
for i, p in enumerate(crop.get("pests", [])):
with pest_cols[i % 2]:
st.markdown(f"**{p['name']}**")
st.write(f"çç¶: {p['symptoms']}")
st.write(f"察ç: {p['control']}")
# åç©«
st.markdown("### 𧺠åç©«ã®ç®å®ãšæé ")
hv = crop.get("harvest", {})
hv_months = hv.get("by_region", {}).get(region, [])
st.write(f"**åç©«æïŒ{region}ïŒ**: {months_to_label(hv_months)}")
if hv.get("steps"):
st.markdown("**æé **:")
st.markdown("\n".join([f"- {x}" for x in hv["steps"]]))
# è£è¶³
if crop.get("notes"):
st.markdown("### âïž è£è¶³")
st.markdown("\n".join([f"- {x}" for x in crop["notes"]]))
# ããŠã³ããŒãïŒã¿ã¹ã¯ãªã¹ãïŒ
st.markdown("### â¬ïž ããŠã³ããŒã")
df = tasks_to_df(tasks)
csv = df.to_csv(index=False).encode("utf-8-sig")
st.download_button(
label="äœæ¥ãã§ãã¯ãªã¹ããCSVã§ä¿å",
data=csv,
file_name=f"{crop['name']}_{region}_tasks.csv",
mime="text/csv",
use_container_width=True,
)
# ------------------------------------------------------------
# ããã¿ãŒ
# ------------------------------------------------------------
st.divider()
st.caption(
"ããŒã¿ã¯å®¶åºèååãã®äžè¬çãªç®å®ã§ããå°åã®æ°è±¡ã»åå£ã»åçš®ã§ååŸããŸããå±éºç©ã®å奿£åžæšå¥šã¯è¡ãããç©çã»æ œå¹ç®¡çãåªå
ããæ¹éã§ãã"
)
# TODO: ããŒã¿åé¢çšã®é圢
# with open("crops_ja.sample.json", "w", encoding="utf-8") as f:
# json.dump(CROPS, f, ensure_ascii=False, indent=2)
ã§ããŸãïŒPythonïŒç¹ã« StreamlitïŒãªãããªãã©ã€ã³ã§ã䜿ããâè²ãŠæ¹ã¬ã€ãâã¢ããªãååã«äœããŸãããŸãã¯æå°å®çšã®ãããã¿ã€ããçšæããŸããããµã€ãããŒã§å°åãéžã³ãäœç©ãæ€çŽ¢ â ãåå£ããçš®ã»èã®å ¥æå ããçš®ãŸã/宿€ããåç©«ãŸã§ã®äœæ¥ãã§ãã¯ãªã¹ãããç æ°ã»å®³è«ããåç©«ããŸã§äžéã確èªã§ãããã§ãã¯ãªã¹ãã¯CSVã§ä¿åã§ããŸãã
äžã®ãã£ã³ãã¹ã«ãapp.pyïŒåäžãã¡ã€ã«çïŒãã眮ããŸããããã®ãŸãŸ streamlit run app.py ã§åããŸãã
é²ãæ¹ïŒãã£ããèšèšïŒ
UIïŒStreamlit åäžããŒãž
å°åïŒåæµ·é/æ±å/颿±/äžéš/è¿ç¿/äžåœ/ååœ/ä¹å·/æ²çžïŒ
äœç©æ€çŽ¢ïŒããŒã¯ãŒãã»éè/æç©ïŒ
詳现ããã«ïŒåå£ãå ¥æå ãçš®ãŸã/宿€ïŒå°åå¥ã®æè¡šç€ºïŒæé ïŒãäœæ¥ãã§ãã¯ãç 害è«ãåç©«ãè£è¶³
ããŒã¿èšèšïŒåŸã§JSONåïŒ
{
"name": "ããã",
"type": "éè",
"regions": ["åæµ·é", "..."],
"soil": {"ph":"6.0â6.5","type":"å£å","preparation":[...]},
"seed_sources": ["åèžåº...", "JA...", "ãªã³ã©ã€ã³..."],
"sowing": {
"method":"è²èâ宿€",
"by_region": {"颿±":{"sow":[2,3],"transplant":[4,5]}},
"steps":[...]
},
"tasks":[{"order":1,"title":"æçš®","when":"...","steps":"..."}],
"pests":[{"name":"ãã©ããç
","symptoms":"...","control":"..."}],
"harvest":{"by_region":{"颿±":[6,7,8,9]},"steps":[...]},
"notes":[...]
}3.å®å šæ¹éïŒåå¿è åãã®ãããåºæ¬ã¯**ç©çã»æ œå¹ç®¡çäžå¿ïŒIPMïŒ**ã§èšè¿°ãç¹å®è¬å€ã®å奿šå¥šã¯é¿ããã
4.æ¬¡ã®æ¡åŒµæ¡
ããŒã¿ã crops_ja.json ãžåé¢ïŒä»ã¯ãã¢çšã«ã³ãŒãå ïŒ
ç»åã»å³ïŒæç𮿷±ããæ ªéãåªå®å³ïŒã远å
ããŠãŒã¶ãŒæ œå¹èšé²ãïŒæçš®æ¥å ¥åâçžå¯Ÿé±ã§èªåã¹ã±ãžã¥ãŒã«åããã§ãã¯ä¿åãCSVåºåïŒ
ç 害è«ã®å€å®ãããŒãã£ãŒã
å°å现åïŒéœéåºç or æ°è±¡åºåïŒãšåçš®å¥åŸ®èª¿æŽ
å€èšèªåïŒæ¥æ¬èªâè±èªïŒ
å¿
èŠãªããããªãã®å¥œããªäœç©ãã©ãã©ã远å ããŠãããããã«JSONé圢ãšåé¢çã«ããã察å¿ããŸãã
ããã®äœç©ãå
¥ããŠãããã®çã®åããããªãã ãã©âŠããªã©ãå
·äœçãªãªã¯ãšã¹ããããã°ãããŒã¿ãšUIããã¡ãã§æ¡åŒµããŠãããŸãïŒ
ã§ãå®éã«ãããã¿ã€ããšããŠåºæ¥äžãã£ãã¢ããªããããâ


æã£ã以äžã«è©³ããæžããŠãã£ãŠããã¯ãª(°0°)
ãããã³ãŒãã«ãæžãããŠãããã ãã©ã
ãŸãã¯ãããŒã¿ããŒã¹ãäœã§ã©ãäœãããããããã®çžè«ã®ã€ããã ã£ãã®ã«ãæ°ã¥ãã°å®éã«åãã¢ããªãåºæ¥äžãã£ãŠããŸããŸããã
æ£çŽãChatGPT ããã® Python ããã°ã©ãã³ã°ã¹ãã«ããã»ãã®æ°ãæåãšæ¯ã¹ãŠãé©ãã»ã©é²åããŠããŠããã¯ãª(°0°)
ãããªãäžæãããã°â売ããã¬ãã«âã®ã¢ããªã ã£ãŠäœããŠããŸãããããªããâŠâŠãªããŠæã£ãŠããŸããŸããã
â å®éã« ChatGPT ããã«èããŠã¿ãŸããã
ð ChatGPT-4o ãšæ¯ã¹ãé²åãã€ã³ã
1. ã³ãŒãçæã»ãããã°å
4o ã®ãšãã¯ãããã£ãœããã©åããªãã³ãŒãããåºãŠããŸãããšãå€ããè£ä¿®ãå¿ èŠã§ããã
5 ã§ã¯ãæ§é åïŒã¯ã©ã¹åãèŸæžåïŒãäŸå€åŠçãã³ã¡ã³ãæŽåãªã©ãèªç¶ã«å ¥ãããã«ãªããã¢ããªãšããŠãã䜿ããå®æåºŠãé«ãã
Streamlit ã FastAPIãpandas ãªã© å®çšã©ã€ãã©ãªã®æ±ã粟床ãåäžããŠããŸãã
2. äžè²«æ§ã»æèçè§£
é·ãäŒè©±ã§ããçŽåã§è©±ããå 容ãã以åã®èšèšæ¹éããèŠããŠæŽåæ§ãä¿ã¡ãããã
4o ã§ã¯ããã¡ã€ã«åã倿°åãåæã«å€ãããããšããããããŸãããã5 ã§ã¯ ãŠãŒã¶ãŒãæå®ããã«ãŒã«ãç¶æãããããªã£ãŠããŸãã
3. èªç¶èšèªããã³ãŒãåãŸã§ã®è·é¢ãççž®
ãããããã¢ããªã欲ããããšè©±ããšãã»ãŒå®æåã«è¿ã圢ã峿æ¡ã§ããã
4o ã§ã¯ããŸãé圢 â æ¹å â ä¿®æ£ããšã¹ããããèžãå¿ èŠããããŸãããã5 ã§ã¯æåããåãã¬ãã«ã«è¿ãã
4. æç« çæãšã®ãã€ããªããå
ã³ãŒãã ãã§ãªãããnoteèšäºã«ãããã解説æã«æŽããããšãã£ãæç« åºåãã¹ã ãŒãºã
4o ã ãšãæè¡è§£èª¬ã¯åŸæãæç« ã¯å¥ããšããæãã§ããããä»ã¯ èšäºã»è§£èª¬ã»ã³ãŒããã·ãŒã ã¬ã¹ã«è¡ãæ¥ã§ããŸãã
âïž ãšã¯ããæ³šæç¹
ããŒã¿ãæ°å€ã¯ãŸã èŠç¢ºèªïŒèŸ²æ¥ã®æçš®ã«ã¬ã³ããŒãè¬å€äœ¿çšéãªã©ããªã¢ã«ã®æ£ç¢ºããŒã¿ã¯å¿ ãäºé確èªãå¿ èŠã
å€§èŠæš¡ãããžã§ã¯ãã§ã¯ãŸã 人éã®èšèšåãå¿ é ïŒåºç€ã³ãŒãã¯æžããŠããå šäœèšèšã»æé©åã¯ãšã³ãžãã¢ã®çµéšã匷ã¿ã
âš ãŸãšã
ããªããæããéãã
ãã¢ã€ãã¢çžè« â å®çšã¢ããªã®ãããã¿ã€ãåããŸã§ã®è·é¢ãåçã«çž®ãŸã£ãã®ããChatGPT-4o ãã 5 ãžã®å€§ããªé²åã§ãã

ð¬ããšãã
ç®åœåŠã¢ããªãé²åãããã€ããã§ããChatGPT à Pythonã§ã©ããŸã§ã§ããã®ãããå匷ããªããé²ããã€ãããâŠâŠæ°ã¥ãã°ããããããèªåã¯æç€ºãåºãã ãã§äœã§ãäœããŠããŸãã®ã§ã¯ïŒããšããæèŠã«ãŸã§é¥ã£ãŠããŸããã
AI ã®é²åã£ãŠãæ¬åœã«æ©ãããããæ©ããããæ¯åé©ãããã£ã±ãªãð®
