Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2020, 00:39   #1
Solver`s
Пользователь
 
Регистрация: 03.12.2016
Сообщений: 25
Вопрос Работа с таблицей excel в Pandas DataFrame.

Добрый день.
Проблема в следующем. Есть таблица с стандартными размерами для цилиндрических штифтов(картинка во вложении).
Эту таблицу я экспортирую в проект и использую в библиотеке Pandas DataFrame.
Код:
Dimensions_data = pd.read_excel('Pinned connection standard parameters.xlsx')
Как, используя индекс (к примеру, d), вывести все значения из одной строки?
Я для этого использовал следующий код:
Код:
diameter_list = Dimensions_data.columns
, но мне кажется это издевательство.
Затем, мне нужно из полученной строки выбрать ближайшее БОЛЬШЕЕ значение параметра.
Я делаю это следующим образом:
Код:
# нахождение ближайшего стандратного значения диаметра штифта.
def nearest(lst, target):
    return min(lst, key=lambda x: abs(x-target))
Dp_s = nearest(diameter_list, Dp)# ближайшее стандратное значение диаметра штифта. Dp - расчетное значение диаметра.
,но этот код находит только ближайшее значение, а не большее ближайшее.

И наконец последний вопрос. Как мне используя полученное стандартное значение диаметра вывести соответствующие значения "с" и "а"; а также вывести на экран список значений "L", предложить пользователю выбрать подходящее значение и запомнить его выбор?

Помогите, пожалуйста. Заранее спасибо.
Изображения
Тип файла: png Безымянный.png (25.8 Кб, 29 просмотров)
Solver`s вне форума Ответить с цитированием
Старый 31.03.2020, 19:09   #2
phaggi
Пользователь
 
Регистрация: 08.03.2020
Сообщений: 24
По умолчанию

Solver`s, я бы попробовал использовать для вывода значений из строки такую конструкцию:
Код:
arr = Dimensions_data[Dimensions_data['A'] == 'd'].values
print(arr[0].max())

Последний раз редактировалось phaggi; 31.03.2020 в 19:18.
phaggi вне форума Ответить с цитированием
Старый 31.03.2020, 19:13   #3
phaggi
Пользователь
 
Регистрация: 08.03.2020
Сообщений: 24
По умолчанию

дубль

Последний раз редактировалось phaggi; 31.03.2020 в 19:45.
phaggi вне форума Ответить с цитированием
Старый 01.04.2020, 18:22   #4
Solver`s
Пользователь
 
Регистрация: 03.12.2016
Сообщений: 25
По умолчанию

phaggi, не работает. 'A', это лишь обозначение столбца в экселе. Программе его не видно.
Вот код:
Код:
%typeset_mode True
import math
import scipy
import matplotlib
import pandas as pd
from scipy import integrate, optimize, interpolate
%var Sg, ShearStress, c, a, d
print("Номера соответствующие маркам стали."'\n'"1=02"'\n'"2=03"'\n'"3=08"'\n'"4=15"'\n'"5=25"'\n'"6=45"'\n'"7=10G2"'\n'"8=50X"'\n')
while True:
    try:
        Sg = int(raw_input("Введите номер, соответствующий марке стали.")) #Steel grade
        break
    except ValueError:
        print ("Вы должны ввести число!")
if Sg == 1:
    ShearStress = 70 #Допустимые напряжения сдвига. (MPa)
elif Sg == 2:
    ShearStress = 75
elif Sg == 3:
    ShearStress = 80
elif Sg == 4:
    ShearStress = 95
elif Sg == 5:
    ShearStress = 110
elif Sg == 6:
    ShearStress = 150
elif Sg == 7:
    ShearStress = 85
elif Sg == 8:
    ShearStress = 300 #Для термообработки М48.
else:
    print("Диаметр вала выходит за стандартные размеры для шпоночного соединения.")
    raw_input("Для выхода нажмите любую клавишу.")
    exit()
while True:
    try:
        F = int(raw_input("Введите значение силы, приложенной к детали."))
        break
    except ValueError:
        print ("Вы должны ввести число!")

Dp = sqrt((4*F)/(math.pi*ShearStress)) #Диаметр шпонки. мм
print("Pin diameter = " + str(Dp) + " (mm)")
ShStr = (4*F)/(math.pi*(Dp^2)) #Прочность на сдвиг
print ("Прочность шпонки на сдвиг  = " + str(ShStr)+ " (MPa)")
Cutting_area = (math.pi*(Dp^2))/4
print ("Площадь среза = " +str(Cutting_area)+ " (мм^2)")
print("Номер, соответствующий типу штифта."'\n'"1=Цилиндрический штифт"'\n'"2=Цилиндрический штифт с закруглением."'\n'"3=Цилиндрический штифт с уклоном"'\n')

Dimensions_data = pd.read_excel('Pinned connection standard parameters.xlsx') # Диаметр и длина штифта, а также длина скругления и уклон.

Dimensions_data.set_index('d', inplace=True) # перемещаем индексы
print (Dimensions_data)#
diameter_list = Dimensions_data.columns
print(diameter_list)
# нахождение ближайшего стандратного значения диаметра штифта.
def nearest(lst, target):
    return min(lst, key=lambda x: abs(x-target))
