#python #google-sheets
#python #google-sheets #наука о данных
Вопрос:
Итак, у меня есть этот API Google Sheets, и я собираю из него данные и запускаю тест KS. Однако я хочу запустить тест KS только для числа. Но строка также состоит из слов. Например, здесь вы идете
2020-09-15 00:05:13,chemsense,co,concentration,-0.51058,
2020-09-15 00:05:43,chemsense,co,concentration,-0.75889,
2020-09-15 00:06:09,chemsense,co,concentration,-1.23385,
2020-09-15 00:06:33,chemsense,co,concentration,-1.23191,
2020-09-15 00:06:58,chemsense,co,concentration,-0.94495,
2020-09-15 00:07:23,chemsense,co,concentration,-1.16024,
Если у меня есть это в виде строки, как бы я запустил тест KS только для последних чисел каждой строки. Для instsnace я хочу запустить тест KS только на -.51,- .75,-1.23,-1.23,- .94,-1.16
Вот скриншот моего Google Sheet:
Вот часть моего кода:
from scipy import stats
import numpy as np
import gspread
from oauth2client.service_account import ServiceAccountCredentials
import re
np.seterr(divide='ignore', invalid='ignore')
def estimate_cdf (col,bins=10,):
print (col)
# 'col'
# 'bins'
hist, edges = np.histogram(col)
csum = np.cumsum(hist)
return csum/csum[-1], edges
print (csum)
scope = ["https://spreadsheets.google.com/feeds",'https://www.googleapis.com/auth/spreadsheets',"https://www.googleapis.com/auth/drive.file","https://www.googleapis.com/auth/drive"]
creds = ServiceAccountCredentials.from_json_keyfile_name("creds.json", scope)
client = gspread.authorize(creds)
sheet = client.open("sheet1").sheet1 # Opens the spreadhseet
data = sheet.get_all_records()
row = sheet.row_values(3) # Grab a specific row
number_regex = r'^-?d .?d*$'
col = sheet.col_values(3) # Get a specific column print (col)
col2= sheet.col_values(4)
dolphin= estimate_cdf(adjusted := [float(i) for i in col if re.match(i, number_regex)], len(adjusted))
print(col)
print(col2)
shtest =stats.shapiro(col)
print(shtest)
#thelight= sheet.update_cell(5,6,col)
#print(thelight)
k2test =stats.ks_2samp(col, col2, alternative='two-sided', mode='auto')
print(k2test)
И вот некоторые из моих сообщений об ошибках:
температура,64.79599999999999,65.03830769230765′, ‘2020-09-25 11:38:51, metsense, htu21d, температура,64.85,65.01338461538458’, ‘2020-09-25 11:39:16, metsense, htu21d, температура,64.994,64.99538461538458’, ‘2020-09-25 11:39:42, metsense, htu21d, температура, 65,066,64.98015384615381’, ‘2020-09-25 11:40:06, metsense, htu21d, температура,64.94,64.95799999999996’, ‘2020-09-25 11:40:31, metsense, htu21d, температура,64.976,64.93861538461535’, ‘2020-09-25 11:40:57, metsense, htu21d, температура, 65,066,64,93307692307688’, ‘2020-09-25 11:41:22,metsense, htu21d, температура,65.048,64.93584615384611’, ‘2020-09-25 11:41:48, metsense, htu21d, температура,64.994,64.92753846153843’, ‘2020-09-25 11:42:12, metsense,htu21d, температура,64.976,64.93169230769227’, ‘2020-09-2511:42:37, metsense, htu21d, температура,64.94,64.9441538461538’, ‘2020-09-25 11:43:03, metsense, htu21d, температура,64.994,64.95523076923072’, ‘2020-09-25 11:43:28, metsense, htu21d, температура, 64,9’] Обратная трассировка (последний последний вызов): файл «C:/Users/james/PycharmProjectsfreshproj/shapiro wilks.py «, строка 60, в файле shtest =stats.shapiro(col) «C:UsersjamesPycharmProjectsfreshprojvenvlibsite-packagesscipystatsmorestats .py», строка 1676, в шапиро a, w, pw, ifault = statlib.swilk(y, a[:N //2], init) Ошибка значения: не удалось преобразовать строку в float: ‘,,,,,’
Процесс завершен с кодом выхода 1
Ответ №1:
Проблема
Учитывая строки, поступающие из Google Sheets API, запустите kstest для последнего номера каждой строки.
Решение
Лучшим способом было бы получить числа прямо из Google Sheets API, сохранить их и передать stats.kstest
.
Работа с существующими строками
Вы можете разделить строку с помощью str.split, а затем скрыть ее, чтобы она плавала.
Пример
>>> s = '2020-09-15 00:05:43,chemsense,co,concentration,-0.75889,'
>>> s.split(',')
['2020-09-15 00:05:43', 'chemsense', 'co', 'concentration', '-0.75889', '']
>>> s.split(',')[4] # get the number (5th item in the list)
'-0.75889'
>>> float(s.split(',')[4]) # convert to float type
-0.75889
>>> round(float(s.split(',')[4]), 2) # round to 2 decimal place
-0.76
from scipy import stats
# Assuming strings coming back from API are in a list
str = [
'2020-09-15 00:05:13,chemsense,co,concentration,-0.51058,',
'2020-09-15 00:05:43,chemsense,co,concentration,-0.75889,',
'2020-09-15 00:06:09,chemsense,co,concentration,-1.23385,',
'2020-09-15 00:06:33,chemsense,co,concentration,-1.23191,',
'2020-09-15 00:06:58,chemsense,co,concentration,-0.94495,',
'2020-09-15 00:07:23,chemsense,co,concentration,-1.16024,'
]
x = []
for s in str:
x.append(float(s.split(',')[4]))
stats.kstest(x, 'norm')
Комментарии:
1. Спасибо! одна вещь, однако, строки вполне могут измениться, так есть ли способ сделать это, чтобы он работал для любой строки в Google api?
2. @JamesWatterton Это действительно зависит от того, как будет выглядеть строка. Как я уже сказал, лучшим способом было бы получить числа прямо из Google Sheets API. Является ли ‘2020-09-15 00: 05:13, chemsense, co, концентрация, -0.51058,’ в настоящее время все в одной ячейке Google Sheet?
3. да, вся эта информация находится в одной ячейке. По сути, это одна строка на ячейку, поэтому 2020-09-15 00:05:13, chemsense, co, концентрация, -0.51058 все будут в ячейке
4. Честно говоря, я бы предпочел ваш путь, если это возможно.
5. @JamesWatterton Ваш последующий вопрос недостаточно конкретен. Как будут выглядеть входные данные и каков результат? Строки, которые вы получаете, всегда разделяются запятыми? и т.д. Без указания вопроса я не мог бы предложить ничего, что работает универсально