Python Google Sheets API

#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 Ваш последующий вопрос недостаточно конкретен. Как будут выглядеть входные данные и каков результат? Строки, которые вы получаете, всегда разделяются запятыми? и т.д. Без указания вопроса я не мог бы предложить ничего, что работает универсально