Додаткові матеріали
Additional Materials
Код простого Машинного Навчання моделі
Code for a Simple Machine Learning Model
import pandas as pd
import numpy as np
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
from xgboost import XGBRegressor
import joblib
# Крок 1: Завантаження даних
data = pd.read_csv('steem_usdt_data.csv')
# Очищення даних
data.columns = data.columns.str.strip() # Видалення пробілів з назв стовпців
data['Date'] = pd.to_datetime(data['Date'], errors='coerce') # Перетворення дати у формат datetime
# Перетворення цін у числовий формат
columns_to_convert = ['Open', 'High', 'Low', 'Avg', 'Close', 'Chg', 'Volume', 'Vol Chg', 'Market Cap', 'MCap Chg']
for column in columns_to_convert:
data[column] = data[column].replace({r'\$': '', ',': ''}, regex=True) # Видалення символів
data[column] = pd.to_numeric(data[column], errors='coerce') # Перетворення в числовий формат
# Заповнення пропущених значень середнім
for column in columns_to_convert:
data[column] = data[column].fillna(data[column].mean()) # Зміна без inplace=True
# Перевірка типів даних
print(data.dtypes)
# Створення нових ознак
data['Volume_to_MarketCap'] = data['Volume'] / data['Market Cap'] # Ділення
data['Price_Change_Percent'] = (data['Chg'] / data['Open']) * 100 # Ділення
# Перевірка наявності пропущених значень
print(data.isnull().sum())
# Крок 2: Розділення даних на навчальну та тестову вибірки
split_date = '2024-11-01' # Задайте дату для розділення
train_data = data[data['Date'] < split_date]
test_data = data[data['Date'] >= split_date]
# Вибір ознак та цільової змінної
X_train = train_data[['Open', 'High', 'Low', 'Avg', 'Chg', 'Volume', 'Vol Chg', 'Market Cap', 'MCap Chg', 'Volume_to_MarketCap', 'Price_Change_Percent']]
y_train = train_data['Close']
X_test = test_data[['Open', 'High', 'Low', 'Avg', 'Chg', 'Volume', 'Vol Chg', 'Market Cap', 'MCap Chg', 'Volume_to_MarketCap', 'Price_Change_Percent']]
y_test = test_data['Close']
# Крок 3: Масштабування даних
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# Крок 4: Тренування моделі
model = XGBRegressor(n_estimators=100, random_state=42)
model.fit(X_train_scaled, y_train)
# Крок 5: Прогнозування на тестових даних
y_pred = model.predict(X_test_scaled)
# Крок 6: Оцінка моделі
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f'Mean Squared Error: {mse:.2f}')
print(f'R^2 Score: {r2:.2f}')
# Крок 7: Візуалізація результатів
plt.figure(figsize=(10, 6))
plt.plot(test_data['Date'], y_test, color='orange', label='Actual Prices', marker='o') # Фактичні ціни
plt.plot(test_data['Date'], y_pred, color='blue', label='Predicted Prices', marker='o') # Прогнозовані ціни
plt.plot([test_data['Date'].min(), test_data['Date'].max()], [y_test.min(), y_test.max()], 'k--', lw=2, label='Ideal Prediction') # Лінія для ідеальних прогнозів
# Додавання місяців на графік
for i in range(len(y_test)):
plt.annotate(test_data['Date'].iloc[i].strftime('%Y-%m'), (test_data['Date'].iloc[i], y_test.iloc[i]), textcoords="offset points", xytext=(0,10), ha='center', fontsize=8)
plt.title('Actual vs Predicted Prices')
plt.xlabel('Date')
plt.ylabel('Price (USDT)')
plt.legend()
plt.grid()
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
# Крок 8: Збереження моделі
joblib.dump(model, 'xgb_model.pkl')
Код аналізу настроїв із steem
Code for Sentiment Analysis with Steem
import requests
import nltk
from nltk.sentiment import SentimentIntensityAnalyzer
# Завантажте лексикон VADER
nltk.download('vader_lexicon')
# Ініціалізуйте аналізатор настрою
sia = SentimentIntensityAnalyzer()
# Функція для отримання дописів з Steemit
def get_steemit_posts_with_keywords(keywords=['steem'], limit=10):
url = 'https://api.steemit.com'
posts = []
for keyword in keywords:
query = {
"jsonrpc": "2.0",
"method": "condenser_api.get_discussions_by_created",
"params": [{
"tag": keyword.lower(), # Використовуємо нижній регістр для тегу
"limit": limit
}],
"id": 1
}
response = requests.post(url, json=query)
posts.extend(response.json().get('result', []))
return posts
# Функція для аналізу настрою дописів
def analyze_posts(posts):
total_sentiment = {'neg': 0, 'neu': 0, 'pos': 0, 'compound': 0}
count = 0
for post in posts:
title = post['title']
body = post['body']
content = f"{title} {body}"
# Аналіз настрою
sentiment_scores = sia.polarity_scores(content)
print(f"Title: {title}")
print(f"Sentiment Scores: {sentiment_scores}")
print('-' * 40)
# Додаємо результати до загального підрахунку
total_sentiment['neg'] += sentiment_scores['neg']
total_sentiment['neu'] += sentiment_scores['neu']
total_sentiment['pos'] += sentiment_scores['pos']
total_sentiment['compound'] += sentiment_scores['compound']
count += 1
# Обчислюємо середні значення
if count > 0:
average_sentiment = {key: value / count for key, value in total_sentiment.items()}
print("Average Sentiment Scores:")
print(average_sentiment)
else:
print("No posts to analyze.")
# Визначте ключові слова для пошуку
keywords = ['steem', 'STEEM', '#steem']
# Отримайте дописи, що містять ключові слова, та проаналізуйте їх
posts = get_steemit_posts_with_keywords(keywords=keywords, limit=5)
analyze_posts(posts)
Із Streamlit щоб взаємодіяти у браузері.
With Streamlit, you can interact in the browser.
import requests
import pandas as pd
import numpy as np
import nltk
import streamlit as st
import matplotlib.pyplot as plt
from nltk.sentiment import SentimentIntensityAnalyzer
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.preprocessing import StandardScaler
from xgboost import XGBRegressor
import joblib
# Завантажте лексикон VADER
nltk.download('vader_lexicon')
# Ініціалізуйте аналізатор настрою
sia = SentimentIntensityAnalyzer()
# Функція для отримання дописів з Steemit
def get_steemit_posts_with_keywords(keywords=['steem'], limit=10):
url = 'https://api.steemit.com'
posts = []
for keyword in keywords:
query = {
"jsonrpc": "2.0",
"method": "condenser_api.get_discussions_by_created",
"params": [{
"tag": keyword.lower(),
"limit": limit
}],
"id": 1
}
response = requests.post(url, json=query)
posts.extend(response.json().get('result', []))
return posts
# Функція для аналізу настрою дописів
def analyze_posts(posts):
results = []
for post in posts:
title = post['title']
body = post['body']
content = f"{title} {body}"
# Аналіз настрою
sentiment_scores = sia.polarity_scores(content)
results.append({
'title': title,
'neg': sentiment_scores['neg'],
'neu': sentiment_scores['neu'],
'pos': sentiment_scores['pos'],
'compound': sentiment_scores['compound']
})
return pd.DataFrame(results)
# Функція для навчання моделі
def train_model(data):
# Очищення даних
data.columns = data.columns.str.strip() # Видалення пробілів з назв стовпців
data['Date'] = pd.to_datetime(data['Date'], errors='coerce') # Перетворення дати у формат datetime
# Перетворення цін у числовий формат
columns_to_convert = ['Open', 'High', 'Low', 'Avg', 'Close', 'Chg', 'Volume', 'Vol Chg', 'Market Cap', 'MCap Chg']
for column in columns_to_convert:
data[column] = data[column].replace({r'\$': '', ',': ''}, regex=True) # Видалення символів
data[column] = pd.to_numeric(data[column], errors='coerce') # Перетворення в числовий формат
# Заповнення пропущених значень середнім
for column in columns_to_convert:
data[column] = data[column].fillna(data[column].mean())
# Створення нових ознак
data['Volume_to_MarketCap'] = data['Volume'] / data['Market Cap']
data['Price_Change_Percent'] = (data['Chg'] / data['Open']) * 100
# Розділення даних на навчальну та тестову вибірки
split_date = '2024-11-01'
train_data = data[data['Date'] < split_date]
test_data = data[data['Date'] >= split_date]
# Вибір ознак та цільової змінної
X_train = train_data[['Open', 'High', 'Low', 'Avg', 'Chg', 'Volume', 'Vol Chg', 'Market Cap', 'MCap Chg', 'Volume_to_MarketCap', 'Price_Change_Percent']]
y_train = train_data['Close']
X_test = test_data[['Open', 'High', 'Low', 'Avg', 'Chg', 'Volume', 'Vol Chg', 'Market Cap', 'MCap Chg', 'Volume_to_MarketCap', 'Price_Change_Percent']]
y_test = test_data['Close']
# Масштабування даних
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# Тренування моделі
model = XGBRegressor(n_estimators=100, random_state=42)
model.fit(X_train_scaled, y_train)
# Прогнозування на тестових даних
y_pred = model.predict(X_test_scaled)
# Оцінка моделі
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
return model, test_data, y_test, y_pred, mse, r2
# Streamlit UI
st.title("Аналіз настрою та прогнозування цін STEEM")
# Введіть ключові слова для аналізу настрою
keywords = st.text_input("Введіть ключові слова (через кому)", "steem, STEEM, #steem")
keywords = [kw.strip() for kw in keywords.split(',')]
# Кнопка для запуску аналізу настрою
if st.button("Аналізувати дописи"):
posts = get_steemit_posts_with_keywords(keywords=keywords, limit=5)
if posts:
sentiment_df = analyze_posts(posts)
# Виведення результатів аналізу настрою
st.write("Результати аналізу настрою:")
st.dataframe(sentiment_df)
# Візуалізація настрою
st.subheader("Візуалізація настрою")
sentiment_df.set_index('title')[['neg', 'neu', 'pos', 'compound']].plot(kind='bar', figsize=(10, 5))
plt.title("Аналіз настрою дописів")
plt.xlabel("Дописи")
plt.ylabel("Оцінки настрою")
st.pyplot(plt)
else:
st.write("Не знайдено дописів для аналізу.")
# Завантаження даних для моделі
data_file = st.file_uploader("Завантажте CSV файл з даними STEEM", type=["csv"])
if data_file is not None:
data = pd.read_csv(data_file)
# Кнопка для запуску навчання моделі
if st.button("Навчити модель"):
model, test_data, y_test, y_pred, mse, r2 = train_model(data)
# Виведення результатів моделі
st.write(f'Mean Squared Error: {mse:.2f}')
st.write(f'R^2 Score: {r2:.2f}')
# Візуалізація результатів
plt.figure(figsize=(10, 6))
plt.plot(test_data['Date'], y_test, color='orange', label='Actual Prices', marker='o') # Фактичні ціни
plt.plot(test_data['Date'], y_pred, color='blue', label='Predicted Prices', marker='o') # Прогнозовані ціни
plt.plot([test_data['Date'].min(), test_data['Date'].max()], [y_test.min(), y_test.max()], 'k--', lw=2, label='Ideal Prediction') # Лінія для ідеальних прогнозів
# Додавання місяців на графік
for i in range(len(y_test)):
plt.annotate(test_data['Date'].iloc[i].strftime('%Y-%m'), (test_data['Date'].iloc[i], y_test.iloc[i]), textcoords="offset points", xytext=(0,10), ha='center', fontsize=8)
plt.title('Actual vs Predicted Prices')
plt.xlabel('Date')
plt.ylabel('Price (USDT)')
plt.legend()
plt.grid()
plt.xticks(rotation=45)
plt.tight_layout()
st.pyplot(plt)
# Збереження моделі
joblib.dump(model, 'xgb_model.pkl')
st.write("Модель збережена як 'xgb_model.pkl'")