Dp_s = nearest(diameter_list, Dp)# ближайшее стандратное значение диаметра штифта. Dp - расчетное значение диаметра.
print(Dp_s)# вывод значения
.
Возможно, так понятней будет.
На картинках можно увидеть, что выдает программа.
Изображения
Тип файла: png Безымянный.png (29.2 Кб, 24 просмотров)
Тип файла: png Безымянный 2.png (41.9 Кб, 24 просмотров)
Solver`s вне форума Ответить с цитированием
Старый 02.04.2020, 23:18   #5
phaggi
Пользователь
 
Регистрация: 08.03.2020
Сообщений: 24
По умолчанию

удалено, напишу позже более правильную версию

Последний раз редактировалось phaggi; 02.04.2020 в 23:27.
phaggi вне форума Ответить с цитированием
Старый 03.04.2020, 23:53   #6
phaggi
Пользователь
 
Регистрация: 08.03.2020
Сообщений: 24
По умолчанию

Значится, так:
  1. Самое первое: никогда не давайте исходные данные как картинку; мало кто захочет это переводить в цифры. Что вам стоило прикрепить xlsx с какими-нибудь более-менее подходящими цифрами?
  2. замучился я с вашей программой, там почему-то используются raw_input() вместо просто input(), Dp^2 вместо просто Dp * Dp, и к тому же эта дурацкая lambda, из-за которой надо выворачивать мозг наизнанку.
  3. вывод содержимого Dimensions_data можно осуществлять как:
    Код:
    print(diameter_list.values)
    будет вывод просто в виде:
    Код:
    [2 2.5 3 4 5 6 8 10]
    (цифры от балды)
  4. накропал функцию, как сам понял, чтобы выбирать из полученного Dimensions_data ближайшее бОльшее значение. Оно выглядит безобразно, но зато понятно и выдает результат.
Код:
def nearest(lst, target):
    for i in range(len(lst)):
        if target <= lst[0]:
            result = lst[0]
        elif lst[i-1] < target <= lst[i]:
            result = lst[i]
        else:
            result = None
        return result
Тут кстати надо внимательно посмотреть на <= и подумать, может там должно быть просто <. Но тогда точно попавшие значения будут теряться...
И непременно надо после этого еще проверять, что если функция выдала None, значит значение вышло за максимум и надо наверно что-то менять во входных данных, чтобы вернуться в диапазон. Ну, я так понял логику программы, что оно как-то так должно быть.

Последний раз редактировалось phaggi; 03.04.2020 в 23:57.
phaggi вне форума Ответить с цитированием
Старый 03.04.2020, 23:59   #7
phaggi
Пользователь
 
Регистрация: 08.03.2020
Сообщений: 24
По умолчанию

Что касается последнего вопроса, я до него еще не дошел, если предыдущее предложение годится - будем думать дальше.
phaggi вне форума Ответить с цитированием
Старый 04.04.2020, 09:14   #8
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от phaggi Посмотреть сообщение
там почему-то используются raw_input() вместо просто input()
Вот и выросли люди, которые не знают, чем второй питон отличается от третьего..
Black Fregat вне форума Ответить с цитированием
Старый 04.04.2020, 09:21   #9
phaggi
Пользователь
 
Регистрация: 08.03.2020
Сообщений: 24
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Вот и выросли люди, которые не знают, чем второй питон отличается от третьего..
Э... ну, во-первых, Вы совершенно правы, я не знаю второй python от слова совсем. И, пока не припрет (ну, скажем, пока не свалится на меня гора легаси кода во втором), я и не сунусь туда.

Во-вторых, я когда разбирался, че за raw_input, тупо не прочёл текст выше, а там было сказано, в какой версии оно было переименовано. Поленился. Тут-то меня на этом и поймали...

Ну, и в-третьих, по сути можете ченьть сказать? Сильно я напортачил?
phaggi вне форума Ответить с цитированием
Старый 06.04.2020, 19:37   #10
Solver`s
Пользователь
 
Регистрация: 03.12.2016
Сообщений: 25
По умолчанию

phaggi, большое спасибо за ответ.
1) Согласен, что-то я не подумал насчет таблицы. Впредь буду избегать такого.
2) Что плохого в использовании возведения в степень таким способом: Dp^2? Да и насчет lambda функции хотелось бы узнать, чем она плоха.
4) У мена написанная Вами функция почему-то всегда выдает значение None, кроме случая когда расчетное значение меньше первого значения в списке.
Я думал, что проблема в остальной части программы и создал новый файл со следующим кодом:
Код:
list1 = [1,3,5,8]
A = 1.2
def nearest(lst, target):
    for i in range(len(lst)):
        if target <= lst[0]:
            result = lst[0]
        if lst[i-1] < target <= lst[i]:
            result = lst[i]
        else:
            result = None
        return result
D = nearest(list1, A)
print(D)
, но функция всё еще выдаёт None и я не понимаю почему.

P.S. На всякий случай кидаю excel таблицу с данными.
Вложения
Тип файла: xlsx Pinned connection standard parameters.xlsx (10.5 Кб, 0 просмотров)
Solver`s вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача со сводной таблицей в Excel dass1 Помощь студентам 0 05.12.2016 20:20
Связывание данных *.ldf и *.mdf из таблицей Excel 2003 bygaga Microsoft Office Excel 5 11.11.2011 03:11
Excel формулы и действия с таблицей lilia01 Microsoft Office Excel 1 02.07.2011 17:14
Delphi - работа с Excel таблицей Zhamie Общие вопросы Delphi 3 29.07.2009 13:59
Как синхронизировать таблицу в excel с таблицей на сайте. ru3000 Microsoft Office Excel 4 21.07.2009 00:45