Как использовать Pandas значения DF в качестве строки в Python, чтобы я мог отправлять ключи в Selenium с точным значением valeu, извлеченным из Pandas DF? - PullRequest
0 голосов
/ 12 февраля 2020

Итак, у меня есть CSV-файл с символом акций и ценами. Я создал webscrapper для взаимодействия с моим «домашним брокером», потому что я пока не знаю, как обращаться с веб-сокетами.

Что я хочу сделать, так это использовать Pandas, чтобы получить Символ и цену из CSV-файл и использовать селен в .sendkeys с символом и ценой на каждой указанной c форме.

Ниже приведен пример вывода df.head (3) из моего CSV.

      Symbol   Price
    0  APPL    319.61
    1  GOOG    1,508.79
    2  AMZN    2,150.80

А вот вход, который я использую для отправки ключей на мой домашний брокер, который я вручную изменяю в коде для каждой акции.

driver.find_element_by_xpath('//*[@id="txtAtivo_BOOK1"]').click()
driver.find_element_by_xpath('//*[@id="txtAtivo_BOOK1"]').send_keys('APPL')
driver.find_element_by_xpath('//*[@id="txtAtivo_BOOK1"]').send_keys(Keys.ENTER)
time.sleep(1)
driver.find_element_by_xpath('//*[@id="txtAssElet_ORDERS1"]').send_keys('319.61')
time.sleep(1)
driver.find_element_by_xpath('//*[@id="DV_barraCompraVende_BOOK1"]/table[3]/tbody/tr/td[3]').click()
time.sleep(10)

Мне нужно заменить .send_keys ('APPL') & .send_keys ('319.61') на некоторые виды .send_keys df.head (0) и l oop ульти я отправляю заказ на покупку для df.head (3)

Есть ли способ сделать это?

Я ценю ваше терпение и заранее благодарю

Ответы [ 3 ]

1 голос
/ 12 февраля 2020

Вы можете l oop через свой DataFrame следующим образом:

import pandas as pd

df = pd.DataFrame(columns=["Symbol","Price"], data=[["APPL",319.61],["GOOG",1508.79],["AMZN",2150.80]])

for index, row in df.iterrows():
    print(index)
    print(row['Symbol'])
    print(row['Price'])

Существуют более быстрые способы, но, поскольку вы уже ограничены операциями с селеном, это на самом деле не имеет значения.

Так что в вашем случае используйте:

for index, row in df.iterrows():
    driver.find_element_by_xpath('//*[@id="txtAtivo_BOOK1"]').click()
    driver.find_element_by_xpath('//*[@id="txtAtivo_BOOK1"]').send_keys(row['Symbol'])
    driver.find_element_by_xpath('//*[@id="txtAtivo_BOOK1"]').send_keys(Keys.ENTER)
    time.sleep(1)
    driver.find_element_by_xpath('//*[@id="txtAssElet_ORDERS1"]').send_keys(row['Price'])
    time.sleep(1)
    driver.find_element_by_xpath('//*[@id="DV_barraCompraVende_BOOK1"]/table[3]/tbody/tr/td[3]').click()
    time.sleep(10)

Я бы также не использовал SendKeys, если это возможно. Попробуйте посмотреть, можете ли вы установить значение напрямую.

1 голос
/ 13 февраля 2020

Если вам просто нужно захватить цены на акции, вы можете сделать это следующим образом.

import datetime
import pandas as pd
import numpy as np
import pylab as pl
import datetime
from sklearn.cluster import AffinityPropagation
from sklearn import metrics
from matplotlib.collections import LineCollection
from pandas_datareader import data as wb
from sklearn import cluster, covariance, manifold


start = '2019-02-01'
end = '2020-02-01'

tickers = ['MMM',
'ABT',
'ABBV',
'ABMD',
'ACN',
'ATVI']

thelen = len(tickers)

price_data = []
for ticker in tickers:
    prices = wb.DataReader(ticker, start = start, end = end, data_source='yahoo')[['Open','Adj Close']]
    price_data.append(prices.assign(ticker=ticker)[['ticker', 'Open', 'Adj Close']])

#names = np.reshape(price_data, (len(price_data), 1))

names = pd.concat(price_data)
names.reset_index()


################################
### OR...for a different layout...

thelen = len(tickers)

price_data = []
for ticker in tickers:
    prices = wb.DataReader(ticker, start = start, end = end, data_source='yahoo')[['Adj Close']]
    price_data.append(prices.assign(ticker=ticker)[['ticker', 'Adj Close']])

df = pd.concat(price_data)
df.dtypes
df.head()
df.shape

pd.set_option('display.max_columns', 500)

df = df.reset_index()
df = df.set_index('Date')
table = df.pivot(columns='ticker')
# By specifying col[1] in below list comprehension
# You can select the stock names under multi-level column
table.columns = [col[1] for col in table.columns]
table.head()
1 голос
/ 12 февраля 2020

Вы можете сделать это так

Symbols = df['Symbol'].tolist()
Prices = df['Price'].tolist()
for Symbol,Price in zip (Symbols,Prices):
    driver.find_element_by_xpath('//*[@id="txtAtivo_BOOK1"]').click()
    driver.find_element_by_xpath('//*[@id="txtAtivo_BOOK1"]').send_keys(Symbol)
    driver.find_element_by_xpath('//*[@id="txtAtivo_BOOK1"]').send_keys(Keys.ENTER)
    time.sleep(1)
    driver.find_element_by_xpath('//*[@id="txtAssElet_ORDERS1"]').send_keys(Price)
    time.sleep(1)
    driver.find_element_by_xpath('//*[@id="DV_barraCompraVende_BOOK1"]/table[3]/tbody/tr/td[3]').click()
    time.sleep(10)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...