Скинь задачу или кусок кода — агент напишет рабочий Python-скрипт, объяснит логику и исправит ошибки
import pandas as pd
import numpy as np
df = pd.read_csv('sales.csv', parse_dates=['date'])
df['revenue'] = df['quantity'] * df['price']
# Топ-20 по выручке
top20 = (df.groupby(['product_id', 'product_name'])['revenue']
.sum().reset_index()
.sort_values('revenue', ascending=False)
.head(20))
# Помесячная динамика
monthly = (df.groupby(df['date'].dt.to_period('M'))['revenue']
.sum().reset_index())
# Аномалии: дни > mean + 3*std
daily = df.groupby('date')['revenue'].sum().reset_index()
mean, std = daily['revenue'].mean(), daily['revenue'].std()
anomalies = daily[daily['revenue'] > mean + 3 * std]
print(f"Топ-20:\n{top20.to_string()}")
print(f"\nАномальные дни ({len(anomalies)}):\n{anomalies}")import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# ... (загрузка и расчёты как выше)
# Хитмап: регионы × месяцы
pivot = df.pivot_table(
values='revenue', index='region',
columns=df['date'].dt.month, aggfunc='sum'
)
pivot.columns = ['Янв','Фев','Мар','Апр','Май','Июн',
'Июл','Авг','Сен','Окт','Ноя','Дек']
plt.figure(figsize=(14, 8))
sns.heatmap(pivot / 1e6, annot=True, fmt='.1f',
cmap='YlOrRd', linewidths=0.5)
plt.title('Выручка по регионам и месяцам, млн ₽')
plt.savefig('heatmap.png', dpi=150, bbox_inches='tight')
# Excel с 3 листами
with pd.ExcelWriter('analysis.xlsx', engine='openpyxl') as w:
top20.to_excel(w, sheet_name='Топ-20', index=False)
monthly.to_excel(w, sheet_name='По месяцам', index=False)
anomalies.to_excel(w, sheet_name='Аномалии', index=False)analysis.xlsx и heatmap.png появятся в текущей папке.from fastapi import FastAPI, Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from sqlalchemy.orm import Session
from jose import JWTError, jwt
from passlib.context import CryptContext
from datetime import datetime, timedelta
SECRET_KEY = "your-secret" # из env в проде
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30
pwd_context = CryptContext(schemes=["bcrypt"])
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/auth/login")
app = FastAPI()
def create_access_token(data: dict):
expire = datetime.utcnow() + timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
return jwt.encode({**data, "exp": expire}, SECRET_KEY, ALGORITHM)
@app.post("/auth/register")
def register(email: str, password: str, db: Session = Depends(get_db)):
if db.query(User).filter(User.email == email).first():
raise HTTPException(400, "Email already registered")
user = User(email=email, hashed_password=pwd_context.hash(password))
db.add(user); db.commit()
return {"message": "Registered"}
@app.post("/auth/login")
def login(form: OAuth2PasswordRequestForm = Depends(), db=Depends(get_db)):
user = db.query(User).filter(User.email == form.username).first()
if not user or not pwd_context.verify(form.password, user.hashed_password):
raise HTTPException(401, "Invalid credentials")
token = create_access_token({"sub": str(user.id)})
return {"access_token": token, "token_type": "bearer"}
@app.get("/me")
def get_me(token: str = Depends(oauth2_scheme), db=Depends(get_db)):
try:
payload = jwt.decode(token, SECRET_KEY, [ALGORITHM])
user = db.get(User, int(payload["sub"]))
except JWTError:
raise HTTPException(401, "Invalid token")
return {"id": user.id, "email": user.email}from sqlalchemy import create_engine, Column, Integer, String, DateTime
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
DATABASE_URL = "postgresql://user:pass@localhost/dbname"
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(bind=engine)
Base = declarative_base()
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True)
email = Column(String, unique=True, nullable=False)
hashed_password = Column(String, nullable=False)
refresh_token = Column(String, nullable=True)
created_at = Column(DateTime, default=datetime.utcnow)
Base.metadata.create_all(engine)
def get_db():
db = SessionLocal()
try: yield db
finally: db.close()@app.post("/auth/refresh")
def refresh(refresh_token: str, db=Depends(get_db)):
user = db.query(User).filter(User.refresh_token == refresh_token).first()
if not user:
raise HTTPException(401, "Invalid refresh token")
new_access = create_access_token({"sub": str(user.id)})
return {"access_token": new_access}from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pandas as pd, time
options = webdriver.ChromeOptions()
options.add_argument("--headless")
options.add_argument("--no-sandbox")
driver = webdriver.Chrome(options=options)
wait = WebDriverWait(driver, 10)
results = []
page = 1
while True:
url = f"https://market-example.ru/catalog/phones?page={page}"
driver.get(url)
time.sleep(1.5) # вежливая пауза
items = driver.find_elements(By.CSS_SELECTOR, ".product-card")
if not items:
break
for item in items:
try:
name = item.find_element(By.CSS_SELECTOR, ".product-title").text
price = item.find_element(By.CSS_SELECTOR, ".product-price").text
results.append({"name": name, "price": price, "page": page})
except Exception:
continue
# Проверка следующей страницы
try:
next_btn = driver.find_element(By.CSS_SELECTOR, ".pagination-next")
if "disabled" in next_btn.get_attribute("class"):
break
page += 1
except Exception:
break
driver.quit()
df = pd.DataFrame(results)
df.to_csv(f"prices_{pd.Timestamp.now().date()}.csv", index=False)
print(f"Собрано {len(df)} товаров").product-cardimport logging
logging.basicConfig(filename='parser.log', level=logging.WARNING)
# Внутри цикла, перед парсингом элементов:
page_source = driver.page_source
captcha_signals = ["captcha", "robot", "verify you are human", "cloudflare"]
if any(s in page_source.lower() for s in captcha_signals):
logging.warning(f"CAPTCHA на странице {page}, пропускаю")
page += 1
time.sleep(10) # подождать дольше
continueparser.log — там все пропущенные страницы.7 дней без ограничений. Настройка за 3 минуты — бот уже ждёт в Telegram.
Попробовать за 490 ₽ — 7 дней ← ИИ агент для программиста