File size: 4,950 Bytes
71acbaf
ca7840e
ea57447
c1f4f65
ea57447
8544e42
ea57447
f3fb038
8544e42
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c1f4f65
8544e42
 
 
 
 
 
 
 
c1f4f65
8544e42
ea57447
8544e42
f3fb038
 
 
 
ea57447
71acbaf
ea57447
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8544e42
 
ea57447
 
 
 
b8de2f4
ea57447
 
6d0b640
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
import streamlit as st
from PIL import Image
import pytesseract
import pandas as pd
import requests
from textblob import TextBlob
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
import talib  # Análisis técnico

# Función para búsqueda web
def search_web(query):
    from googlesearch import search
    st.subheader("Resultados de la Búsqueda Web")
    results = []
    for result in search(query, num_results=5):
        results.append(result)
    for idx, link in enumerate(results):
        st.write(f"{idx + 1}. {link}")

# Función para análisis de imágenes
def analyze_image(uploaded_file):
    st.subheader("Análisis de Imagen")
    image = Image.open(uploaded_file)
    st.image(image, caption="Imagen cargada", use_column_width=True)
    text = pytesseract.image_to_string(image)
    st.write("Texto extraído de la imagen:")
    st.write(text)
    sentiment = analyze_sentiment(text)
    st.write(f"Análisis de sentimiento del texto extraído: {sentiment}")

# Función para análisis técnico
def analyze_crypto_data(df):
    st.subheader("Análisis Técnico")
    try:
        # RSI
        df['RSI'] = talib.RSI(df['close'], timeperiod=14)
        
        # MACD
        macd, macd_signal, macd_hist = talib.MACD(
            df['close'], fastperiod=12, slowperiod=26, signalperiod=9
        )
        df['MACD'] = macd
        df['MACD_signal'] = macd_signal
        df['MACD_hist'] = macd_hist
        
        # Bandas de Bollinger
        upper, middle, lower = talib.BBANDS(
            df['close'], timeperiod=20, nbdevup=2, nbdevdn=2, matype=0
        )
        df['BB_Upper'] = upper
        df['BB_Mid'] = middle
        df['BB_Lower'] = lower
        
        st.write("Últimos 10 datos de análisis técnico:")
        st.write(df.tail(10))
    except Exception as e:
        st.error(f"Error en el análisis técnico: {e}")

# Función para análisis de sentimiento
def analyze_sentiment(text):
    analysis = TextBlob(text)
    sentiment = analysis.sentiment.polarity
    if sentiment > 0:
        return "Positivo"
    elif sentiment < 0:
        return "Negativo"
    else:
        return "Neutral"

# Función para predicción de precios
def predict_prices(df):
    st.subheader("Predicción de Precios")
    try:
        X = df.index.values.reshape(-1, 1)
        y = df['close']
        model = LinearRegression()
        model.fit(X, y)

        future = pd.DataFrame({"Index": range(len(df), len(df) + 5)})
        predictions = model.predict(future['Index'].values.reshape(-1, 1))
        st.write("Predicciones de precios futuros:")
        for i, pred in enumerate(predictions):
            st.write(f"Día {len(df) + i + 1}: {pred:.2f} USD")
    except Exception as e:
        st.error(f"Error al realizar la predicción: {e}")

# Función para obtener datos de criptomonedas
def fetch_crypto_data():
    url = "https://api.coingecko.com/api/v3/coins/bitcoin/market_chart?vs_currency=usd&days=30&interval=daily"
    response = requests.get(url)
    if response.status_code == 200:
        data = response.json()
        prices = [item[1] for item in data['prices']]
        df = pd.DataFrame(prices, columns=['close'])
        return df
    else:
        st.error("Error al obtener datos de criptomonedas.")
        return None

# Interfaz del chat
def chat_interface():
    st.header("Chat Interactivo")
    user_input = st.text_input("Escribe tu mensaje aquí:")
    if user_input:
        st.write(f"Tú: {user_input}")
        response = f"No estoy entrenado como ChatGPT, pero aquí estoy para ayudarte. Tú dijiste: {user_input}"
        st.write(f"Chatbot: {response}")

# Función principal de la aplicación
def main():
    st.title("Aplicación de Criptomonedas")
    menu = [
        "Chat", "Búsqueda Web", "Análisis de Imágenes", 
        "Análisis Técnico", "Análisis de Sentimiento", "Predicción de Precios"
    ]
    choice = st.sidebar.selectbox("Seleccione una opción", menu)

    if choice == "Chat":
        chat_interface()
    elif choice == "Búsqueda Web":
        query = st.text_input("Ingrese su búsqueda:")
        if query:
            search_web(query)
    elif choice == "Análisis de Imágenes":
        uploaded_file = st.file_uploader("Suba una imagen", type=["png", "jpg", "jpeg"])
        if uploaded_file:
            analyze_image(uploaded_file)
    elif choice == "Análisis Técnico":
        df = fetch_crypto_data()
        if df is not None:
            analyze_crypto_data(df)
    elif choice == "Análisis de Sentimiento":
        text = st.text_area("Ingrese el texto para analizar:")
        if text:
            sentiment = analyze_sentiment(text)
            st.write(f"El sentimiento del texto es: {sentiment}")
    elif choice == "Predicción de Precios":
        df = fetch_crypto_data()
        if df is not None:
            predict_prices(df)

if __name__ == "__main__":
    main()